简介
pyspider是一个国人编写的强大的网络爬虫系统并带有强大的WebUI。采用Python语言编写,分布式架构,支持多种数据库后端,强大的WebUI支持脚本编辑器,任务监视器,项目管理器以及结果查看器。官方文档地址:http://docs.pyspider.org/en/l...。
安装
首先确保已有python与pip,如若没有自行安装python环境以及pip模块。
pyspider同时支持linux与windows环境,但作者说了由于他自己也没有windows的工作环境所以windows下pyspider无法保证性能与正常工作(反正我在windows下的pyspider没法儿用),所以推荐使用linux运行。
官方文档上有一键配置环境的指令,这些都是运行pyspider所必要的环境。
apt-get install python python-dev python-distribute python-pip \
libcurl4-openssl-dev libxml2-dev libxslt1-dev python-lxml \
libssl-dev zlib1g-dev
不过对于ubuntu系统,貌似其实只需要libcurl4-openssl-dev和libssl-dev就可以了。
完成基本环境配置,运行pip install pyspider即可安装pyspider。
运行
在命令行中输入指令pyspider即可,一般默认端口为5000。之后在浏览器中输入localhost:5000即可看到web UI界面。
选择右侧的“create”按钮,可以新建爬虫脚本并设置初始的URL,完成创建后进入查看
左侧可以显示抓取的信息。"web"即直接在下方白色区域显示网页,"html"即显示html文件,"follow"表示在执行完所有“第一轮”回调函数后还有多少url待爬取
点击网址右侧的“play”按钮,即可针对该网址进行爬取,并输出想要的信息。
这一界面主要用来调试,毕竟你不可能手动把那么多按钮全按一遍。调试无问题后,返回到之前的界面,将“TODO”改为“running”,并点击右侧的“run”按钮,即可开始运行爬虫。点击"active task"可以查看爬虫的运行情况,点击“result”则可查看结果,结果保存的是你在爬虫脚本中return的信息。更多基础内容请查看http://docs.pyspider.org/en/l...
但是这个web ui有的时候会有问题(反正我这边现在就有问题),可能你调试时没有任何问题,但使用webui运行却迟迟没有结果。这时可以考虑转用命令行运行,
pyspider one spiderfile.py
即可开始运行你的爬虫程序。更多关于命令行的命令,请查看http://docs.pyspider.org/en/l...
url设置
有时我们所需的内容是包含在html文件中的,有时则是由AJAX异步加载得到的,原始的html文件中并没有我们要的数据,而爬下来的html又不会执行js脚本。使用phatomjs是一种方法,但也可以去查看异步加载的请求网址,转而设置对该url进行爬取。
查看方法即打开“开发者工具”的“网络”部分,刷新网页,即可看到所有的请求信息,找到你需要的数据对应的请求即可。
网页元素筛选
爬虫可以爬取到网页信息,但显然我们并不需要所有的网页信息,否则使用urllib2进行http访问就行了。在回调函数的返回值response中,你可以调用多个方法将它转换成不同的便于删选的类再进行操作,这里我们使用response.doc将其转为pyquery对象。
pyquery对象最简单也最好用的,就是使用css selector进行筛选。如果你想的数据是标签是某个class,就加入.classname的selector;有某种id,则加入#idname的selector;属于某种标签,则加入tagname的selector;有某种属性值则加入[attr="xxx"],或者简单点属性值开头是某个字段则加入[attr^="xxx"]。
常规的筛选如response.doc('.class #id tag [attr=]'),这样写表示标签或类并列或后面的嵌套在前面里,这样返回的是符合条件的pyquery对象,response.doc('')则可以直接将整个html文件内容转为pyquery并返回。
若符合条件的pyquery有多个条目,可以使用pyquery.items()返回每个条目进行处理,返回的item仍然是pyquery对象,pyquery.text()可以获取html标签内的内容,pyquery.attr.attrname可以获得对应标签的属性值。
pyspider提供了方便的css selector判断工具,在之前的详情页点击最左侧的"enable css selector",在web页面中选中某一区域,即可显示该区域含有的css selector中最少重叠的部分(不大懂怎么形容,就是用显示的即可选中该元素同时选中最少的其他元素),同时会显示根据这个selector选中的其他元素,加粗部分的css即所需部分。
有的时候,无法根据CSS来进行甄别该元素是否为所需元素(有些网页就是这样),这时可以使用parents、siblings等方法查看其父标签、兄弟标签等的内容来进行筛选。更多pyquery的方法请查看http://pythonhosted.org/pyque...。
对爬虫进行设置
大多数网站现在都有反爬虫机制,所以简单的爬虫如果打算爬取大量数据则会被临时甚至永远禁止访问。但所谓道高一尺魔高一丈,有反爬虫自然也有反反爬虫。
反爬虫机制首先是你被发现在明显以非常规的频率访问,所以最简单粗暴也最有效的方法就是将爬虫运行设置的慢一点,频率第一点。在web ui中设置rate/burst或者在脚本文件开头使用注释的方式进行设置。rate表示每秒中进行的请求数,小于1时表示数秒请求1次;burst则是最大并发数。
# rate: 1.0
# burst: 3
但有时这样确实太太太慢了,而且并不是所有网站都有很严格的反爬虫机制。很多网站使用的方式是检查请求的headers或cookie,非浏览器在默认情况下请求的headers是跟浏览器不一样的,同时也没有cookie。headers和cookie可以在Handler类的crawl_config中进行设置,也可以在执行self.crawl时对对应参数进行设置。
crawl_config = {
'headers': {
'key': 'value',
},
'cookie': {
'key': 'value'
},
# ......
}
or
self.crawl(url, headers={}, cookie={}, callback=xxx_page)
还可以考虑使用代理,轮换IP进行请求爬取,设置方式与headers和cookie类似,key为proxy,值为IP地址的字符串。
结语
pyspider还有更多更强大的功能,有待有兴趣的各位去探寻。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。