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

Php 如何在数据库中添加已删除的网站数据?,php,curl,web-scraping,Php,Curl,Web Scraping,我想储存: 产品名称 教条 子类别 价格 产品公司 在我的名为products_data的表中,filds name为PID、product_name、category、subcategory、product_price和product_company 我正在使用php中的curl\u init()函数首先删除网站URL,然后我想在数据库表中存储产品数据。以下是我迄今为止为此所做的工作: $sites[0] = 'http://www.babyoye.com/'; foreach ($site

我想储存:

  • 产品名称
  • 教条
  • 子类别
  • 价格
  • 产品公司
  • 在我的名为products_data的表中,filds name为PID、product_name、category、subcategory、product_price和product_company

    我正在使用php中的
    curl\u 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()); 
    
        }
    }
    
    $sites[0]='http://www.babyoye.com/';
    foreach($sites作为$site)
    {
    $ch=curl_init($site);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    $html=curl\u exec($ch);
    $title_start='';
    $parts=explode($title\u start,$html);
    foreach($parts作为$part){
    $link=爆炸(“”,$link[1]);
    $url='1http://www.babyoye.com/d/“.$link[0];
    //现在,对于标题,我们需要遵循类似的过程:
    $title=分解(“”,$part);
    $title=explode(“”,$title[1]);
    $title=strip_标签($title[0]);
    //在此处插入DB代码,例如:。
    $db_conn=mysql_connect('localhost','root','')或die('error');
    mysql_选择db('babyoye',$db_conn)或die(mysql_error());
    $sql=“插入产品数据(PID,产品名称)值(“$url.”,“$title.”)
    mysql_query($sql)或die(mysql_error());
    }
    }
    

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

    在编写代码之前,在设计阶段可能有很多事情需要考虑:

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

    • 做一个好的机器人,为自己定义一个独特的用户代理,所以如果站点操作员愿意,他们很容易阻止你。假扮成人类使用,比如说Internet Explorer,是不礼貌的。在用户代理中包括一个友好帮助页面的URL,就像GoogleBot一样
    • 不要在代理或其他系统中爬行以隐藏您的身份-公开爬行
    • 尊重robots.txt;如果站点希望阻止刮刀,则应允许他们使用受尊重的约定来阻止刮刀。如果你表现得像一个搜索引擎,运营商想要阻止你的几率很低(大多数人不想被搜索引擎刮伤吗?)
    • 总是做一些速率限制,否则。在我的开发笔记本电脑上,通过慢速连接,我可以以每秒两页的速度浏览一个站点,即使不使用multi_curl。在真正的服务器上,这可能要快得多-可能是20?无论哪种方式,对一个目标IP/域发出如此多的请求都是一个很好的方法,可以让你发现自己被某人的阻止列表。因此,如果你刮伤了,就慢慢来
    • 我维护一个HTTP访问表,并且有一个规则,如果我在最后5秒钟内发出了请求,我会“暂停”这个刮取,然后刮取其他内容。一旦足够的时间过去了,我就会回到停滞不前的困境中。我可能倾向于增加这个值,并在内存中保持大量暂停操作的并发状态
    • 如果要删除多个站点,在不过度
      睡眠
      的情况下保持性能的一种方法是在循环的基础上交错您希望发出的请求。因此,在50个站点上分别执行一个HTTP操作,保留每个刮取的状态,然后返回到第一个
    • 如果您实现了多个站点的交错,那么可以使用
      multi\u curl
      来并行您的HTTP请求。我不建议在单个站点上使用此选项,原因已经说明(远程服务器可能会限制您可以单独打开的连接数)
    • 在将整个企业建立在单个站点的基础上时要小心。如果他们阻止了你,你就被卡住了。如果您的业务模式可以依赖于多个站点的清理,那么被一个站点阻止的风险就会降低
    此外,安装第三方刮片软件或获得第三方服务为您进行刮片可能具有成本效益。我自己在这方面的研究发现,似乎有能力的组织很少(请记住,在撰写本文时,我还没有尝试过任何组织)