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()

关键点:

  1. start_requests()方法中遍历URL列表,为每个URL生成Request
  2. 使用meta参数传递原始URL(因为重定向可能改变URL)
  3. 通过settings控制并发和延迟,避免被封
  4. 输出到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 来实现自定义参数传入

回到顶部