18年初,还在实习期的我因为工作需求开始接触Java爬虫,从一个网站爬取了163W条poi数据,这是我人生中写的第一个爬虫,也是唯一的一个Java爬虫。后来这些poi数据也成了我毕业设计中的一部分。后来开始学习Python爬虫以及爬虫框架Scrapy,尤其是Scrapy,前前后后研究了一个多月,并利用Scrapy构建了千万级数据的ICA(互联网内容识别)资源库。
写爬虫系列的目的主要是想记录一下自己学习爬虫的经历,以及遇到的一些问题,也希望能够给爬虫初学者带来一些启示。之前给同事普及爬虫的时候,自己动手做了人生中的第一个PPT,所以爬虫系列文章将围绕着这个PPT来开展。
目录
如图,将从四个方面来介绍爬虫。
很多人包括我在内,刚开始听到爬虫的时候都会有一种朦朦胧胧、遥不可及的感觉。很多人觉得只有程序员才需要使用爬虫,其实并不是。至少,Python处理文档和爬虫的能力是面向日常工作的。
举个栗子:有人需要每天从各个网站上粘贴成百上千条数据到excel中,如果使用爬虫,一个requests、pandas或xlwt就搞定了,几十行代码而已。日常上线需求需要根据模板来写三个文档进行上传,前前后后粘贴需要四五分钟,后来我为了偷懒用Python写了个程序打包成exe,点击一下几秒就完成了。所以,Python让日常工作工作更高效,值得更多的人学习。
爬虫入门
概念
什么是爬虫?
爬虫库可以分为两个部分。一是请求部分,主要负责请求数据,例如Python的requests;二是解析部分,负责解析html获取数据,例如Python的BS4。
爬虫做了什么工作?
模仿人的行为从网页获取数据。一个人,需要先打开浏览器、输入网址,从网站后台获取网页并加载到浏览器展示,最后才能获取数据。爬虫的请求部分,就相当于浏览器的角色,会根据你输入的url从网站后台获取html,而解析部分就会根据预先设定的规则,从html中获取数据。
而开发者的工作,一是装饰请求部分,例如在请求头中添加User-Agent、Cookie等,让网站觉得是一个人通过浏览器来访问的,而不是一个程序。二是通过选择器来编写规则,从页面获取数据。
这是浏览器的请求头内容。
请求头
技术栈
做爬虫需要什么具备什么样的技术?是不是只有大佬才可以?其实并不是。这里主要分为两个层次要求。
编程语言:只需要有Java或者Python基础即可,有基本的Html阅读能力以及CSS选择器、Xpath选择器、正则表达式的使用能力。
数据存储:爬取的数据要只有存储下来才有意义。数据可以保存在文件或数据库中,这就要求开发者有文件读写或数据库操作的能力。对于数据库,掌握基本的表结构设计、增删改查的能力即可。
开发者工具:爬虫开发者使用最多的工具,各种浏览器按下F12都会弹出。通常用来拦截请求,定位元素,查看JS源文件。
开发者工具
在爬虫的开发中,会遇到各种各样的问题,就需要有独立思考和解决问题的能力。目前,很多网站都采用了异步加载数据或JS加密,所以需要具备Ajax和JS方面的知识。
网络知识。基本的状态码:20x成功,30x转发重定向,40x请求不存在、50x服务端问题。有时候还需要TCP的知识,例如established、time_waited等TCP连接状态代表着什么。
基础概念我们已经讲完,怎么来开发个爬虫呢?举个栗子:
斗罗大陆
如图,是星斗苍凉、月色照亮的动漫斗罗大陆的播放页面。我们以此为例,开发爬虫来获取页面数据。
Java爬虫的开发主要使用Jsoup。
引入Jsoup依赖:
程序开发:
对于Python爬虫的开发,使用的是requests和bs4。
安装模块:
程序开发:
上面两个程序输出相同的结果:
至此,斗罗大陆的爬虫开发工作就完成了。从代码也能看出来,请求部分也就一行,大部分都是解析部分的,这里使用css选择器来完成数据的解析。
我们再来看看请求部分获取的网页内容:
请求响应内容
当然,一个完整的爬虫程序除了以上模块,还需要有存储模块,必要的时候还需要代理池模块。其次,对于整个大型网站数据的爬取还需要对网站进行深度/广度遍历来完成,还需要考虑到如果爬虫中断,如何从断点开始继续爬取等方面的设计。这一部分的内容后面会写。
这一篇文章不对程序的开发做过多的深入探讨,只讲述爬虫的概念以及程序演示。而下一篇文章会根据上面的程序,着重对Jsoup和requests、bs4模块以及css选择器的使用深入探究。期待下一次相遇。