【问题标题】:Not able to scrape more than 90 pages at a time using Curl and php?无法使用 Curl 和 php 一次抓取 90 多个页面?
【发布时间】: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


【解决方案1】:

但不久之后它就卡在第 90 页并不断在数据库中抓取和更新它

基本上每个 php 脚本都是limited with a time it runs。一些服务器将其限制为 30 秒。因此,如果您处理 90 个页面,您可能会超出此脚本运行时间限制。

您的解决方案是:

  1. 限制每次脚本运行的页数访问。
  2. 使cron 命令按时执行您的脚本。
  3. 由于您在不同时间调用脚本,您应该在数据库表中添加时间标记,以保存上次更新记录的时间标记。

【讨论】:

  • OP 描述的完全相反:脚本不会超时,但会永远运行。
  • @ÁlvaroGonzález,但不久之后它就卡在第 90 页并不断在数据库中抓取和更新它 - 如果同一页面是在其提取下。脚本可能无法运行,并且 OP 认为脚本运行更新相同的记录...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-19
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
相关资源
最近更新 更多