Python中如何使用scrapy处理批量URL
RT,我这边有需求处理一批 URL 入口,其中可能会定制传入相应的参数,形式大概类似于:
execute(['scrapy', 'crawl', 'woshiscrapy', '-a', 'para=%s' % para)
试过多进程和多线程,完全不适配,似乎异步 twisted 好像需要其他法子解决速度问题。
本来放弃速度,准备直接 for 循环传入,结果发现调用 execute 执行 scrapy,爬完了第一个 url,就直接退出了主程序。
很无奈,求各位大佬给点具体的方案建议,小弟有点没招了。
Python中如何使用scrapy处理批量URL
5 回复
参数得有规律才行,用多进程可以的。
用Scrapy处理批量URL,核心是构造起始URL列表。直接上代码:
import scrapy
from scrapy.crawler import CrawlerProcess
class MySpider(scrapy.Spider):
name = 'batch_spider'
def start_requests(self):
# 批量URL列表 - 可以从文件/数据库读取
urls = [
'https://example.com/page1',
'https://example.com/page2',
'https://example.com/page3',
# ... 更多URL
]
# 为每个URL创建Request对象
for url in urls:
yield scrapy.Request(
url=url,
callback=self.parse,
# 可以添加meta传递额外数据
meta={'original_url': url}
)
def parse(self, response):
# 提取数据
data = {
'url': response.meta['original_url'],
'title': response.css('title::text').get(),
'content': response.css('div.content::text').get()[:100] # 前100字符
}
yield data
# 运行爬虫
if __name__ == "__main__":
process = CrawlerProcess(settings={
'FEED_FORMAT': 'json',
'FEED_URI': 'output.json',
'USER_AGENT': 'Mozilla/5.0',
'CONCURRENT_REQUESTS': 8, # 并发请求数
'DOWNLOAD_DELAY': 1, # 下载延迟
})
process.crawl(MySpider)
process.start()
关键点:
start_requests()方法中遍历URL列表,为每个URL生成Request- 使用
meta参数传递原始URL(因为重定向可能改变URL) - 通过settings控制并发和延迟,避免被封
- 输出到JSON文件便于后续处理
从文件读取URL的补充:
def start_requests(self):
with open('urls.txt', 'r') as f:
urls = [line.strip() for line in f if line.strip()]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
总结:用start_requests遍历URL列表生成请求。
你把 url 和相应的参数拼成一个 url 列表,然后赋值到 self.start_urls 变量里面跑
要多进程的话,把 url 放到队列里面,然后启动多个 scrapy 从队列中取
可以用 scrapyrt, 把 scrapy project 变成一个 http service, 然后调用 http api
可以了解一下 scrapy_redis 然后重写 make_requests_from_data 来实现自定义参数传入

