使用同一个蜘蛛解析详情页和分页
Use the same spider to parse details page and pagination page
我有一个使用 link 提取器移动分页并解析详细信息页面的抓取工具,一切正常。示例代码如下:
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,
这样我就可以直接解析该页面并快速 return 结果。
目前我已经解决了复制这个爬虫并只删除规则提取器的问题,方法是:
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 ?
是否可以只禁用规则?
什么是最好的方法?
我不知道这是否是最好的主意,但我通过重写 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
s 的默认回调,而 parse
方法是负责编译 rules
.
我有一个使用 link 提取器移动分页并解析详细信息页面的抓取工具,一切正常。示例代码如下:
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, 这样我就可以直接解析该页面并快速 return 结果。 目前我已经解决了复制这个爬虫并只删除规则提取器的问题,方法是:
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 ?
是否可以只禁用规则? 什么是最好的方法?
我不知道这是否是最好的主意,但我通过重写 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
s 的默认回调,而 parse
方法是负责编译 rules
.