【发布时间】:2017-02-11 04:56:23
【问题描述】:
我为我的一个客户创建了一个scraper,该scraper主要用于抓取少数合作伙伴网站并获取数据。刮板在 90 页之前工作得非常出色,一旦达到 90 页,它就会一次又一次地抓取同一页面。我真的很困惑为什么会发生这种情况。
有人可以帮我解决这个问题吗?
function getFlightCharges() {
$requestHeaders = requestHeaderProperties ();
$sql = 'select * from F_charge where enabled = 0';
$details = DatabaseHandler::GetAll ( $sql );
foreach ( $details as $detail ) {
$link = $detail ['product_link'];
$id = $detail ['id'];
$url = $link;
$referer = 'Referer: example.com/';
$requestHeaders [] = $referer;
$html = getHTMLContentFromURL ( $url, $requestHeaders );
foreach ( $html->find ( '.no-touch' ) as $e ) {
foreach ( $e->find ( '.content-well' ) as $e1 ) {
foreach ( $e1->find ( '.price' ) as $prices ) {
$pricee = strip_tags ( $prices->innertext );
}
foreach ( $e1->find ( '.article-body' ) as $desc ) {
$description = strip_tags ( $desc->innertext );
}
}
}
$sql = "INSERT INTO price_data(product_price) VALUES (:product_price)";
$params = array (':product_price' => $price);
DatabaseHandler::Execute ( $sql, $params );
}
DatabaseHandler::Close ();
}
这里是获取合作伙伴网站链接、获取当前价格和更新我的数据库的功能。直到第 89 页或第 90 页为止,它都运行良好。但不久之后它就卡在第 90 页并不断在数据库中抓取和更新它
【问题讨论】:
-
卡在下一页。它并不总是第 90 页。有时是第 88、89 或第 90。是否有任何卷曲超时可能使其卡在同一页面上??
-
尝试添加
set_time_limit (0) -
我无法理解您的代码逻辑。您付出了很多努力来将信息检索到立即被覆盖甚至根本不使用的变量中。你不断地将值附加到
$requestHeaders没有明显的原因(不可能知道它的用途,因为getHTMLContentFromURL()未公开)。在任何情况下,您都需要进行一些基本调试。唯一指示您的代码切换页面的是来自数据库查询的外部循环:如果您一次又一次地得到相同的结果,我首先怀疑的是您的表有大量的欺骗。 -
@ÁlvaroGonzález 该表包含所有唯一数据。 getHTMLContentFromURL() 是一个 curl 函数,用于获取 html 原始数据进行解析。在上面的代码中,每个使用的变量都有一个用例。我确实做了基本的调试,但没有用,因为代码在第 89 页或第 90 页之前运行良好。只有在爬虫卡在同一页面之后。
-
@RuthRogers,你处理
getHTMLContentFromURL()中的cookie 吗?网站可能会根据 cookie 值(实际上不存在)打开抓取保护...
标签: php curl web-scraping