我正在努力从多个网站上抓取项目(使用scrapy相同)。我试图抓取的项目并不总是定义良好,可能在文本中。所以我使用字符串匹配来识别项目。然而,这也产生了一些不需要的信息沿着我所需的数据和我的刮刀需要很长时间刮取不需要的信息。为了避免这种情况,我对刮取的项目数量设置了上限。通过使用“if”条件,我在达到上限时引发CloseSpider()异常。这种方法工作正常,直到我只有一个域名。如何将其扩展到多个域。
class CustomSpider(CrawlSpider):
name = "myspider"
start_urls = ['https://www.example1.com/']
allowed_domains = ['www.example1.com']
rules = [Rule(LinkExtractor(allow=()), callback='parse_info', follow = True)]
def parse_info(self, response):
scrape_count = self.crawler.stats.get_value('item_scraped_count')
if scrape_count == 20:
raise CloseSpider("Limit Reached")
字符串
我的问题是,如何为以下场景扩展此代码:
class CustomSpider(CrawlSpider):
name = "myspider"
start_urls = ['https://www.example1.com/', 'https://www.example2.com/']
allowed_domains = ['www.example1.com', 'www.example2.com/']
rules = [Rule(LinkExtractor(allow=()), callback='parse_info', follow = True)]
def parse_info(self, response):
建议此处更改逻辑
scrape_count = self.crawler.stats.get_value('item_scraped_count')
if scrape_count == 20:
raise CloseSpider("Limit Reached")
3条答案
按热度按时间x6yk4ghg1#
看看这个玩具的例子:
字符串
它在属性
scraped_count
中跟踪每个域所抓取的项目数。属性limit
保存每个域的限制。该逻辑被放在process_request
方法中,该方法作为参数传递给Rule
,并为该规则提取的每个请求调用(请参阅文档)。当超过限制时,请求将被过滤,否则将返回未更改的请求并进行处理。如果您需要更复杂或适用于多个spider的东西,我建议您扩展
CloseSpider
扩展类,在那里实现逻辑并替换settings.py
中的默认类。esbemjvw2#
您可以使用CLOSESPIDER_ITEMCOUNT
一个整数,它指定项目数。如果爬行器抓取的项目超过这个数量,并且这些项目被项目管道传递,那么爬行器将被关闭,原因是closespider_itemcount。当前在下载器队列中的请求(直到CONCURRENT_REQUESTS请求)仍会被处理。如果为零(或未设置),蜘蛛不会被传递的项目数关闭。
pcww981p3#
字符串