设为首页 收藏本站
查看: 2327|回复: 0

[经验分享] PHP采集商家信息及采集方法概述(上)

[复制链接]

尚未签到

发表于 2018-12-20 09:28:14 | 显示全部楼层 |阅读模式
  最近电子商务市场上面,有很多商家的导航,里面收集了大量的商家信息,如果从事电子商务的这些信息还是有用的。我最近在做的一个项目就要用到这些信息,但是你总不能给别人要吧,这样别人是不给滴。所以只有自己爬了。以前也写过几个类似的爬虫爬取一个站点的某些信息总结说来就是
  第一:确定要爬取的资源。
  第二:确定爬取资源的资源地址(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" 里面的


  •   
  •   
  •     女装
  •     女鞋
  •     女包
  •     男装
  •     男鞋
  •     男包
  •     内衣
  •     配饰
  •     饰品
  •     运动服饰
  •     成衣定制
  •   


  那么好的规律找到了哦 只要在每个一级页面里面的id为dd_open_1里面的ul就行了
  循环是一个一级分类的页面内容然后抓取里面的li 和对应的href
  然后 是二级分类对应的分页数量
  进入一个二级分类然后查看 这里有不同的方法 不过这要找到有一种可行就可以了我说下我的,如果有分页那么一定会有一个尾页 那么尾页的url中的最后一个参数是
  (int a)/ 那么 a就是这个分页的数量
  我们来看个示例


  • 首页
  •     上一页
  •     1
  •      2 3
  •     4
  •     5
  •     下一页
  •     尾页
  •      共500页 到第
  •      


  我的做法是取得 div class="pager" 的这个然后取得里面的最后一个a标签
  获取他的属性href 用explode 已‘_’ 截断 然后取得的数值就是他如果没有就默认一页如果有就是相应的页数。
  然后在最后的商家页面中有我们需要的两个信息,商家简介和url 。logo在商家列表页里面可以获得。这个就说了见代码吧。
  这样我们得到了所有的资源路径(规律,推出所有的分类)
  下面的就是采集阶段了。
  这里就不多说了直接上代码。
  注意:
  第一:这里分了三个小脚本,因为是在pc上跑。如果在服务器上可以合成一个来跑。
  第二:不要恶意和暴力采集,这样对大家都不好,会被当成DDOS ***屏蔽你的ip或者给网站服务器太大压力致使崩溃的。刚开始就被封了IP  然后我这里一次采集后sleep(1) 就没什么问题了。
  代码相关
  数据库结构



  • 'yj_shop_category', 'CREATE TABLE `yj_shop_category` (
  •   `sc_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  •   `sc_name` varchar(255) NOT NULL COMMENT '分类名称',
  •   `sc_parent_id` int(10) NOT NULL DEFAULT '0' COMMENT '父类id',
  •   `sc_url` varchar(255) NOT NULL COMMENT '分类url',
  •   `sc_page_num` int(6) NOT NULL COMMENT '共多少个分页',
  •   `sc_current_page_num` int(6) NOT NULL DEFAULT '1' COMMENT '当前采集页',
  •   `sc_add_time` int(10) NOT NULL COMMENT '增加时间',
  •   `is_grab` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否采集过',
  •   PRIMARY KEY (`sc_id`)
  • ) ENGINE=InnoDB AUTO_INCREMENT=126 DEFAULT CHARSET=utf8'

  • 'yj_shop_information', 'CREATE TABLE `yj_shop_information` (
  •   `si_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '商家主键',
  •   `si_name` varchar(255) NOT NULL COMMENT '商家名称',
  •   `si_cat_id` int(10) NOT NULL COMMENT '商家所属分类',
  •   `si_shop_url` varchar(255) NOT NULL COMMENT '一家中的商家url',
  •   `si_true_url` varchar(255) NOT NULL COMMENT '实际url',
  •   `si_yijia_url` varchar(255) NOT NULL COMMENT '一家中商家简介页面',
  •   `si_logo_url` varchar(255) NOT NULL COMMENT 'logo图片地址',
  •   `si_desc` text NOT NULL COMMENT '详细描述',
  •   `si_front_desc` text NOT NULL COMMENT '简介描述',
  •   `si_add_time` int(10) NOT NULL COMMENT '增加时间',
  •   PRIMARY KEY (`si_id`)
  • ) ENGINE=InnoDB AUTO_INCREMENT=86367 DEFAULT CHARSET=utf8'


  这一篇就到这里然后我们下一篇说具体的采集代码
  
PHP采集商家信息及采集方法概述(下)





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-653440-1-1.html 上篇帖子: GDB分析PHP连接Memcached 导致coredump问题 下篇帖子: 混血儿新生命
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表