我有一个使用链接提取器来移动分页并解析详细信息页面的刮刀,一切正常。示例代码如下:
class SampleSpider(CrawlSpider):
name = 'sample'
start_urls = ['https://www.some-pagination-page.com']
rules = (
Rule(LinkExtractor(restrict_xpaths='//*[contains(@class, "paging-next")]')),
Rule(LinkExtractor(restrict_xpaths='//*[contains(@class, "b-button_primary")]'), callback='parse_item'),
)
def parse_item(self, response):
#Code block related to the parsing of item ...
return item
现在我想使用同一个蜘蛛直接解析详细页面而不分页... 基本上我想用scrapyrt使用这个蜘蛛,我想发送一个参数,表明这是一个详细页面,详细信息页面为start_url, 这样我就可以直接解析该页面并快速返回结果。 在那一刻我解决了重复这个爬虫的问题,并以这种方式删除了规则提取器:
class SampleSpider(scrapy.Spider):
name = 'sample'
start_urls = ['https://www.some-details-page.com']
def parse(self, response):
#Code block related to the parsing of item ...
return item
为了避免代码重复,我如何修改蜘蛛,以便它可以与分页start_url和单个详细信息页面一起用作start_url?
是否可以禁用规则? 什么是最好的方法?
答案 0 :(得分:1)
我不知道这是否是最好的主意,但我这样做是通过重写start_requests
并根据蜘蛛参数指定要使用的回调:
class MySpider(CrawlSpider):
...
def start_requests(self):
if getattr(self, 'url'):
yield Request(
url=self.url,
callback=getattr(self, getattr('callback', 'parse_item'))
)
else:
for url in self.start_urls:
yield Request(url)
这样您可以在调用蜘蛛时指定url
参数(以及callback
方法,默认为parse_item
):
scrapy crawl myspider url="http://myurl" callback="parse_item"
如果没有,它将表现为正常CrawlSpider
,因为parse
方法是Request
的默认回调,parse
方法是负责的rules
方法编译sub compareHashes(%$) { ... }
。