如何在数据库中添加被删除的网站数据?

时间:2013-09-25 06:40:21

标签: php curl web-scraping

我想存储:

  1. 产品名称
  2. Categoty
  3. 子类别
  4. 价格
  5. 产品公司。
  6. 在我的名为products_data的表中,其filds名称为PID,product_name,category,subcategory,product_price和product_company。

    我在php中使用curl_init()函数首先废弃网站网址,接下来我想将产品数据存储在我的数据库表中。以下是我迄今为止所做的事情:

    $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()); 
    
        }
    }
    

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

1 个答案:

答案 0 :(得分:8)

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

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

抓取时,请记住:

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

此外,安装第三方抓取软件或获取第三方服务为您进行抓取可能会产生成本效益。我自己在这个领域的研究很少见到看似有能力的组织(并且记住,在撰写本文时,我没有尝试过任何一种组织)。所以,你可能希望看看这些: