【问题标题】:Scraping data from various online stores从各种在线商店抓取数据
【发布时间】:2013-02-21 00:57:39
【问题描述】:

首先,应该提及的是,我已获得商店的许可来抓取这些数据,因此合法性在这里不是问题!

我正在尝试从各种在线商店中抓取信息,并每小时将它们存储在数据库中。

示例网站:http://www.uptherestore.com/department/accessories

我试过这样的PHP scrape

<?php
$file_string = file_get_contents('http://www.uptherestore.com/department/accessories');
preg_match('/<div class="view view-uc-products view-id-uc_products view-display-id-page_3 storeview view-dom-id-1">
(.*)<\/div>/i', $file_string, $title);
$title_out = $title[1];?>
<p><strong>Accessories:</strong> <?php echo $title_out; ?></p>

但它给了我同类的错误:

 [14-Feb-2013 07:39:49 UTC] PHP Warning:  DOMDocument::loadHTML() [<a href='domdocument.loadhtml'>domdocument.loadhtml</a>]: htmlCheckEncoding: encoder error in Entity, line: 7 in scraping.php on line 5

来自日志文件的完整错误在这里:http://pastebin.com/W2Bhkc0s

即使我确实设法从该网站抓取,它也只会返回结果的第一页(当我需要所有页面时)。我目前对此的解决方案是:

  • 使用 jQuery 检查页面底部分页器中有多少元素
  • 运行一个循环来抓取这些页面中的每一个

但这并不理想 - 正如您所看到的,在页面底部有第 1...9 页,但如果您单击“最后”,则实际上有 11 页内容。简而言之,从这样的网站抓取数据的最佳方法是什么?如前所述,店主都允许我使用他们的内容,但他们没有特别的技术意识,不能让我访问他们的服务器/在他们的服务器的 .htaccess 中放置任何代码以允许来自我的网站的请求。

【问题讨论】:

  • 那么你需要在web客户端还是服务器上做这个?
  • JS/jQuery 对您没有帮助,除非 A. 您从不受 Same Origin Policy 或 B 约束的扩展程序运行它。另一个站点启用了 CORS,允许您发送要求。您可能会在后端执行此操作。
  • 你为什么使用 ajax / javascript?这只需要一个计划的作业(cron?)和一个 php 脚本。
  • 最好是服务器 - 减轻客户端的负载并使所有内容保持最新我想每小时安排一次抓取,将其加载到我前面的日志/数据库中端可以访问。
  • 一个 cron 作业(在 linux 中,在 windows 中你需要 windows 调度程序)只是一行告诉系统每 xx 天/小时/分钟/等运行一次脚本。真正的脚本是抓取网站的 php 脚本。你应该通过从浏览器或命令行调用它来让它工作,当它工作时,你安排它。由于它不起作用,您应该在仅调用脚本时发布 php 代码和错误消息(没有 javascript / ajax 的东西)。

标签: php jquery ajax web-scraping screen-scraping


【解决方案1】:

分页很简单,您只需找到显示“下一步”的链接并跟随它直到它不再存在。除非您对 xpath 感到满意,否则需要一个好的 html 解析器库(phpquery、simple-html-dom)。准备好花大量时间找出正确的方法,最重要的是,不要听任何人告诉你使用正则表达式。

【讨论】:

    【解决方案2】:

    首先,您的错误消息似乎不适合您的 php 代码:php 正在尝试使用正则表达式解析 html(错误!)并且错误消息表明您正在使用 html 解析器(DOMDocument)解析html(正确的方式)。

    你需要做的是:

    1. 从产品页面获取 html(就像您现在正在做的那样......);
    2. 检查该页面是否已在您的数据库中解析(请参阅下一点);
    3. 使用 html 解析器从该页面获取您需要的信息并将所有内容存储在数据库中 - 包括指向产品页面的链接或该页面的其他标识属性以及某种时间戳,以便您知道什么你已经完成了;
    4. 使用 html 解析器获取 html 中的所有产品链接;
    5. 对于您找到的每个产品链接,请转到 1。

    您可能需要构建一些逻辑来确保您的脚本不会进入一个永无止境的循环或运行时间过长,但基本上就是这样;在您真正想在浏览器中查看操作结果之前,不需要浏览器/javascript/ajax。

    【讨论】:

    • 这是一个很好的答案。有一点我还不确定——上面链接的“附件”页面有 11 页附件。但是,它并不总是有 11 页(显然,随着更多的库存来来去去)。那么我怎样才能获取所有这些数据并围绕它构建逻辑呢?我是否应该让 php 尝试抓取第 1、2、3...infinity 页面,当它遇到空白页面时,它会假定所有内容都已加载?
    • @Jascination 不,您应该使用 html 解析器并获取所有链接(获取页面上的所有链接)或具有特定类的所有链接(对于产品链接,取决于您正在抓取的页面)。然后你按照这些链接重新开始这个过程。
    【解决方案3】:

    使用 cURL 和正则表达式过滤您需要的内容。 Google cURL php.net 网站将为您提供所需的所有信息

    【讨论】:

    • 启动并运行,虽然我如何导航到多个页面以进行抓取(参见示例站点 - 有 11 个页面,尽管我需要一种方法来检查和自动执行此操作。
    猜你喜欢
    • 2019-01-22
    • 2019-04-12
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多