如何限制scrapy中每个域名的刮取项目数量?

pxy2qtax  于 2023-08-05  发布在  其他
关注(0)|答案(3)|浏览(177)

我正在努力从多个网站上抓取项目(使用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")
x6yk4ghg

x6yk4ghg1#

看看这个玩具的例子:

from __future__ import print_function

import collections
try:
    from urllib.urlparse import urlsplit
except ImportError:
    from urlparse import urlsplit

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

class MySpider(CrawlSpider):
    name = 'myspider'
    start_urls = ['http://quotes.toscrape.com/',
                  'http://webscraper.io/test-sites']
    allowed_domains = ['quotes.toscrape.com', 'webscraper.io']

    scraped_count = collections.defaultdict(int)
    limit = 10

    rules = [Rule(LinkExtractor(allow=()), callback='parse_page',
                  follow=True, process_request='process_request')]

    def parse_page(self, response):
        yield {
            'url': response.url
        }

    def process_request(self, request):
        url = urlsplit(request.url)[1]
        if self.scraped_count[url] < self.limit:
            self.scraped_count[url] += 1
            return request
        else:
            print('Limit reached for {}'.format(url))

字符串
它在属性scraped_count中跟踪每个域所抓取的项目数。属性limit保存每个域的限制。该逻辑被放在process_request方法中,该方法作为参数传递给Rule,并为该规则提取的每个请求调用(请参阅文档)。当超过限制时,请求将被过滤,否则将返回未更改的请求并进行处理。
如果您需要更复杂或适用于多个spider的东西,我建议您扩展CloseSpider扩展类,在那里实现逻辑并替换settings.py中的默认类。

esbemjvw

esbemjvw2#

您可以使用CLOSESPIDER_ITEMCOUNT
一个整数,它指定项目数。如果爬行器抓取的项目超过这个数量,并且这些项目被项目管道传递,那么爬行器将被关闭,原因是closespider_itemcount。当前在下载器队列中的请求(直到CONCURRENT_REQUESTS请求)仍会被处理。如果为零(或未设置),蜘蛛不会被传递的项目数关闭。

pcww981p

pcww981p3#

import scrapy

class MySpider(scrapy.Spider):
    name = 'my_spider'
    custom_settings = {
        'CLOSESPIDER_ITEMCOUNT': 100,  
    }

字符串

相关问题