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

简介:

 最近电子商务市场上面,有很多商家的导航,里面收集了大量的商家信息,如果从事电子商务的这些信息还是有用的。我最近在做的一个项目就要用到这些信息,但是你总不能给别人要吧,这样别人是不给滴。所以只有自己爬了。以前也写过几个类似的爬虫爬取一个站点的某些信息总结说来就是

第一:确定要爬取的资源。

第二:确定爬取资源的资源地址(url)

第三:分析找出资源地址规律

第四:抓取资源地址。

第五:循环获取地址的内容

第六:匹配抓取内容入库

第六:完结,使用抓取数据。

上一次爬取的是一淘的商家信息,大概有5000个商家信息。当时匹配用的是正则匹配,整个html的正则有时候比较麻烦。这次用的是phpquery(这里做个简介,稍后会单独写一篇介绍的文章)。

这一次爬取一家网(shop.yijia.com)的数据 商家信息有100000个,这次把爬取的思路和相关代码给大家分享下,以便有以后有相同或者类似的需求的参考交流学习。如果有需要这次爬取的数据的留言吧,可以给。

爬取开始...........

第一:

确定爬取的资源。我要爬取的是商家信息,这个网站号称“商城超过500家并从万余家电子商务网站中精选23个分类,最后我确实爬取到90585个商家,去除重复的无效的大概也有50000+的有效商家列表。那么我要爬取的就是这些商家信息,如果每一个商家是一个record那么我大概要爬取10万条数据。

第二:

确定爬取资源地址。一家网的商家地址在shop.yijia.com。商家分为二级分类,一级大类例如:服装饰品,美容护发,数码产品等。在一级下面有二级分类,二级下面就直接是商家列表,每一页是十个。一家网的规律很好找

我们来找一些例子分析....

第一级大类:

服装饰品:http://shop.yijia.com/listshop/index_1/

美容护发:http://shop.yijia.com/listshop/index_2/

数码产品:http://shop.yijia.com/listshop/index_1048/

一类的大类其实只有十来个,我没有爬取直接手动添加了。(爬取是为了简化劳动,如果为了十来条数据去写个爬虫,就不值当了)

第二级类别:我们拿服装饰品下面分类(女装,女鞋,女包,男装,男鞋,男包)的来举例,

女装,http://shop.yijia.com/listshop/index_1_25/

女鞋:http://shop.yijia.com/listshop/index_1_26/

女包:http://shop.yijia.com/listshop/index_1_27/

很明显的规律,这里就细说了,如果这个观察不出来,那个就不要采集了

然后分类下面的分页 我们拿女装来举例

第一页:http://shop.yijia.com/listshop/index_1_25_0_0_1/

第二页:http://shop.yijia.com/listshop/index_1_25_0_0_2/

第三页:http://shop.yijia.com/listshop/index_1_25_0_0_3/

 

第三:

分析资源地址规律,这里比较简单的规律,其实一般统一网站的资源类型资源地址不会差别太大,

关键是最后一个参数index_x_y_0_0_z

其中x 一级分类 y二级分类 z分页 至于当中两个0干嘛的 我也不知道。观察抽取分析后就是都是这样的。

第四:抓取资源地址,抓取后我们不能随便的保存是吧,最好能分类保存,这里就设计到一个本地数据库的设计,可以参考的猜解。

    第一步:一级分类入库,我这里手动拷贝的毕竟只有十来条

    第二步:抓取二级分类,这里观察页面结构可以发现,一级分类页面中的内容中页面结构相似 在一级分类页面的一个div是保存二级分类的目录树的 dd id="dd_open_1" 里面的

 
  1. <dd id="dd_open_1">  
  2. <ul>  
  3.     <li class="sel"><a href="/listshop/index_1_25/" target="_self">女装</a></li> 
  4.     <li><a href="/listshop/index_1_26/" target="_self">女鞋</a></li> 
  5.     <li><a href="/listshop/index_1_27/" target="_self">女包</a></li> 
  6.     <li><a href="/listshop/index_1_28/" target="_self">男装</a></li> 
  7.     <li><a href="/listshop/index_1_29/" target="_self">男鞋</a></li> 
  8.     <li><a href="/listshop/index_1_30/" target="_self">男包</a></li> 
  9.     <li><a href="/listshop/index_1_31/" target="_self">内衣</a></li> 
  10.     <li><a href="/listshop/index_1_32/" target="_self">配饰</a></li> 
  11.     <li><a href="/listshop/index_1_33/" target="_self">饰品</a></li> 
  12.     <li><a href="/listshop/index_1_34/" target="_self">运动服饰</a></li> 
  13.     <li><a href="/listshop/index_1_1086/" target="_self">成衣定制</a></li> 
  14. </ul>  
  15. </dd> 

 

