Scrapy 一些常用代码片段。

1. 如何停止一个爬虫,并且下次启动的时候,从上次停下的地方继续爬取。

# Ctrl + C, 可以停止,下次在运行的时候会继续。
class SplashSpider(scrapy.Spider):
    name = 'x'
    allowed_domains = ['x.com']
    custom_settings = {"JOBDIR": "spider_name_01"}  # 添加这这一行。

# 其中 custom_settings, 这里指的是针对当前这个爬虫文件进行特定的设置。

2. meta 的问题

  • 借助 meta 传递自己定义的参数 yield Request(a_img_url, meta={'name': item['img_name']})
  • 遇到递归解析函数的时候,最后也要带上这同一个 meta.
  • meta 最好留给内建的中间件或插件来使用。

3. Request 里面其他有用的参数

  • flags (list) – 可以用作监控 logging ,以便记录当前这条 url 已经爬取过了。或是是其他信息。
  • cb_kwargs (dict) – 类似 meta,可以取代 meta, 取出来:response.cb_kwargs
  • body,带参数的请求,比如请求一个 api 的时候,参数应该放在 body里面, 而不是 meta. meta 有其他的用处。而且body接受的是一个字符串类型的值,因此注意序列化一下。
p = dict() 
yield scrapy.Request(base_url, body=json.dumps(p))

4. cookies 传递的问题

cookies 属于个人敏感信息,不要轻易发布出去。
最好是把 cookies 集中保存在别的地方,比如 secret.py, 然后再导入到具体的文件中。

5. selenium 异步请求。

# pip install scrapy-ajax-utils 貌似是国内的某个人写的。
from scrapy_ajax_utils import selenium_support, SeleniumRequest
@selenium_support
class SongSpider(scrapy.Spider):
    pass

yield SeleniumRequest(u, callback=self.parse_video)

6. 图片下载失败,错误处理

class WallpaperPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        for u in item["pic_urls"]:
            yield Request(u)

    def file_path(self, request, response=None, info=None, *, item=None):
        image_name = request.url.split('?')[0].split("/")[-1] + '.jpg'
        return image_name

    # 修改默认的错误处理函数,把下载失败的 itme 记录下来。
    def item_completed(self, results, item, info):
        for ok, x in results:
            if not ok:
                logger.log(logging.WARNING, x['url'])
        return item

你可能感兴趣的:(Scrapy 一些常用代码片段。)