开发,设计,生活

网络爬虫系统

  • 2014-05-26 05:23:06 2014-06-18 08:56:20[U] 网络爬虫系统

    异步并发的数据传递问题

    scrapy 的网络请求是基于 twisted 的异步并发框架,请求和响应都是在异步回调中完成。因此请求的附加数据传递是个问题。

    例如,有一个待请求的url列表

    myurls = [{"name": "163", "url":"http://www.163.com"},
              {"name": "qq", "url":"http://www.qq.com"},
              {"name": "sina", "url":"http://www.sina.com.cn"}]
    
    如果在解析响应的时候需要使用 url 的名字,不能使用 spider 的成员变量传递(在异步并发的框架下,不能确定当前返回的请求与成员变量的值是同一请求相关的)。可以通过 request.meta 传递这个附加数据,返回的 response 对象中存在 request.meta 对象的引用,通过访问这个对象使用附加数据。


    scheduler 请求队列的存储

    scrapy 解析返回的页面后,把生成的请求对象(页面中提取的 url 创建的新的请求对象)放入 scheduler 的队列(可能是内存,也可能是磁盘)。 当爬虫的工作任务比较多,持续工作的时间比较长时,对内存的需求会过大,而且会有数据丢失的风险。 这个时候就需要考虑是不是需要定制 scheduler 的队列来解决问题。例如把新的请求或者 Url 放入入一个中间存储器,使用时重新从中间存储队列中获取请求数据。


    发布 scrapy 项目到 scrapyd 服务

    scrapyd 是运行 scrapy 的服务,可以发布 scrapy 到 scrapyd 中,并且通过 API 控制 scrapy 的运行。

    scrapyd 的接口是 Restful 风格的 JSON API。

    # scrapyd 命令简介
    
    # 查看有效的 scrapyd 服务
    scrapyd-deploy -l
    
    # 发布项目到 scrapyd (在 scrapy 项目的目录下运行)
    scrapyd-deploy scrapyd -p project1
    
    # 运行 scrapy
    curl http://localhost:6800/schedule.json -d project=myproject -d spider=somespider
    # 输出结果 status ok 表示成功发布,jobid用来停止job
    {"status": "ok", "jobid": "6487ec79947edab326d6db28a2d86511e8247444"}
    
    # 停止 job
    curl http://localhost:6800/cancel.json -d project=myproject -d job=6487ec79947edab326d6db28a2d86511e8247444