运行 For 循环中的 Scrapy 在第一个 运行 之后挂起
Running Scrapy in a For Loop hangs after first run
我想 运行 在 for 循环中 Scrapy,列表中的每个 URL 一个循环。 (注意:我不想要所有这些 URL 作为 start_urls
,我需要它们一次 运行 个)。
我的第一次尝试在循环的第一次迭代后出现了 twisted.internet.error.ReactorNotRestartable
个错误。
对 SO 的搜索给出了一个先前的答案,说 process.start(stop_after_crawl=False)
应该可以解决这个问题。这消除了 Twisted 错误,但现在只是在循环的第一次迭代后挂起。这不是那个问题的重复。
我当前的代码是:
for url in urls:
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
'DEPTH_LIMIT': 4
})
process.crawl(MySpider, url)
process.start(stop_after_crawl=False)
第一个URL 运行没问题,然后就挂了:
'response_received_count': 1,
'scheduler/dequeued': 1,
'scheduler/dequeued/memory': 1,
'scheduler/enqueued': 1,
'scheduler/enqueued/memory': 1,
'start_time': datetime.datetime(2018, 8, 12, 21, 12, 29, 963422)}
2018-08-12 22:12:30 [scrapy.core.engine] INFO: Spider closed (finished)
为了用 scrapy 遍历列表,我认为使用 "start_requests" 是个好主意:
def start_requests(self):
with open('./input/id_urls_10k.csv','r') as csvfile:
urlreader = csv.reader(csvfile, delimiter=',',quotechar='"')
for row in urlreader:
if row[1]=="y":
yield scrapy.Request(url=row[2],meta={'urlkey':row[0]})
您应该可以使用一些 Twisted 模块来完成它。这是一个简单的例子:
from scrapy.crawler import CrawlerRunner
from twisted.internet import defer, tasks
@tasks.react
@defer.inlineCallbacks
def crawl_my_sites(reactor):
runner = CrawlerRunner({})
for url in urls:
yield runner.crawl(MySpider, url)
我想 运行 在 for 循环中 Scrapy,列表中的每个 URL 一个循环。 (注意:我不想要所有这些 URL 作为 start_urls
,我需要它们一次 运行 个)。
我的第一次尝试在循环的第一次迭代后出现了 twisted.internet.error.ReactorNotRestartable
个错误。
对 SO 的搜索给出了一个先前的答案,说 process.start(stop_after_crawl=False)
应该可以解决这个问题。这消除了 Twisted 错误,但现在只是在循环的第一次迭代后挂起。这不是那个问题的重复。
我当前的代码是:
for url in urls:
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
'DEPTH_LIMIT': 4
})
process.crawl(MySpider, url)
process.start(stop_after_crawl=False)
第一个URL 运行没问题,然后就挂了:
'response_received_count': 1,
'scheduler/dequeued': 1,
'scheduler/dequeued/memory': 1,
'scheduler/enqueued': 1,
'scheduler/enqueued/memory': 1,
'start_time': datetime.datetime(2018, 8, 12, 21, 12, 29, 963422)}
2018-08-12 22:12:30 [scrapy.core.engine] INFO: Spider closed (finished)
为了用 scrapy 遍历列表,我认为使用 "start_requests" 是个好主意:
def start_requests(self):
with open('./input/id_urls_10k.csv','r') as csvfile:
urlreader = csv.reader(csvfile, delimiter=',',quotechar='"')
for row in urlreader:
if row[1]=="y":
yield scrapy.Request(url=row[2],meta={'urlkey':row[0]})
您应该可以使用一些 Twisted 模块来完成它。这是一个简单的例子:
from scrapy.crawler import CrawlerRunner
from twisted.internet import defer, tasks
@tasks.react
@defer.inlineCallbacks
def crawl_my_sites(reactor):
runner = CrawlerRunner({})
for url in urls:
yield runner.crawl(MySpider, url)