spider编写规则 - ShichaoMa/structure_spider GitHub Wiki

1 spider必须继承自StructureSpider

2 若执行分类抓取则需要配置item_pattern = (), page_pattern = (),其中:

  • item_pattern元组中的元素为分类页中每个item链接所对应的xpath表达式
  • page_pattern元组中的元素可以是下一页链接所所对应的正则表达式,或者其它规则,详见item_pattern和page_pattern编写规则

3 提供get_base_loader静态方法,传入response,返回CustomLoader对应一个Item,即CustomLoader(item=YourItem())

4 提供enrich_data方法,必须被enrich_wrapper装饰,其中:

  • 传入item_loader, response,使用item_loader的方法(add_value, add_xpath, add_re)添加要抓取的属性名(必须在item中有定义)及其对应表达式或值。
  • 如此次渲染需要产生子请求,比如抓取豆瓣作者详细信息,则通过response.meta["item_collector"]提供的(add, extend)方法, 将(prop, item_loader, request_meta)添加到item_collector中。其中:
    • prop: 下次请求获取的全部字段如果是做为一个子item返回,子item在其父item中对应的字段名称。如"author": {子item数据结构},此时prop="author"
    • item_loader: 用来抽取下次请求中字段的item_loader,如果下次请求返回子item,则此item_loader必须是子item构造的item_loader,如CustomLoader(item=AuthorItem())
    • request_meta: 组建Scrapy.Request所需要的kwargs。type: dict

5 下次请求所回调的enrich函数名称为 enrich_'prop'。比如:enrich_author

6 可以为spider类提供一个need_duplicate方法用来去重,传入详情页链接url,返回用来判定重复的部分。比如两件链接很像https://jd.item/12345http://jd.item/12345,但链接是不同的,直接返回链接不可能判定重复,可用返回链接的共同部分12345,则去重成功。

7 可以重写基类的方法来实现个性化抓取