python爬虫我爱编程

PySpider踩坑记

2018-05-19  本文已影响33人  祗談風月

没有用过框架写爬虫,有人推荐了pyspider,我也没有和别的框架比对,就直接上手先用了。

使用感受

框架的封装性带来的优缺点在这里显示的淋漓精致...

优点

缺点

开发环境

安装启动

参考官方Quick start可以很快上手: http://docs.pyspider.org/en/latest/Quickstart/

# 一键安装pyspider
pip install pyspider

# 会在当前目录下建立data文件夹,保存任务相关代码,数据,任务进度等,如果换了路径启动就找不到了
# 启动所有pyspider的组件,更多命令可以 pyspider help
pyspider all 

之后可以在 http://localhost:5000/ 看到启动了一个web ui,用来调试和运行pyspider的

默认没有phantomjs,需要自己手动下载,然后配置{phantomjs_home/bin}路径到本机的环境变量,重启pyspider即可,注意要确认环境变量生效pyspider才能找到phantomjs。

框架机制补充

这里不一一罗列API了,主要讲我使用过程中碰到的一些特性

from pyspider.libs.base_handler import *


# pyspider的实现类需要继承BaseHandler,实现基本的几个接口
class Handler(BaseHandler):  
    # 放一些self.crawl函数请求页面时的http请求头:referer,user-agent等
    crawl_config = {
    }

    # pipline的起点,这里请求的url最好是下文请求的父级url,否则爬取不了,我出过这样的问题,不知道是不是就是这样的机制
    # 只会执行一次,即如果on_start中有循环self.crawl,只会执行最后一次
    @every(minutes=24 * 60)  # 任务运行之间的间隔,用来不停的补采过期的数据
    def on_start(self):  
        # 爬取网页的核心函数,支持phantomjs解析,需配置fetch_type='js'
        self.crawl('http://scrapy.org/', callback=self.index_page)

    #  理论上是爬取分页的,但是如果有多层爬取也得靠index_page,需要在self.crawl中设置callback为index_page,形成递归,当然如果逻辑不通,用if-else分开即可,如果有人发现了更好的多层爬取的方式,拜托告诉我一声...
    @config(age=10 * 24 * 60 * 60)  # 爬取结果的有效期
    def index_page(self, response):
        # response.doc得到一个pyquery对象,和操作一个jquery对象相似,相关api看pyquery官网即可
        for each in response.doc('a[href^="http"]').items():
            self.crawl(each.attr.href, callback=self.detail_page)

    # 输出解析结果,如果用默认的sqlite,只能return一个dict,如果自己复写了on_result,就可以随意返回了
    @config(priority=2)
    def detail_page(self, response):
        return {
            "url": response.url,
            "title": response.doc('title').text(),
        }

    # 自定义结果处理方式
    def on_result(self, result):
        ...
        # 处理结果
        ...

    # task结束时调用
    def on_finished(self, response, task):
        ...
        # 任务关闭时的操作,可以用来关数据库连接之类
        ...

启停任务

其他

参考

上一篇 下一篇

猜你喜欢

热点阅读