【问题标题】:How to add scraped website data in database?如何在数据库中添加抓取的网站数据?
【发布时间】:2013-09-25 06:40:20
【问题描述】:

我要存储:

  1. 产品名称
  2. 类别
  3. 子类别
  4. 价格
  5. 产品公司。

在我的名为 products_data 的表中,字段名称为 PID、product_name、category、subcategory、product_price 和 product_company。

我在 php 中使用 curl_init() 函数来首先废弃网站 URL,接下来我想将产品数据存储在我的数据库表中。这是我到目前为止所做的:

$sites[0] = 'http://www.babyoye.com/';

foreach ($sites as $site)
{
    $ch = curl_init($site);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $html = curl_exec($ch);

    $title_start = '<div class="info">';

    $parts = explode($title_start,$html);
    foreach($parts as $part){
        $link = explode('<a href="/d/', $part);

        $link = explode('">', $link[1]);
        $url = 'http://www.babyoye.com/d/'.$link[0];

        // now for the title we need to follow a similar process:

        $title = explode('<h2>', $part);

        $title = explode('</h2>', $title[1]);

        $title = strip_tags($title[0]);

        // INSERT DB CODE HERE e.g.

        $db_conn = mysql_connect('localhost', 'root', '') or die('error');
        mysql_select_db('babyoye', $db_conn) or die(mysql_error());

        $sql = "INSERT INTO products_data(PID, product_name) VALUES ('".$url."', '".$title."')"

        mysql_query($sql) or die(mysql_error()); 

    }
}

我对如何在表中插入数据的数据库部分有点困惑。有什么帮助吗?

【问题讨论】:

  • 我只是猜测您不是该域的所有者,对吧?所以你只是在偷别人的努力......
  • 作为对您的回答的回应:什么不起作用?你调试了什么?变量是否包含任何数据......等等等等
  • Aashi,我正在使用Goutte 用于类似目的。它允许使用 CSS 选择器来检索 HTML 文档的一部分。如果您不需要完整的无头浏览器系统,可以使用单独的 Symfony 组件。

标签: php curl web-scraping


【解决方案1】:

在编写一些代码之前,您可能希望在设计阶段考虑一些事情:

  • 尽可能概括您的解决方案。如果您必须为每个新的抓取编写 PHP 代码,那么如果目标站点更改其布局,您的开发更改可能会太慢,并且可能会破坏您正在构建的企业。如果您打算抓取大量网站,这一点尤为重要,因为网站重组的可能性在统计上更大。
  • 实现这种泛化的一种方法是使用现成的库,这些库已经在这方面做得很好。因此,与其使用 cURL,不如使用 Goutte 或其他一些程序化浏览器系统。这将为您提供免费会话,在某些站点中,需要从一个页面单击到另一个页面。您还将获得 CSS 选择器来指定您感兴趣的内容项。
  • 对于表格内容,在本地站点上存储一个查找数据库表,它将标题标题转换为数据库列名。对于产品网格,您可以使用表格将 CSS 选择器(例如,相对于每个网格单元格)转换为列。这两种方法都可以让您更轻松地响应目标网站格式的变化。
  • 如果您从站点中提取文本,至少需要通过适当的转义系统运行它,否则目标站点理论上可以在其站点上添加内容以注入其 SQL选择进入您的数据库。无论如何,他们这边的撇号肯定会导致您的通话失败,因此您应该使用mysql_real_escape_string
  • 如果您从站点中提取 HTML 以重新显示它,请务必首先正确清理它。这意味着剥离您不想要的标签,删除可能不受欢迎的属性,并确保结构嵌套良好。我发现 HTMLPurifier 很适合这个。

爬取时记住:

  • 做一个优秀的机器人并为自己定义一个唯一的 USER_AGENT,这样站点运营商就可以根据需要轻松阻止您。使用 Internet Explorer 等伪装成人类是不礼貌的行为。在您的用户代理中包含指向友好帮助页面的网址,就像 GoogleBot 所做的那样。
  • 请勿通过代理或其他旨在隐藏您身份的系统进行爬行 - 公开爬行。
  • 尊重 robots.txt;如果一个网站希望阻止爬虫,他们应该被允许使用受尊重的约定来这样做。如果您的行为类似于搜索引擎,那么运营商想要屏蔽您的可能性非常低(大多数人不希望被搜索引擎抓取吗?)
  • 总是做一些速率限制,否则this happens。在我的开发笔记本电脑上,通过慢速连接,我可以以每秒两页的速度抓取网站,即使不使用 multi_curl。在真正的服务器上,这可能会快得多——也许 20?无论哪种方式,向一个目标 IP/域发出如此数量的请求都是在某人的阻止列表中找到自己的好方法。因此,如果您刮擦,请慢慢地
  • 我维护了一个 HTTP 访问表,并且有一个规则,如果我在最后 5 秒内发出了请求,我会“暂停”这次抓取,并改为抓取其他内容。一旦足够的时间过去了,我就会回到暂停的刮擦。我可能倾向于增加这个值,并在内存中保持大量暂停操作的并发状态。
  • 如果您要抓取多个站点,在不过度使用sleeping 的情况下保持性能的一种方法是在循环的基础上交错您希望发出的请求。因此,在 50 个站点上各执行一次 HTTP 操作,保留每次抓取的状态,然后返回第一个。
  • 如果您实现了多个站点的交错,您可以使用multi_curl 来并行化您的HTTP 请求。由于已经说明的原因,我不建议在单个站点上使用它(远程服务器可能会限制您可以单独打开的连接数)。
  • 小心将您的整个企业建立在对单个站点的抓取之上。如果他们阻止了你,你就会陷入困境。如果您的商业模式可以依赖于对许多网站的抓取,那么被一个网站屏蔽的风险就会降低。

另外,安装第三方抓取软件或让第三方服务为您进行抓取可能具有成本效益。我自己在这方面的研究发现,似乎有能力的组织很少(请记住,在撰写本文时,我还没有尝试过任何一个)。所以,你不妨看看这些:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多