独家分享| 爬虫框架编写-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语句


获取网页长文本


这部分代码比较长,因为设计网络必然有很多异常处理,所以下面是简化后的代码


独家分享| 爬虫框架编写-python篇


使用xpath解析网页文本


这部分代码相对简单,因为所有的数据处理都已经在lxml中封装好了


独家分享| 爬虫框架编写-python篇


数据清理、入库


随后就是针对筛选出来的数据,进行数据清理,比如:移除空格等特殊,字段判空等处理。


最后就是形成一张相对条理的表格进行入库了


动态页面


动态页面比较难抓,因为会涉及到登陆,延迟加载,需要用户点击翻页以及代码混淆的问题。


因为 暂时还没有涉及达到登陆的模块,所以以后遇到,我会再补充


最近抓取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而导致的数据丢失

  • 某些操作会因为特殊原因,比如页面不规则,窗口大小不规则,而导致某些动作丢失


实现


这里的实现比较简单,排除掉需求特有的代码外,就几行代码而已了。我这里就只贴一下简化后的代码了


独家分享| 爬虫框架编写-python篇

独家分享| 爬虫框架编写-python篇

独家分享| 爬虫框架编写-python篇

至此,一个动态网页抓取完成了。

END


以上是关于独家分享| 爬虫框架编写-python篇的主要内容,如果未能解决你的问题,请参考以下文章

8个最高效的Python爬虫框架,你用过几个?

Python之Scrapy爬虫框架安装及简单使用

Python之Scrapy爬虫框架安装及简单使用

python爬虫篇之 Scrapy框架安装

python轻量级爬虫的编写

Python | 边学边敲边记第四次:初识爬虫框架Scrapy