PHP采集商家信息及采集方法概述(下)

简介:

 下面我们来上代码

数据库采用PDO 主要用到了预处理 关于预处理的内容

参考:PHP5中PDO(PHP DATA OBJECT)模块基础详解

还有一个phpquery 源码下载 这个稍后在给出具体的教程

 

第一步:

基本的配置 数据库文件在第一讲里面

数据库连接:conn.php


 
 
  1. <?php 
  2.     define('DB_USER''root');  
  3.     define('DB_PASSWORD''');  
  4.     define('DB_CHARSET''utf8');  
  5.     try {  
  6.         $DBH = new PDO('mysql:host=localhost;dbname=shopyijia', DB_USER, DB_PASSWORD);  
  7.         $DBH->exec('SET CHARACTER SET '.DB_CHARSET);  
  8.         $DBH->exec('SET NAMES '.DB_CHARSET);  
  9.         /*  
  10.          * 如果想要在脚本结束的时候不释放链接那么在参数里面加上array(PDO::ATTR_PERSISTENT => true)不过一般情况下可以不用常链接  
  11.         $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(  
  12.             PDO::ATTR_PERSISTENT => true  
  13.             ));  
  14.          */  
  15.     } catch (PDOException $e) {  
  16.         print "Error!: " . $e->getMessage() . "<br/>";  
  17.         die();  
  18.     }  

 

 

第二步:

手动添加一级分类的信息地址

 

第三步:

