独家分享| 爬虫框架编写-python篇
Posted 腾讯课堂Coding学院
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了独家分享| 爬虫框架编写-python篇相关的知识,希望对你有一定的参考价值。
所在的的项目组是一个内容聚合类的项目组,在竞品对标的情况下,内容的数量和质量往往是决胜关键。质量可以请专人审核,数量如何从300的量达到1W+的量,就需要爬虫了。
之前也没有写过爬虫,第一次写还是直接接入的手机QQ浏览器的爬虫框架,使用异步+队列调用taf接口,进行爬虫。后面该框架也停止维护,而且新需求往往都是一次性要求,为此写一个tafcpp也是不划算的。
所以开始python+爬虫的探索路径。
环境/工具
OS: OSX
Language: Python 2.7
Library: lxml,configparser,selenium
Tools:Chrome ,googledriver
静态网页是比较好抓的,直接用urllib2加载网页,然后用xpath进行筛选就好了。但是网站往往要进行反爬虫处理,即根据ua,设置Renferce等在http头信息中进行判断
为了提升抓取速度,这里采用8进程去抓取。
Q:为什么采用进程而不是线程?
A: 线程在少量抓取任务的时候,是没有问题而且效率相当高的,但是在大量任务,上10W的数量的时候,就会出现卡死的现象,这里我没有找到根本原因,有很多人遇到,但是也没有给出一个行之有效的方法,所以我这边改成了进程池去做抓取
初始化环境
这部分主要还是定义了一个类,这个类里定义了一些变量,方便后面调用,并且初始化了配置文件,已经设置 代理(proxy)
构造进程池
这里就直接上代码了
获取url内容
在上面process_url(param url)中,简化后大概就是两件事:
调用get_url_content(param url)获取网页内容,并返回一个长文本
调用xpath_html(param url,param rule)获取指定字段,其中rule指的是 xpath语句
获取网页长文本
这部分代码比较长,因为设计网络必然有很多异常处理,所以下面是简化后的代码
使用xpath解析网页文本
这部分代码相对简单,因为所有的数据处理都已经在lxml中封装好了
数据清理、入库
随后就是针对筛选出来的数据,进行数据清理,比如:移除空格等特殊,字段判空等处理。
最后就是形成一张相对条理的表格进行入库了
动态页面
动态页面比较难抓,因为会涉及到登陆,延迟加载,需要用户点击翻页以及代码混淆的问题。
因为 暂时还没有涉及达到登陆的模块,所以以后遇到,我会再补充
最近抓取google的网站,google的网站所有类名,id名都有混淆,所有网页内容都是通过js做的延迟加载。普通的静态网页抓取方案抓取下来往往只能得到一堆js文本,根本抓不到任何东西
selenium + Chrome 模拟用户浏览
Selenium Python 提供了一个简单的API 便于我们使用 Selenium WebDriver编写 功能/验收测试。 通过Selenium Python的API,你可以直观地使用所有的 Selenium WebDriver 功能
Selenium Python提供了一个很方便的接口来驱动 Selenium WebDriver ,例如 Firefox、Chrome、Ie,以及Remote ,目前支持的python版本有2.7, 3.2, 3.3 和 3.4.
这里我们的实现逻辑是,通过 selenium 拉起chrome浏览器,通过chrome浏览器去加载网页,加载完成后,通过xpath语句去匹配点击控件,然后发起点击事件来,使得网页加载完全后,把整个页面拉下来进行匹配筛选数据即可
使用这种方式有几点好处
无需设置http头
无需担心被屏蔽
可以持续稳定爬取
但也有些问题
慢,真的很慢
如果开多进程或者多线程,机器内存是一个瓶颈
强行开启多进程 chrome浏览器偶尔会crash而导致的数据丢失
某些操作会因为特殊原因,比如页面不规则,窗口大小不规则,而导致某些动作丢失
实现
这里的实现比较简单,排除掉需求特有的代码外,就几行代码而已了。我这里就只贴一下简化后的代码了
至此,一个动态网页抓取完成了。
END
以上是关于独家分享| 爬虫框架编写-python篇的主要内容,如果未能解决你的问题,请参考以下文章