我正在使用scrapy抓取一个循环中的网站,其中每个项目都有我想循环访问的链接。
import scrapy
class MyDomainSpider(scrapy.Spider):
name = 'My_Domain'
allowed_domains = ['MyDomain.com']
start_urls = ['https://example.com']
def parse(self, response):
Colums = response.xpath('//*[@id="tab-5"]/ul/li')
for colom in Colums:
title = colom.xpath('//*[@class="lng_cont_name"]/text()').extract_first()
address = colom.xpath('//*[@class="adWidth cont_sw_addr"]/text()').extract_first()
con_address = address[9:-9]
url= colom.xpath('//*[@id="tab-5"]/ul/li/@data-href').extract_first()
print(url)
print('*********************')
yield scrapy.Request(url, callback = self.parse_dir_contents)
def parse_dir_contents(self, response):
print('000000000000000000')
a = response.xpath('//*[@class="fn"]/text()').extract_first()
print(a)
我已经尝试过类似的方法,但是零只打印一次,而星形只打印10次,我希望它每次循环运行时都运行第二个函数。
答案 0 :(得分:3)
您可能正在做不想要的事情。与
url = colom.xpath('//*[@id="tab-5"]/ul/li/@data-href').extract_first()
在循环内部,url
总是得到相同的值。默认情况下,Scrapy过滤重复的请求(请参见here)。如果确实要多次抓取相同的URL,则可以使用dont_filter=True
构造函数的scrapy.Request
参数在请求级别禁用筛选。但是,我认为您真正想要的是这样做(仅保留了代码的相关部分):
def parse(self, response):
Colums = response.xpath('//*[@id="tab-5"]/ul/li')
for colom in Colums:
url = colom.xpath('./@data-href').extract_first()
yield scrapy.Request(url, callback=self.parse_dir_contents)