我正在使用Scrapy CrawlSpider类来爬取电子商务网站的类别页面。问题是,大约 5% 的请求在 5 次重试后被拒绝,并且不会达到 100% 的已知类别。
我的修复涉及第二个蜘蛛(scrapy.Spider),它从数据库中获取丢失的已知 URL,然后简单地重新抓取它们。这样我就达到了 100%。
问题是,这些是 2 个不同的蜘蛛,它们位于 2 个不同的 python 文件中,需要由 cron 作业分别触发。此外,我只是将 parse_item 函数复制到另一个抓取器,如果需要的话,现在需要在两个抓取器上进行更改。
class myspider(CrawlSpider):
name = 'categories'
...
def parse_item(self, response):
...
yield item
class myspider(scrapy.Spider):
name = 'recrawler'
...
def parse_item(self, response):
...
yield item
如何扩展 CrawlSpider 类以在每个完成的循环后重新爬行或以某种方式调用另一个蜘蛛?
问题是,大约 5% 的请求在 5 次重试后被拒绝,并且不会达到 100% 的已知类别。
增加
DOWNLOAD_DELAY
并降低CONCURRENT_REQUESTS_PER_DOMAIN
。或者使用一些代理并根据每个请求轮换它。
不要通过引入另一个问题来解决一个问题。
顺便说一句,
scrapy
确实支持启动多个蜘蛛并并行运行它们。检查文档在同一进程中运行多个蜘蛛。
CrawlProcess 类允许您通过为每个蜘蛛调用 process.crawl() 并调用 process.start() 来开始爬网,从而在一个脚本中顺序运行多个 Scrapy 蜘蛛。确保将模块路径替换为蜘蛛类的实际路径。
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from myproject.spiders.spider1 import Spider1
from myproject.spiders.spider2 import Spider2
process = CrawlerProcess(get_project_settings())
process.crawl(Spider1)
process.crawl(Spider2)
process.start()