@yacent
2016-08-04T17:21:43.000000Z
字数 1826
阅读 1078
开发工具
开始写爬虫的原因,是因为,平时在看react文档的时候,都需要打开浏览器,重新加载react的官网,因为自己在省外,没有这么多的流量,所以更多的时候,想直接用一份pdf来看会更好,又不用重新加载。
在开始爬虫之前,必须要有一些准备知识的储备,我是看了下面的这篇博客入门的,转载自 静觅 » Python爬虫学习系列教程
OK,有了爬虫的基础了解和知识之后,我们就可以开始了。
在该项目当中,用到的一些python库有如下的一些
requests
beautifulsoup4
lxml
phantomjs
selenium
weasyprint
requests
主要是用来发送HTTP的请求,它有点类似 urllib
库,只不过是功能更加齐全,然后 beautifulsoup4
的话,是将抓取到的网页进行解析,构造成html树,lxml
就是 beautifulsoup4
构造过程中可以使用的引擎之一,如果不选用,Python默认是使用原本的 html_parse
. phantomjs
可以把它想象成一个没有界面的浏览器,用这个而不直接用网页进行爬的原因,是因为这个效率更好,没有其他界面的加载等,在代码当中,对phantomjs浏览器也进行了设置,比如不加载图片,开启浏览器缓存等等,这些都是为了网络爬虫更快。selenium
是驱动器,有点类似于模拟人在网页上进行点击,也是将phantomjs 与 python进行连接的工具。最后就是使用 weasyprint
把抓下来的网页转成 pdf结构就好
实现流程:
1. 抓取react的首页,获取首页当中侧边导航栏的li中的a标签,把他们全部放入到一个数组当中 url_list
2. 根据上面获得的 url_list,循环数组,发送请求,此时候用到的就是配置的phantomjs的浏览器,不断进行爬虫,将爬虫结果源码放入到一个数组中 output
3. 循环结束,将output 外部加入 head 和 body标签就好
4. 用 weasyprint 将最后的网页 page.html 转成 pdf
遇到的困难:
phantomjs https
在用配置好的 phantomjs 发送请求,进行爬虫的时候,一开始是什么东西都抓不下来,导致后面程序无法进行下去,内容都为空,试了一下其他网站,发现有的网站可以,有的网站不可以,后来发现是 Https的原因,phantomjs的浏览器可能受到了限制,然后去搜索 phantomjs https的
相关字眼,发现在stackoverflow上面是有人提过这个问题,后来看到的解决办法就是配置 phantomjs 的浏览器设置,如下
service_args=['--ignore-ssl-errors=true',
'--ssl-protocol=any',
'--proxy=127.0.0.1:1080',
'--proxy-type=socks5']
设置好这个之后,忽略了ssl,页面成功抓取到,并且能够返回正常内容了
weasyprint 渲染pdf 有部分渲染不成功
在转换成pdf的时候,网页中的 code 实例部分,发现渲染出来,背景是有的,但是其中的代码却只显示在一行,猜是weasyprint对这个里面的某些属性不支持,在尝试了之后,查找weasyprint 和 css一些属性 bug的时候,的确是有一些会存在bug,慢慢定位到时因为 code代码部分,有一个 overflow
的属性,会导致weasyprint无法正确渲染,解决办法,就是在 div 的最后加一个 清楚浮动,强制外部div包含内部的div,有滚动条的代码部分,它都可以正常显示了,就全部内容,原本是有滚动条出现,无法渲染出来
phantomjs
PhantomJS是一个无界面的,可脚本编程的WebKit浏览器引擎。它原生支持多种web 标准:DOM 操作,CSS选择器,JSON,Canvas 以及SVG。
PhantomJS 可以用于 页面自动化 , 网络监测 , 网页截屏 ,以及 无界面测试 等
大家有没有发现之前我们写的爬虫都有一个共性,就是只能爬取单纯的html代码,如果页面是JS渲染的该怎么办呢?如果我们单纯去分析一个个后台的请求,手动去摸索JS渲染的到的一些结果,那简直没天理了。所以,我们需要有一些好用的工具来帮助我们像浏览器一样渲染JS处理的页面。
所以需要用PhantomJS 来实现网页截屏,存成pdf等
selenium
PhantomJS 用来渲染解析JS,Selenium 用来驱动以及与 Python 的对接