那么好的规律找到了哦 只要在每个一级页面里面的id为dd_open_1里面的ul就行了

循环是一个一级分类的页面内容然后抓取里面的li 和对应的href

然后 是二级分类对应的分页数量

进入一个二级分类然后查看 这里有不同的方法 不过这要找到有一种可行就可以了我说下我的,如果有分页那么一定会有一个尾页 那么尾页的url中的最后一个参数是

(int a)/ 那么 a就是这个分页的数量

我们来看个示例

 
  1. <div class="pager cardlist03"><a href="/listshop/index_1_25_0_0_1/" target="_self">首页</a> 
  2.     <a href="/listshop/index_1_25_0_0_1/" target="_self">上一页</a> 
  3.     <a href="/listshop/index_1_25_0_0_1/" target="_self">1</a> 
  4.     &nbsp;2&nbsp;<a href="/listshop/index_1_25_0_0_3/" target="_self">3</a> 
  5.     <a href="/listshop/index_1_25_0_0_4/" target="_self">4</a> 
  6.     <a href="/listshop/index_1_25_0_0_5/" target="_self">5</a> 
  7.     <a href="/listshop/index_1_25_0_0_3/" target="_self">下一页</a> 
  8.     <a href="/listshop/index_1_25_0_0_500/" target="_self">尾页</a> 
  9.     &nbsp;共500页&nbsp;到第 
  10.     <!-- .....省略输入框代码 太长了 不好截断 哈哈 --> 
  11. </div> 

我的做法是取得 div class="pager" 的这个然后取得里面的最后一个a标签

获取他的属性href 用explode 已‘_’ 截断 然后取得的数值就是他如果没有就默认一页如果有就是相应的页数。

然后在最后的商家页面中有我们需要的两个信息,商家简介和url 。logo在商家列表页里面可以获得。这个就说了见代码吧。

 

这样我们得到了所有的资源路径(规律,推出所有的分类)

 

下面的就是采集阶段了。

这里就不多说了直接上代码。

注意:

第一:这里分了三个小脚本,因为是在pc上跑。如果在服务器上可以合成一个来跑。

第二:不要恶意和暴力采集,这样对大家都不好,会被当成DDOS 攻击屏蔽你的ip或者给网站服务器太大压力致使崩溃的。刚开始就被封了IP  然后我这里一次采集后sleep(1) 就没什么问题了。

代码相关

