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

Aas*_*shi -2 php curl web-scraping

我想存储:

  1. 产品名称
  2. Categoty
  3. 子目录
  4. 价钱
  5. 产品公司.

在我的名为products_data的表中,其filds名称为PID,product_name,category,subcategory,product_price和product_company.

curl_init()在php中使用函数首先废弃网站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()); 

    }
}
Run Code Online (Sandbox Code Playgroud)

我对数据库部分很困惑,如何在表中插入数据.有帮助吗?

hal*_*fer 8

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

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

爬行时,请记住:

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

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