我的认为PySpider是一个十分容易上手并且功能强大的Python爬虫框架。支持多线程爬取、JS动态解析、出错重试、定时爬取等等的功能。最重要的是,它经过web提供了可操做界面,使用很是人性化。
最近因为工做的缘由,秉承这服务广大高考考生和家长的态度ヾ(≧O≦)〃嗷~,我搜集了2017年2000多所高校的高校招生章程。css
安装PySpiderhtml
首先先要安装pip跟phantomjs:python
1web |
|
phantomjs是一个基于webkit内核的无界面浏览器,提供JavaScript API接口。在PySpider中用于JS动态解析。浏览器
以后能够用pip直接安装PySpider:网络
1多线程 |
|
经过如下指令就能够启动PySpider啦:框架
1 |
|
打开浏览器访问http://localhost:5000能够看到web界面:
以后点击Create能够新建一个爬虫项目:
以后就能够看到一个爬虫操做的页面:
页面分开为两半。左半边是爬虫结果预览,右半边是爬虫代码编写区域。
左侧上半部分是爬虫的每一个网络请求的解析。下半部分是爬虫页面浏览。
最下面有5个按钮:
enable css selector helper按钮:点击它启动css selector helper。用鼠标点击页面的元素能够很方便地生成该元素的css选择器表达式;
web: 点击能够查看抓取的页面的实时预览图;
html: 点击能够查看抓取页面的 HTML 代码。
follows: 若是这一层抓取方法中又新建了网页请求,那么接下来的请求就会出如今 follows 里。
messages: 一个控制台,用于显示爬虫输出的信息。
分析下网站吧
咱们要爬的是教育部阳光高考信息公开平台:http://gaokao.chsi.com.cn/zsgs/zhangcheng/listVerifedZszc--method-index,lb-1,start-0.dhtml
一共有28页'start-'后边接的是页数的编号。
因此我打算这样写on_start方法来开始这条爬虫:
1 2 3 4 5 6 |
|
先定义页码前的地址,以后定义页码。crawl方法新建了请求以后把返回的结果传给callback参数里的方法。
按下save保存,再按run试着运行一下吧:
能够看到follow按钮上面出现了28的数字,这就是咱们新建的28个页面请求啦。而后咱们点击左侧第一个绿色箭头,能够继续爬取第一页这个页面。
里边灰色字体的是暂时没有公布2017年招生章程的学校,而咱们须要选定蓝色字体的学校以及其连接。点击html查看其网页源码:
能够看到咱们要选择td下面的没有style="color:gray"这个属性的a标签。
那么css表达式能够这么写:td a:not([style="color:gray"])[target="_blank"]
补充index_page方法:
1 2 3 |
|
pyspider爬取的内容经过回调的参数response返回,response有多种解析方式。
一、response.json用于解析json数据
二、response.doc返回的是PyQuery对象
三、response.etree返回的是lxml对象
四、response.text返回的是unicode文本
五、response.content返回的是字节码
response.doc()实际上是调用了 PyQuery框架,用 CSS 选择器获得每个公布了2017年招生章程的连接,而后从新发起新的请求,回调函数就是 detail_page。修改完save以后run,就新建了80个请求了:
点第一个请求就能够进入北京大学这几年招生章程的页面啦:
咱们想要的是第一个2017年的章程,这时候点击enable css selector helper按钮,以后点一下2017的章程连接,能够看到它给咱们的css选择器表达式选定了以前全部的章程:
不过没关系( ̄_, ̄ ),2017年的章程老是在第一个,因此咱们能够只选定第一个给回调函数处理。
1 2 3 |
|
response.doc()方法返回的其实是个选择器对象而不是列表。因此不能用列表切片操做,用第一个next能够返回选择器里的第一个元素,那就是2017年的章程啦。以后给constitution_page方法处理。
接下来就到了简章内容的页面啦。
1 2 3 4 5 6 7 8 9 |
|
咱们选定了全部的p标签,从第四个开始就是章程的正文,而后写入文件完成编写爬虫任务。ヽ(✿゚▽゚)ノ
记得save以后回到Dashboaed主页面。把项目的status改成running,按run就能够开始爬爬爬啦。
是否是感受速度有点慢?rate/burst选项能够调节速度的。rate是指每秒执行多少个请求,burst是设置并发数,如 rate/burst = 1/3 这个意思是爬虫每1秒执行一个请求,可是前三个任务会同时执行,不会等1秒,第四个任务会等1秒再执行。默认的1/3速度比较慢。能够调到比较高,而burst不能小于rate。