众所周知,Scrapy 默认会过滤重复的 URL,不会重复抓取相同的 URL,除非显式指定。
于是随便写了一个爬图片地址的小虫,然而不知道为什么总会爬两次 baidu 首页,你能看出错在哪里吗?
class ImageSpider(scrapy.Spider):
name = "images"
allowed_domains = ["www.baidu.com"]
start_urls = ['https://www.baidu.com/']
def parse(self, response):
images = response.xpath('//img/@src').extract()
for image in images:
image_item = ImageItem()
image_item['img_url'] = response.urljoin(image.strip())
yield image_item
urls = response.xpath('//a/@href').extract()
for url in urls:
next_url = response.urljoin(url.strip())
yield Request(next_url)
我想了半天都不明白为什么,以为是过滤器的问题,查了半天资料仍没解决。 后来偶然看了 Spider 源码,才发现坑爹之处。
原来源码的 start_requests 是这样写的(已忽略无关代码)
def start_requests(self):
for url in self …