爬虫总结:
自2016年十月中旬至此,前后花费了一个半月写爬虫,也是平时零零散散写的爬虫,从最简单的页面获取,到页面数据解析,再到后面的翻页,保存到Excel中,再到获取动态网页,加载JSON数据,到最后的将数据保存到数据库,中间踩的坑又不少,最近就开始简单的总结吧。
Python 爬虫的几个步骤:
1.爬虫向目标服务器发送请求(get/post)
2.服务器响应请求,返回结果,爬虫程序解析返回的请求
3.解析返回的结果,处理和清洗
4.存储数据
自己当初使用的是Python 2.7的环境
1.从最简单的页面获取而言,有几个库(模块)的使用,用到了urllib2,urllib,requests等。
具体的使用,通过urllib2获取网页的HTML代码,使用的过程中,为了防止爬虫被ban,在获取某些页面的过程中,添加了浏览器的headers,将爬虫伪装成浏览器去访问页面,常见的伪装就是加上USER-AGENT(UA),也有部分网页即使加上了headers也没用,这个时候,就要往爬虫的headers方面去下功夫,到底是什么限制了爬虫的访问。
目前,在爬取个人的关注方面出现了问题。为了更像浏览器,在获取多个页面的时候,就要提前设置访问的间隔时间,使用time()这个系统库,再利用的是random()库,获取任意的(0.0-1)时间,用获取到的时间进行处理,最后,间隔时间在5s以上为佳。
2.在页面获取之后,要对页面的数据(html代码)进行处理。
主要的方式,就是通过BeautifulSoup这个库,来解析页面,解析的依赖库,主要就是html.parser和lxml这两个解析器,其中,html.parser和lxml这两个解析器各有优劣,但是对lxml而言,更好的处理方式,是通过DOM来解析,能获得更好的效果,在写爬虫程序前,要分析爬虫的获取的数据,分析网页的结构,获取正确的位置,可以借助F12这个浏览器的工具,来快速定位所需要的信息的位置。
在页面解析的过程中,除开BS4这个库之外,还使用到了re(正则表达式)这个模块,许多要获取的信息,在通过BS4解析之后,还是要进一步的清洗,提取出关键的数据,此时需要学习正则表达式的基本知识。尽管在后面,有提到可以使用string这个库的使用,在一定程度上可以减缓正则表达式在解析页面过程中的使用。但是这都是后知后觉了。
3.获取需要的数据后,要对数据进行存储。
自己最开始学习使用的是用的文件存储,比如,使用python的文件读写,写入到txt格式,但是在此的过程中,发现任务量比较大,如果使用txt格式存储,就不太适合了,到后面所有的数据都是用的Excel格式存储的。主要使用的库是XLWT,在写入的过程中,发现某一列数据可能会写入多行,这个时候,定义下函数来存储就是比较好的了。
4.获得JSON数据,刚开始接触到这个,其实是在文章页面,获得文章信息之后,需要再获取评论的信息,在评论区,是通过动态加载而来,第一页数据使用的Ajax将评论异步加载过来的,在网络上寻求帮助之后,提供了几个建议:
a.通过浏览器加载渲染,就是实际上通过浏览器来访问,并且获得评论的信息,但是发现这种方式的效率太低,而且对电脑要求的比较高,需要下载Webdriver和PhantomJS 来解析JS
b.到后面,自己在反复尝试之后,发现,可以直接访问JSON数据,就是从浏览器发送请求,然后服务器端发送相关的数据页面,这样的方式既达到了自己的效果,又使得电脑的负载更低,使用的方向有8K+的基本信息的页面,以及每个人文章的评论的内容,当然,获取的JSON数据并不是我们需要的,我们需要处理,处理成干净的JSON数据,然后利用JSON这个库,来处理,将其处理成字典数据,最后,在字典的里面,通过键-值来提取我们需要的数据。
5.连接到数据库,这一部分,主要是同学完成的。其中的重难点,应该是数据库的设计,因为在爬取数据的过程中,发现了许多的问题,并不是像老师说的那么简单就行,表格之间有关系,而一张表又不可能写完所有的信息,在此,就想着使用数据库来存储数据。
6.IP代理的问题,在实验室,实际上就只有一个IP,这样限制了爬虫的速度,不可能爬取太快,一旦稍微速度快了,就会错误,网站拒绝提供服务,会提醒DDOS攻击(10054)错误。因此,就想着在此基础上,想着爬取网络上的IP代理,使用代理访问(主要是高匿代理),但是目前,高匿代理,在许多代理网站上都是没用的。