如何从for循环转到以下链接?

时间:2019-04-27 06:56:00

标签: python-3.x web-scraping scrapy

我正在使用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次,我希望它每次循环运行时都运行第二个函数。

1 个答案:

答案 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)