从各种网上商店中抓取数据


Scraping data from various online stores

首先,应该提到的是,我有来自商店的权限来抓取这些数据,所以合法性在这里不是问题!

我试着从各种网上商店收集信息,并每小时将其存储在数据库中一次。

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

我试过这样一个PHP刮:

<?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允许来自我网站的请求。

分页很简单,您只需找到写着"next"的链接,然后跟随它,直到它不再存在。除非您熟悉xpath,否则您需要一个好的html解析器库(phpquery,简单的html-dom)。准备花大量时间找出正确的方法,最重要的是,不要听任何人告诉你使用regex。

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

你需要做的是:

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

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

使用cURL和regex过滤您需要的内容。谷歌cURL php.net网站将为您提供所需的所有信息