如何在数据库中添加抓取的网站数据


How to add scraped website data in database?

我想存储:

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

在我的表中名为 products_data,filds 名称为 PID、product_name、类别、子类别、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()); 
    }
}

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

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

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

抓取时,请记住:

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

此外,安装第三方抓取软件或让第三方服务为您进行抓取可能会有成本效益。我自己在这一领域的研究发现,似乎有能力的组织很少(请记住,在撰写本文时,我还没有尝试过其中任何一个(。因此,您可能希望查看这些:

  • 80腿 - 商业
  • 莫赞达 - 商业
  • 常见爬网 - F/OSS
  • 随处爬网 - F/OSS