爬取二级分类

 


 
 
  1. <?php 
  2. /* 
  3.  * 获取所有商家目录信息 
  4.  */ 
  5. header("Content-type:text/html;charset=utf8"); 
  6. set_time_limit(0); 
  7. define('SHOP_BASE_URL''http://shop.yijia.com'); 
  8. require_once 'conn.php'//数据库初始化 
  9. require('phpQuery/phpQuery.php'); //采集器初始化 
  10. $Sql = 'SELECT * FROM yj_shop_category WHERE is_grab=\'0\' AND sc_parent_id=0'
  11. $un_grab_cat = $DBH->query($Sql)->fetchAll(); //爬取一级分类下面的二级分类页面 
  12. //预处理SQL 
  13. $stmt = $DBH->prepare('INSERT INTO yj_shop_category(sc_name,sc_parent_id,sc_url,sc_add_time) VALUES (:sc_name,:sc_parent_id,:sc_url,:sc_add_time)');  
  14. $sc_name = $sc_parent_id = $sc_url = $sc_add_time = null; 
  15.  
  16. $stmt->bindParam(':sc_name'$sc_name); //  
  17. $stmt->bindParam(':sc_parent_id'$sc_parent_id); 
  18. $stmt->bindParam(':sc_url'$sc_url);  
  19. $stmt->bindParam(':sc_add_time'$sc_add_time);   
  20.  
  21. foreach ($un_grab_cat as $_key => $_value){ 
  22.     $sc_url = $_value['sc_url']; 
  23.     $sc_parent_id = $_value['sc_id'];//父分类id 
  24.     $file = file_get_contents($sc_url); 
  25.     $dom = phpQuery::newDocument($file);  //初始化对象 
  26.     foreach(pq("#dd_open_1 ul > li"as $item){ 
  27.         $sc_name =  pq($item)->text(); 
  28.         $sc_url =  SHOP_BASE_URL.pq($item)->find('a:first')->attr('href'); 
  29.         $sc_add_time = time(); 
  30.         $stmt->execute();  
  31.     } 
  32.     phpQuery::$documents = array(); 
  33. echo 'over'
  34. die(); 

 

第四步:

爬取二级分类的页面更新对应的分页

 


 
 
  1. <?php 
  2. header("Content-type:text/html;charset=utf8"); 
  3. set_time_limit(0); 
  4. define('SHOP_BASE_URL''http://shop.yijia.com'); 
  5. require_once 'conn.php'//数据库初始化 
  6. require('phpQuery/phpQuery.php'); //采集器初始化 
  7. $Sql = 'SELECT sc_id,sc_url FROM yj_shop_category WHERE is_grab=\'0\' AND sc_parent_id!=0'
  8. $un_grab_cat = $DBH->query($Sql)->fetchAll(); //爬取一级分类下面的二级分类页面 
  9. //预处理SQL 
  10. $stmt = $DBH->prepare('UPDATE yj_shop_category SET sc_page_num = :sc_page_num WHERE sc_id = :sc_id');  
  11. $sc_page_num = $sc_id  = null; 
  12.  
  13. $stmt->bindParam(':sc_page_num'$sc_page_num); //  
  14. $stmt->bindParam(':sc_id'$sc_id);   
  15.  
  16. foreach ($un_grab_cat as $_key => $_value){ 
  17.     $sc_id = $_value['sc_id']; 
  18.     $sc_url = $_value['sc_url']; 
  19.     $file = file_get_contents($sc_url); 
  20.     $dom = phpQuery::newDocument($file);  //初始化对象 
  21.     $last_a = pq('div.pager > a:last'); 
  22.     $A_parm = explode('_', pq($last_a)->attr('href')); 
  23.     $sc_page_num = intval($A_parm[5]); 
  24.     $stmt->execute(); 
  25.     phpQuery::$documents = array(); 
  26.     sleep(1); 
  27. echo 'over'
  28. die(); 

第五步:

爬取二级分类所有分页的商家信息

 


 
 
  1. <?php 
  2. /* 
  3.  * 获取所有商家信息 
  4.  */ 
  5. header("Content-type:text/html;charset=utf8"); 
  6. set_time_limit(0); 
  7. error_reporting(E_ALL); 
  8. define('SHOP_BASE_URL''http://shop.yijia.com'); 
  9. require_once 'conn.php'//数据库初始化 
  10. require('phpQuery/phpQuery.php'); //采集器初始化 
  11. $Sql = 'SELECT sc_id,sc_url,sc_page_num,sc_current_page_num FROM yj_shop_category WHERE is_grab=\'0\' AND sc_parent_id!=0'
  12. $un_grab_cat = $DBH->query($Sql)->fetchAll(); //获取所有的未被抓取的二级分类信息 
  13.  
  14. foreach ($un_grab_cat as $_key => $_value){ 
  15.     $sc_url = $_value['sc_url']; 
  16.     $sc_id = $_value['sc_id'];//父分类id 
  17.     if($_value['sc_page_num'] == '0'){ //如果只有一页  
  18.         $sc_tmp_url = $sc_url
  19.         if(getPageShopInfo($sc_tmp_url,$sc_id)){ 
  20.             $DBH->exec('UPDATE yj_shop_category SET is_grab=1 WHERE sc_id='.$sc_id);             
  21.         } 
  22.     }else//如果有多页 
  23.         for($i=$_value['sc_current_page_num'];$i<=$_value['sc_page_num'];$i++){ 
  24.             $A_param = explode('_'$sc_url); 
  25.             $A_param[2] = intval($A_param[2]).'_0_0_'.$i.'/'
  26.             $sc_tmp_url = implode('_',$A_param);//拼接出来一个的url 要符合当前的规则哦 以后可能会有变动哦             
  27.             if(getPageShopInfo($sc_tmp_url$sc_id)){ 
  28.                 $DBH->exec('UPDATE yj_shop_category SET sc_current_page_num='.$i.' WHERE sc_id='.$sc_id); 
  29.                 $last_page = $i
  30.             } 
  31.         } 
  32.         if($last_page == $_value['sc_page_num']){ //如果后一个分页爬取完成 那么更新当前 这个分类的状态为已抓取 
  33.             $DBH->exec('UPDATE yj_shop_category SET is_grab=1 WHERE sc_id='.$sc_id); 
  34.         } 
  35.          
  36.     } 
  37.  
  38. function getPageShopInfo($url,$sc_parent_id){ 
  39.     global $DBH
  40.     $stmt = $DBH->prepare('INSERT INTO yj_shop_information(si_name,si_cat_id,si_yijia_url,si_logo_url,si_front_desc,si_add_time) VALUES (:si_name,:si_cat_id,:si_yijia_url,:si_logo_url,:si_front_desc,:si_add_time)');  
  41.     $si_name = $si_cat_id = $si_yijia_url = $si_logo_url = $si_front_desc =  $si_add_time = null; 
  42.     $stmt->bindParam(':si_name'$si_name);  
  43.     $stmt->bindParam(':si_cat_id'$si_cat_id);  
  44.     $stmt->bindParam(':si_yijia_url'$si_yijia_url);  
  45.     $stmt->bindParam(':si_logo_url'$si_logo_url);  
  46.     $stmt->bindParam(':si_front_desc'$si_front_desc);  
  47.     $stmt->bindParam(':si_add_time'$si_add_time);  
  48.      
  49.     $file = file_get_contents($url); 
  50.     $dom = phpQuery::newDocument($file);  //初始化对象 
  51.     foreach ($dom->find('div.shopping_list'as $item){ //循环节点 
  52.         $si_name = pq($item)->find('h2:first > a:first')->text(); //店铺名称 
  53.         $si_cat_id = $sc_parent_id//分类名称 
  54.         $si_yijia_url = SHOP_BASE_URL.pq($item)->find('h2:first > a:first')->attr('href'); //一家网中商家介绍页面 
  55.         $si_logo_url =  pq($item)->find('div.fl > a > img:first')->attr('src'); 
  56.         $si_front_desc =  pq($item)->find('div.shopping_description:first')->text(); 
  57.         $si_add_time = time(); 
  58.         $stmt->execute(); 
  59.     } 
  60.     phpQuery::$documents = array(); 
  61.     sleep(1);//休息一秒 友情点 不要给他们太大压力是吧 
  62.     return true; 
  63.  
  64.  
  65. echo 'over'
  66. die(); 

 

 

第六步:获取商家的真实url 和具体的描述

 


 
 
  1. <?php 
  2. /* 
  3.  * 获取商家的具体信息 
  4.  */ 
  5. header("Content-type:text/html;charset=utf8"); 
  6. set_time_limit(0); 
  7. define('SHOP_BASE_URL''http://shop.yijia.com'); 
  8. require_once 'conn.php'//数据库初始化 
  9. require('phpQuery/phpQuery.php'); //采集器初始化 
  10. $Sql = 'SELECT si_id,si_yijia_url  FROM yj_shop_information WHERE si_shop_url =\'\' '
  11. $un_grab_cat = $DBH->query($Sql)->fetchAll(); //所有的没有被重新爬取的商家url 
  12.  
  13. //更新预处理SQL 
  14.  
  15. $stmt = $DBH->prepare('UPDATE yj_shop_information SET si_shop_url=:si_shop_url,si_true_url=:si_true_url,si_desc=:si_desc WHERE si_id=:si_id');  
  16.  
  17. $si_true_url = $si_shop_url  = $si_desc = $si_id = $sc_add_time = null; 
  18.  
  19. $stmt->bindParam(':si_true_url'$si_true_url); //  
  20. $stmt->bindParam(':si_shop_url'$si_shop_url); //  
  21. $stmt->bindParam(':si_desc'$si_desc); 
  22. $stmt->bindParam(':si_id'$si_id);  
  23. $i=1; 
  24. foreach ($un_grab_cat as $_key => $_value){ 
  25.     $si_yijia_url = $_value['si_yijia_url']; 
  26.     $si_id = $_value['si_id'];//id 
  27.     $file = file_get_contents($si_yijia_url); 
  28.     $dom = phpQuery::newDocument($file);  //初始化对象 
  29.     $si_shop_url = SHOP_BASE_URL.pq('div.shop_logo > a:first')->attr('href'); 
  30.     $http_info = getContents($si_shop_url); 
  31.     $si_true_url = $http_info['url']; 
  32.     $si_desc = pq('div.shop_detailinfo > strong:first')->text(); 
  33.     $stmt->execute(); 
  34.     if(fmod($i,3) == 0) 
  35.     sleep(1); 
  36.  
  37.     $i++; 
  38.     phpQuery::$documents = array(); 
  39.  
  40. function getContents($url){ 
  41.   $header = array("Referer:http://www.tx29.com/"); 
  42.   $ch = curl_init(); 
  43.   curl_setopt($ch, CURLOPT_URL, $url); 
  44.   curl_setopt($ch, CURLOPT_TIMEOUT, 30); 
  45.   curl_setopt($ch, CURLOPT_HTTPHEADER,$header); 
  46.   curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1); 
  47.   ob_start(); 
  48.   curl_exec($ch); 
  49.   ob_end_clean(); 
  50.   $x = curl_getinfo($ch); 
  51.   curl_close($ch); 
  52.   return $x
  53.  
  54.  
  55.  
  56. echo 'over'
  57. die(); 

最后算了下时间 如果友情爬取的话需要48个小时。可以分几个ip多个脚本跑没问题。 那个我 这里爬取好的数据如果非同行需要的话 留言联系.....同行的就自己抓取把

这里最后说下不要暴力爬取哦

 

 




    本文转自kefirking 51CTO博客,原文链接:http://blog.51cto.com/phpzf/799555,如需转载请自行联系原作者





相关文章
|
2月前
|
Java PHP 数据安全/隐私保护
PHP 面向对象,构造函数,析构函数,继承,方法的重写,接口抽象类,static,final,this,parent,self的异同和作用
本文详细介绍了PHP面向对象编程的一系列核心概念和用法,包括构造函数、析构函数、继承、方法重写、访问控制、接口、抽象类、静态成员、final关键字、以及this、self、parent这三个关键字的异同和作用。通过具体示例代码,展示了如何在PHP中使用这些面向对象的特性,以及它们在实际开发中的应用。
PHP 面向对象,构造函数,析构函数,继承,方法的重写,接口抽象类,static,final,this,parent,self的异同和作用
|
2月前
|
存储 缓存 数据处理
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
本文介绍了PHP会话控制及Web常用的预定义变量,包括`$_REQUEST`、`$_SERVER`、`$_COOKIE`和`$_SESSION`的用法和示例。涵盖了cookie的创建、使用、删除以及session的工作原理和使用,并通过图书上传的例子演示了session在实际应用中的使用。
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
|
2月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入探索与实践在软件开发的广袤天地中,PHP以其独特的魅力和强大的功能,成为无数开发者手中的得力工具。而在这条充满挑战与机遇的征途上,设计模式犹如一盏明灯,指引着我们穿越代码的迷雾,编写出更加高效、灵活且易于维护的程序。今天,就让我们聚焦于设计模式中的璀璨明珠——策略模式,深入探讨其在PHP中的实现方法及其实际应用价值。
策略模式,这一设计模式的核心在于它为软件设计带来了一种全新的视角和方法。它允许我们在运行时根据不同情况选择最适合的解决方案,从而极大地提高了程序的灵活性和可扩展性。在PHP这门广泛应用的编程语言中,策略模式同样大放异彩,为开发者们提供了丰富的创作空间。本文将从策略模式的基本概念入手,逐步深入到PHP中的实现细节,并通过一个具体的实例来展示其在实际项目中的应用效果。我们还将探讨策略模式的优势以及在实际应用中可能遇到的挑战和解决方案,为PHP开发者提供一份宝贵的参考。
|
2月前
|
PHP UED 开发者
PHP中处理异常的现代方法
【9月更文挑战第26天】在PHP的世界里,异常处理是代码健壮性的守护神。本文将深入浅出地探讨如何在PHP项目中优雅地处理异常,从而避免程序崩溃并提升用户体验。
|
2月前
|
IDE 安全 网络安全
Xdebug 在不同版本的 PHP 中配置方法有什么不同?
Xdebug 在不同版本的 PHP 中配置方法有什么不同?
130 4
|
2月前
|
PHP
PHP全自动采集在线高清壁纸网站源码
PHP全自动采集在线高清壁纸网站源码,PHP全自动采集在线高清壁纸网站源码,一款开源壁纸源码,无需安装。集合360壁纸,百度壁纸,必应壁纸,简单方便。每天自动采集,自动更新,非常不错,php源码 网站源码 免费源码 自动采集。
51 3
|
3月前
|
PHP 开发工具 git
【Azure 应用服务】在 App Service for Windows 中自定义 PHP 版本的方法
【Azure 应用服务】在 App Service for Windows 中自定义 PHP 版本的方法
|
2月前
|
PHP 开发者
PHP中的魔法方法
本文将介绍PHP中的一些特殊方法,这些方法以双下划线(__)开头,被称为魔术方法或魔法方法。这些方法在特定情况下会自动调用,例如当尝试访问未定义的属性或调用未定义的方法时。本文将详细讲解几个常用的魔术方法,以及如何在实际应用中使用它们来增强PHP代码的可读性和健壮性。
24 0
|
3月前
|
Java 应用服务中间件 PHP
PHP——调用java文件中的方法
PHP——调用java文件中的方法
54 0
PHP——调用java文件中的方法
|
3月前
|
监控 安全 网络安全
PHP代码审计之简单思路方法
PHP代码审计之简单思路方法
135 1