有人可以向我解释暂停/恢复功能的Scrapy工作原理吗?
scrapy我正在使用的版本是0.24.5
该文件并没有提供太多细节.
我有以下简单的蜘蛛:
class SampleSpider(Spider):
name = 'sample'
def start_requests(self):
yield Request(url='https://colostate.textbookrack.com/listingDetails?lst_id=1053')
yield Request(url='https://colostate.textbookrack.com/listingDetails?lst_id=1054')
yield Request(url='https://colostate.textbookrack.com/listingDetails?lst_id=1055')
def parse(self, response):
with open('responses.txt', 'a') as f:
f.write(response.url + '\n')
Run Code Online (Sandbox Code Playgroud)
我正在运行它:
from twisted.internet import reactor
from scrapy.crawler import Crawler
from scrapy import log, signals
from scrapyproject.spiders.sample_spider import SampleSpider
spider = SampleSpider()
settings = get_project_settings()
settings.set('JOBDIR', '/some/path/scrapy_cache')
settings.set('DOWNLOAD_DELAY', 10)
crawler = Crawler(settings)
crawler.signals.connect(reactor.stop, signal=signals.spider_closed)
crawler.configure()
crawler.crawl(spider)
crawler.start()
log.start()
reactor.run()
Run Code Online (Sandbox Code Playgroud)
如您所见,我启用了JOBDIR选项,以便保存爬行状态.
我设置为DOWNLOAD_DELAY,10 seconds以便我可以在处理请求之前停止蜘蛛.我原以为我下次运行蜘蛛时,会不会重新生成请求.事实并非如此.
我在scrapy_cache文件夹中看到一个名为requests.queue的文件夹.但是,这总是空的.
看起来request.seen文件正在保存已发出的请求(使用SHA1哈希),这很棒.但是,下次运行spider时,会重新生成请求,并将(重复的)SHA1哈希值添加到文件中.我在Scrapy代码中跟踪了这个问题,看起来像是RFPDupeFilter打开带有'a +'标志的requests.seen文件.因此它总是会丢弃文件中的先前值(至少这是我的Mac OS X上的行为).
最后,关于蜘蛛状态,我可以从Scrapy代码中看到蜘蛛状态在蜘蛛关闭时被保存并在打开时被回读.但是,如果发生异常(例如,机器关闭),这不是很有用.我必须定期保存吗?
我在这里遇到的主要问题是:Scrapy在期望爬行将多次停止/恢复时(例如,爬行一个非常大的网站时)使用的常见做法是什么?
为了能够暂停和恢复scrapy搜索,您可以运行此命令以开始搜索:
scrapy crawl somespider --set JOBDIR=crawl1
Run Code Online (Sandbox Code Playgroud)
要停止搜索,你应该运行control-C,但是你必须只运行一次并等待scrapy停止,如果你运行control-C两次它将无法正常工作.
然后您可以通过再次运行此命令来恢复搜索:
scrapy crawl somespider --set JOBDIR=crawl1
Run Code Online (Sandbox Code Playgroud)
回复:我在这里的主要问题是:在预期爬行将停止/恢复多次时(例如,爬行一个非常大的网站时),使用 Scrapy 的常见做法是什么?
如果您不想使用 Scrapy 的暂停/恢复,您可以随时序列化您的请求。我在下面举一个例子:
如果你先爬取10000个URL,然后通过顺序请求的方式在一个新的爬虫中抓取这10000个URL,你可以简单地根据一些规则将这些URL序列化,并在spider中导入csv:
file = open('your10000_urls.csv', 'r')
data = csv.reader(file)
urls = list(data)
url = ['']
for i in urls:
url.append(i[0])
start_urls = url[1:]
file.close()
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过删除已请求的请求来跟踪这些请求。此外,您可能希望将数据存储在数据库中,这使生活变得更加轻松。
希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
4641 次 |
| 最近记录: |