数据库结构

 

 
  1. 'yj_shop_category', 'CREATE TABLE `yj_shop_category` ( 
  2.   `sc_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键id'
  3.   `sc_name` varchar(255) NOT NULL COMMENT '分类名称'
  4.   `sc_parent_id` int(10) NOT NULL DEFAULT '0' COMMENT '父类id'
  5.   `sc_url` varchar(255) NOT NULL COMMENT '分类url'
  6.   `sc_page_num` int(6) NOT NULL COMMENT '共多少个分页'
  7.   `sc_current_page_num` int(6) NOT NULL DEFAULT '1' COMMENT '当前采集页'
  8.   `sc_add_time` int(10) NOT NULL COMMENT '增加时间'
  9.   `is_grab` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否采集过'
  10.   PRIMARY KEY (`sc_id`) 
  11. ) ENGINE=InnoDB AUTO_INCREMENT=126 DEFAULT CHARSET=utf8' 
  12.  
  13. 'yj_shop_information', 'CREATE TABLE `yj_shop_information` ( 
  14.   `si_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '商家主键'
  15.   `si_name` varchar(255) NOT NULL COMMENT '商家名称'
  16.   `si_cat_id` int(10) NOT NULL COMMENT '商家所属分类'
  17.   `si_shop_url` varchar(255) NOT NULL COMMENT '一家中的商家url'
  18.   `si_true_url` varchar(255) NOT NULL COMMENT '实际url'
  19.   `si_yijia_url` varchar(255) NOT NULL COMMENT '一家中商家简介页面'
  20.   `si_logo_url` varchar(255) NOT NULL COMMENT 'logo图片地址'
  21.   `si_desc` text NOT NULL COMMENT '详细描述'
  22.   `si_front_desc` text NOT NULL COMMENT '简介描述'
  23.   `si_add_time` int(10) NOT NULL COMMENT '增加时间'
  24.   PRIMARY KEY (`si_id`) 
  25. ) ENGINE=InnoDB AUTO_INCREMENT=86367 DEFAULT CHARSET=utf8' 
  26.  

这一篇就到这里然后我们下一篇说具体的采集代码

 

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

 



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


相关文章
|
22天前
|
缓存 PHP 开发者
PHP中的自动加载机制及其优化方法
传统的PHP开发中,经常会遇到类文件加载繁琐、效率低下的情况,而PHP的自动加载机制能够很好地解决这一问题。本文将深入探讨PHP中的自动加载机制,介绍其原理及实现方式,并提出了一些优化方法,帮助开发者提升代码加载效率,提高应用性能。
|
1月前
|
SQL 缓存 PHP
PHP技术探究:优化数据库查询效率的实用方法
本文将深入探讨PHP中优化数据库查询效率的实用方法,包括索引优化、SQL语句优化以及缓存机制的应用。通过合理的优化策略和技巧,可以显著提升系统性能,提高用户体验,是PHP开发者不容忽视的重要议题。
|
4月前
|
JSON PHP 数据格式
PHP curl方法封装
PHP curl方法封装
31 0
|
4月前
|
安全 小程序 PHP
PHP代码审计(五)PHP代码审计方法与步骤
(1):获取到网站源码(这就是废话……) (2):将网站部署到你自己的环境中,能运行。 这里特殊说明一下我的习惯,我本地的环境与线上的环境基本上保持一致,这样在本地审计及线上部署的时候能发现更多的问题。不建议说是随便搭个环境能跑起来就行,这样不是很严谨。 (3):拿到源码之后,浏览大概的项目结构。
66 0
|
2天前
|
存储 SQL 缓存
记录如何用php做一个网站访问计数器的方法
创建简单网站访问计数器,可通过存储访问次数的文件或数据库。首先,创建`counter.txt`存储计数,然后在`counter.php`中编写PHP代码以读取、增加并显示计数,使用`flock`锁定文件避免并发问题。网页通过包含`counter.php`展示计数。对于高流量网站,推荐使用数据库确保原子性和并发处理能力,或利用缓存提升性能。注意,实际生产环境可能需更复杂技术防止作弊。
|
4月前
|
PHP
PHP显示报错提示,开启display_errors的方法
PHP显示报错提示,开启display_errors的方法
49 0
|
6月前
|
数据采集 定位技术 PHP
简单而高效:使用PHP爬虫从网易音乐获取音频的方法
网易音乐是一个流行的在线音乐平台,提供了海量的音乐资源和服务。如果你想从网易音乐下载音频文件,你可能会遇到一些困难,因为网易音乐对其音频资源进行了加密和防盗链的处理。本文将介绍一种使用PHP爬虫从网易音乐获取音频的方法,该方法简单而高效,只需几行代码就可以实现。
简单而高效:使用PHP爬虫从网易音乐获取音频的方法