【发布时间】:2022-03-20 15:30:24
【问题描述】:
我已经苦苦挣扎了一段时间,一直没能解决。问题是我有一个包含几百个 URL 的 start_urls 列表,但这些 URL 中只有一部分被我的蜘蛛的 start_requests() 消耗。
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class MySpider(CrawlSpider):
#SETTINGS
name = 'example'
allowed_domains = []
start_urls = []
#set rules for links to follow
link_follow_extractor = LinkExtractor(allow=allowed_domains,unique=True)
rules = (Rule(link_follow_extractor, callback='parse', process_request = 'process_request', follow=True),)
def __init__(self,*args, **kwargs):
super(MySpider, self).__init__(* args, ** kwargs)
#urls to scrape
self.start_urls = ['https://example1.com','https://example2.com']
self.allowed_domains = ['example1.com','example2.com']
def start_requests(self):
#create initial requests for urls in start_urls
for url in self.start_urls:
yield scrapy.Request(url=url, callback=self.parse,priority=1000,meta={'priority':100,'start':True})
def parse(self, response):
print("parse")
我已经阅读了 StackOverflow 上关于这个问题的多篇文章,以及 Github 上的一些帖子(一直到 2015 年),但一直无法让它发挥作用。
据我了解,问题在于,当我创建初始请求时,其他请求已经生成了一个响应,该响应已被解析并创建了填满队列的新请求。我确认这是我的问题,因为当我使用中间件将每个域要下载的页面数限制为 2 时,问题似乎得到了解决。这是有道理的,因为第一个创建的请求只会生成几个新请求,而队列中的空间会留给 start_urls 列表的其余部分。
我还注意到,当我将并发请求从 32 个减少到 2 个时,甚至会消耗 start_urls 列表的一小部分。将并发请求数增加到几百个是不可能的,因为这会导致超时。
目前还不清楚蜘蛛为什么会出现这种行为,只是不再继续使用 start_urls。如果有人能给我一些关于这个问题的潜在解决方案的指示,将不胜感激。
【问题讨论】:
-
你解决了吗?
标签: python asynchronous web-scraping scrapy