如何多次运行Scrapy爬取返回随机响应的同一URL?
首先得说,你用Unix的start命令其实不是最优选择,这也是你觉得运行慢的原因——start本质是Windows系统里用来启动图形界面程序的命令,在Unix环境下强行用类似工具(或误操作)会额外创建进程、带来不必要的资源开销,完全没必要用于命令行爬虫场景。咱们针对你的需求(爬取随机响应的URL、收集大量NLP训练数据),来聊聊更靠谱的解决方案:
方案1:让Scrapy爬虫内部循环请求(最推荐)
与其反复手动启动scrapy crawl,不如修改爬虫代码,让它启动后自动循环发送请求,直到你收集到足够数据。这样能避免反复启动爬虫的开销,效率最高。
举个简单的示例,修改爬虫的start_requests方法:
import scrapy import time class RandomContentSpider(scrapy.Spider): name = "random_spider" target_url = "你的目标URL" total_requests = 10000 # 你需要的总请求数,也可以用while True实现无限循环 request_delay = 1.5 # 每次请求的间隔秒数,根据目标网站反爬规则调整 def start_requests(self): request_count = 0 while request_count < self.total_requests: yield scrapy.Request( url=self.target_url, callback=self.parse, dont_filter=True # 关键:Scrapy默认会去重重复URL,必须加这个参数才能重复请求同一地址 ) request_count += 1 time.sleep(self.request_delay) def parse(self, response): # 这里替换成你原本的解析逻辑,提取需要的NLP内容 nlp_content = response.xpath("你的内容提取规则").getall() yield {"content": nlp_content}
方案2:用Shell脚本循环调用爬虫
如果不想修改爬虫代码,也可以写个简单的bash脚本,自动循环执行scrapy crawl命令:
#!/bin/bash RUN_TIMES=10000 # 设置要运行的总次数 DELAY=1.5 # 每次运行的间隔秒数 for ((i=1; i<=RUN_TIMES; i++)) do echo "正在执行第 $i/$RUN_TIMES 次爬取..." scrapy crawl random_spider sleep $DELAY done
保存为run_spider.sh后,给它加执行权限:chmod +x run_spider.sh,之后运行./run_spider.sh即可自动循环爬取。
方案3:后台持久运行(无需一直保持终端打开)
如果需要让爬虫在后台持续运行,不用一直盯着终端,可以用以下两种工具:
nohup:直接让脚本在后台运行,日志会保存到nohup.out文件:nohup ./run_spider.sh &screen/tmux:创建持久化的终端会话,即使断开SSH连接,进程也会继续运行。以screen为例:- 输入
screen启动会话 - 在会话内运行
./run_spider.sh或修改后的爬虫 - 按
Ctrl+A+D断开会话(爬虫会在后台继续运行) - 后续想重新查看会话,输入
screen -r即可
- 输入
总结一下:优先选择修改爬虫代码实现内部循环,效率最高;其次用Shell脚本批量调用;后台运行用nohup或screen/tmux,比你之前用的start命令靠谱得多。
内容的提问来源于stack exchange,提问作者Computa
相关产品推荐
相关产品推荐

