Scrapy 提供了多种方式来控制爬虫的暂停和重启,包括信号、设置标志位,或者直接使用命令行工具。
- 使用命令行暂停和重启:
# 启动爬虫
scrapy crawl myspider
# 在另外一个终端,发送信号暂停爬虫
kill -SIGSTOP $(pgrep -f 'scrapy crawl myspider')
# 暂停后,重新启动爬虫
kill -SIGCONT $(pgrep -f 'scrapy crawl myspider')
- 使用Scrapy内置信号控制:
from twisted.internet import reactor
from scrapy.crawler import CrawlerRunner
from scrapy.utils.project import get_project_settings
from myspider.spiders.myspider import MySpider
runner = CrawlerRunner(get_project_settings())
def start_crawler():
return runner.crawl(MySpider)
def stop_crawler():
reactor.stop()
# 启动爬虫
d = start_crawler()
d.addBoth(lambda _: stop_crawler())
# 运行Twisted reactor
reactor.run()
数据收集、去重和爬虫中间件是Scrapy的核心组件,用于处理爬取的数据,确保爬虫行为的灵活性和效率。
- 数据收集:
# 在爬虫中
def parse(self, response):
item = {}
item['name'] = response.css('div.name::text').extract_first()
item['link'] = response.urljoin(response.css('div.link::attr(href)').extract_first())
yield item
- 去重:Scrapy内置了去重系统,通过指定item的key作为去重的依据。
class MySpider(scrapy.Spider):
# ...
def start_requests(self):
urls = ['http://example.com/1', 'http://example.com/2']
for url in urls:
yield scrapy.Request(url=url, callback=self.parse_item, dont_filter=False)
- 爬虫中间件:
# 在middlewares.py中
class MyCustomMiddleware(object):
def process_request(self, request):
# 可以在这里添加自定义逻辑,比如代理切换
pass
def process_response(self, request, response):
# 可以在这里处理响应,或者重新发起请求
pass
在settings.py中启用中间件:
DOWNLOADER_MIDDLEWARES = {
'myspider.middlewares.MyCustomMiddleware': 543,
}
这些是Scrapy中控制爬虫行为和实现数据收集、去重和爬虫中间件的基本方法。