Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Работа cURL

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
event
Отправлено: 23 Января, 2015 - 03:06:25
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 542
Дата рег-ции: Май 2011  


Помог: 0 раз(а)




Ситуация такая, написал парсер, работает, нужно спарсит ним более миллиона статей, скрипт работает через curl, но медленно, примерно 1 сек/одная спарсеная статья.

Есть идеи как ускорить этот curl?

Скрипт парсера:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3.  
  4. function get_row_count($table, $suffix = "") {
  5.         global $mysqli;
  6. if ($suffix)
  7.         $suffix = " $suffix";
  8.         ($r = $mysqli->query("SELECT COUNT(*) FROM $table$suffix"));
  9.         ($a = $r->fetch_row());
  10.                 return $a[0];
  11. }
  12.  
  13. function sqlesc($value) {
  14.         global $mysqli;
  15.    if (!is_numeric($value)) {
  16.            $value = "'" . $mysqli->real_escape_string($value) . "'";
  17.    }
  18.    return $value;
  19. }
  20.  
  21. function sqlerr($file = "", $line = "", $error = "") {
  22.                 global $USER;
  23.                
  24.         die("<b>MySQL Error:</b><br /><b>File:</b> ". $file ." <b>Line:</b> ". $line ."<br /><b>Error:</b> ". $error);
  25. }
  26.  
  27. $mysql = array(
  28.         "host" => "localhost",
  29.         "user" => "root",
  30.         "password" => "123456",
  31.         "database" => "site",
  32.         "charset" => "utf8"
  33. );
  34.  
  35. $mysqli = @ new mysqli($mysql['host'], $mysql['user'], $mysql['password'], $mysql['database']);
  36.  
  37. @ $mysqli->query("SET NAMES " . $mysql['charset']);
  38.        
  39.         die("MySQLi connect error: " . mysqli_connect_error());
  40. }
  41.  
  42. function curl($url = ""){
  43.  
  44. $cl = curl_init();
  45. curl_setopt($cl, CURLOPT_URL, $url);
  46.  
  47. curl_setopt($cl, CURLOPT_RETURNTRANSFER,1);
  48.  
  49. curl_setopt($cl, CURLOPT_HEADER,1);
  50. curl_setopt($cl, CURLOPT_TIMEOUT, 5);
  51.  
  52. curl_setopt($cl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0");
  53.  
  54. $ex = curl_exec($cl);
  55.  
  56.  
  57. return $ex;
  58.  
  59. }
  60.  
  61. $result = $mysqli->query("SELECT * FROM links WHERE used = 'no'") or sqlerr(__FILE__, __LINE__, $mysqli->error);
  62. $row = $result->fetch_array();
  63.  
  64. $site = curl("...url..." . $row['link']);
  65.  
  66. preg_match('#<h1>(.+?)</h1>#i', $site, $name);
  67.  
  68. $name = strip_tags($name[1]);
  69.  
  70. $name =iconv("WINDOWS-1251","UTF-8", $name);
  71.  
  72. preg_match("#</noindex>\s+</td></tr></table>(.*?)</center><hr>#si", $site, $tmp);
  73.      
  74. $result = preg_replace('#<noindex.*?</noindex>|<script.*?</script>|<ins.*?</ins>|<!--.*?-->#si', '', $tmp[1]);
  75.      
  76. $text = trim($result);
  77. $text = str_replace("<p>&nbsp;</p>", "", $text);
  78. $text = str_replace("<p>&nbsp;</p>", "", $text);
  79. $text = str_replace("<br>", "", $text);
  80. $text = str_replace("<center>", "", $text);
  81.  
  82. $text = iconv("WINDOWS-1251","UTF-8", $text);
  83.  
  84. preg_match_all('#<img.*src="(.*)".*>#isU', $text, $urls);
  85.  
  86. foreach($urls[1] as $val) {
  87.         $urls_end .= $val . "\n";
  88. }
  89.  
  90. $result = $mysqli->query("INSERT INTO texts (name, text, image_urls, categoryid, link) VALUES (" . implode(", ", array_map("sqlesc", array($name, trim($text), trim($urls_end), $row['categoryid'], $row['link']))) . ")") or sqlerr(__FILE__, __LINE__, $mysqli->error);
  91.  
  92. $mysqli->query("UPDATE links SET used = 'yes' WHERE id = " . $row['id']) or sqlerr(__FILE__, __LINE__, $mysqli->error);
  93.  
  94. $a = get_row_count("links");
  95. $b = get_row_count("texts");
  96.  
  97. $number1 = $a;
  98. $number2 = $b;
  99. $result = ($number2 / $number1) * 100;
  100.  
  101. echo "Обработано: " . $b . " / " . $a . " (" . round($result) . "%).";
  102.  
  103. ?>
  104.  
  105. <meta http-equiv="refresh" content="0;URL=2.php" />

(Отредактировано автором: 23 Января, 2015 - 03:26:48)

 
 Top
Ch_chov
Отправлено: 23 Января, 2015 - 06:38:48
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




  1. Держать открытым http соединение
  2. Использовать многопоточное скачивание
  3. Разделить парсер и загрузчик
 
 Top
event
Отправлено: 23 Января, 2015 - 13:26:25
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 542
Дата рег-ции: Май 2011  


Помог: 0 раз(а)




Ch_chov, о втором слышал, а вот о 1 и 3 ничего, можно поподробнее?
(Добавление)
Разделить парсер и загрузчик - то есть, сперва скачать все html страницы к себе, а потом уже с ними работать?
 
 Top
Ch_chov
Отправлено: 23 Января, 2015 - 14:46:58
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




http://habrahabr[dot]ru/post/184302/

event пишет:
Разделить парсер и загрузчик - то есть, сперва скачать все html страницы к себе, а потом уже с ними работать?

Да
 
 Top
event
Отправлено: 23 Января, 2015 - 14:48:49
Post Id


Частый посетитель


Покинул форум
Сообщений всего: 542
Дата рег-ции: Май 2011  


Помог: 0 раз(а)




Ch_chov, делаю как раз многопоточность... надо сформировать массив $urls

не подскажите? - http://forum.php.su/topic.php?fo...mp;v=#1422016689
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB