最近上面让爬一些数据,以为可以尝试学习使用python,奈何最终让我用PHP实现,减少开发时间…然后在网上找,果然已经有大佬分享----phpspider,还有一些php爬虫框架,但是考虑到是国人开发,代码可读性高(全中文注释,注释清晰,详细),并且在github上有近3K的star,最终决定使用phpspider。

作者很有意思,代码注释风趣,并且各种情况都做了兼容,只需要轻轻配置一下,不需要我们做太多的操作,甚至还给出了好几个demo供我们研究。

下载地址:下载地址
文档地址:文档地址

简单学习xpath后,过了一遍文档,开始尝试。我需要爬的是一个商标分类,群组,商品的网站,从源码和js里分析后各页面后,添加配置:

$config = ['name'=>'商标类','tasknum'=>1,//进程数'log_show'=>true,//是否显示日志'domains'=>[//定义爬取域'test.com','www.test.com',],'scan_urls'=>[//入口页面'http://www.test.com/ncl/01.html'],'content_url_regexes'=>[//内容'http://www.test.com/category/search.html\?intCls=\d+'],'max_try'=>5,//最大尝试次数'db_config'=>['host'=>'127.0.0.1','user'=>'root','pass'=>'123','port'=>3306,'name'=>'dataname',],
];

经过分析,我爬取的页面的列表没有实际意义,因此没有写list_url_regexes配置,有列表可以增加此配置,可大幅提升爬虫效率!
商标分类有45,每个类下又有n个群组,每个群组下有多个商品,分析页面后得知,45类有有45个url,因此需要把这些url添加到带爬队列中:

$spider = new phpspider($config);
$spider->on_start = function($phpspider){$db_config = $phpspider->get_config("db_config");db::set_connect('default',$db_config);db::init_mysql();for($i=1;$i<46;$i++){if($i<10){$i = '0'.$i;}$phpspider->add_url('http://www.test.com/category/search.html?intCls='.$i);}
};

顺便把数据库也初始化,方便后面操作。
再来写群组和商品的爬去,经分析,发现每个页面的群组都是相同的div和class,并且商品也在这个div里,保存在商品中,添加配置fileds

'fields'=>[['name'=>'parent','selector'=>"//div[@class='result-data']",]]

这样就能拿到所有同一分类下(同一页面),不同群组的div和包含的商品的html,查看文档,文档上介绍说,fields中可以使用children,是一个树形结构(并且可以一直加下去,有兴趣可查看源码,代码中是递归操作),结合文档示例,修改fields配置:

'fields'=>[['name'=>'parent','selector'=>"//div[@class='result-data']",'children'=>[['name'=>'group','selector'=>'//div[@class="result-data-top"]',],['name'=>'item','selector'=>'//input[@type="checkbox"]/@value',]]]]

尝试运行后,发现只有每个类型(页面)都只拿到1个群组(group),和1个商品(item)!并且不加children时得到的html都是包含所有需要数据的!
怀疑是xpath不熟悉,写错了,根据文档的运行前测试后得知,xpath没有问题!
然后开始查看源码,最终发现这个判断

if (is_array($values)) {if ($repeated) {$fields[$conf['name']] = $values;}else{$fields[$conf['name']] = $values[0];}}else {$fields[$conf['name']] = $values;}

好吧,原来在fields里还可以添加配置,repeated,否则就只会返回数组中的第一个,默认是false,修改为true,文档中也有描述,怪自己忽略忘记了这个配置…再次修改配置

'fields'=>[['name'=>'parent','selector'=>"//div[@class='result-data']",'repeated' => true,'children'=>[['name'=>'group','selector'=>'//div[@class="result-data-top"]','repeated' => true,],['name'=>'item','selector'=>'//input[@type="checkbox"]/@value','repeated' => true,]]]]

运行尝试,OK
现在开始处理数据,因为在我的数据库中,群组和商品是分开的,现在爬出来的数据,显然不适合参照demo中自动保存,因此需要自己修改处理!
查找文档,果然大佬已经准备好了,on_extract_page这个回调函数可以在抽取完后进一步处理字段:

$spider->on_extract_field = function($filename,$data){if($filename == 'parent'){/*中间就是处理代码,$data就是抽取出来的数据,数组格式*/}return $data;
};

完成!
全程不过100行左右代码,配置就将近一半了,不需要管底层逻辑,发送请求等等,算是懒人福音,以后有机会学习一下底层实现,此框架推荐!

phpspider 简单用法和学习,分类一对多爬取数据相关推荐

  1. Python 学习 02 —— Python如何爬取数据

    文章目录 系列文章 二.Python 爬 虫 1.任务介绍 2.简介 3.基本流程 3.1.准备工作 3.1.1.分析页面 3.1.2.编码规范 3.1.3.导入模块 3.1.4.程序流程 3.2.获 ...

  2. 把爬取信息导出到mysql,关于爬虫学习的一些小小记录(四)——爬取数据存入数据库...

    关于爬虫学习的一些小小记录(四)--爬取数据存入数据库 创建数据库 pymysql 模块 具体操作 预知后事如何 前面我们已经讲了怎么访问网页,并且从网页源码中提取数据.既然数据有了,怎样管理就是下一 ...

  3. 从入门到入土:Python爬虫学习|实例练手|爬取百度产品列表|Xpath定位标签爬取|代码注释详解

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  4. 爬虫学习(一)---爬取电影天堂下载链接

    欢迎加入python学习交流群 667279387 爬虫学习 爬虫学习(一)-爬取电影天堂下载链接 爬虫学习(二)–爬取360应用市场app信息 主要利用了python3.5 requests,Bea ...

  5. 简单的使用QueryList爬取数据

    最近在整理做过的项目时,发现了曾经的一个好玩的东西,长时间不用都快忘记生疏了,在这里做下总结.在之前的时间里,流行用python写爬虫脚本,我学的是php于是经过学习也用php写了个简单的爬虫,用于抓 ...

  6. 爬虫学习(二)--爬取360应用市场app信息

    欢迎加入python学习交流群 667279387 爬虫学习 爬虫学习(一)-爬取电影天堂下载链接 爬虫学习(二)–爬取360应用市场app信息 代码环境:windows10, python 3.5 ...

  7. [ Python ] 爬虫类库学习之 requests,爬取豆瓣喜剧电影排行榜

    requests 文档:http://cn.python-requests.org/zh_CN/latest/ 安装:pip --timeout=100 install requests [ pyth ...

  8. 从入门到入土:Python爬虫学习|实例练手|爬取猫眼榜单|Xpath定位标签爬取|代码

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  9. 从入门到入土:Python爬虫学习|实例练手|爬取百度翻译|Selenium出击|绕过反爬机制|

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  10. 从入门到入土:Python爬虫学习|实例练手|爬取新浪新闻搜索指定内容|Xpath定位标签爬取|代码注释详解

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

最新文章

  1. 当前linux环境做出镜像,把当前ubuntu系统做成镜像
  2. C++ STL: 基本六大部件概览 及 各个容器使用方式和底层实现概览
  3. 其他算法-两大随机采样方法简介
  4. 基于深度学习的目标检测的研究进展2
  5. 第十六届全国大学生智能汽车竞赛华东赛区 承办情况汇报
  6. linux更换网卡不识别_详解Linux双网卡绑定脚本的方法示例
  7. Ubuntu 上 Node.js 安装和卸载
  8. 中断技术之中断的定义,中断服务程序的设计方法,中断处理的过程以及中断向量表的建立
  9. Tomcat 7.0~10.0zip版,安装版,其他一键式全部下载
  10. 二维动画作品_「咻动画」二维动画制作中角色造型的设计要点
  11. android按钮控件常见问题,Android的基本控件和Activity的应用总结
  12. visual设计的界面发布到iis上显示不一样_享声 SOUNDAWARE 发布可“全民HIFI“的网播一体机 A1...
  13. java控制面板作用_大师为你分析win7系统打开java控制面板的方法
  14. linux下java基于UDP编程聊天_基于Linux下的UDP编程
  15. 数学专业英语--2.5(几何)
  16. ElasticSearch 7.7.0 核心篇
  17. ios(苹果)设备直播流媒体 服务搭建
  18. 网页数据抓取之当当网
  19. vs2015 选中代码 突出显示
  20. BUUCTF:[CSCCTF 2019 Qual]FlaskLight

热门文章

  1. C语言实现通讯录管理系统(动态内存分配版)
  2. Slic3r基础知识
  3. 新手在Kail Linux中使用pdfcrack 来破解pdf密码
  4. gg修改器免root下载
  5. 计算机网络:三种交换方式
  6. 天正电气html帮助,T20天正电气使用技巧
  7. ArcGIS栅格数据图层空间相关性分析方法
  8. 译文-Teach Yourself Computer Science-自学计算机科学
  9. python修改pdf内容
  10. Python基于Django会议室预约系统设计