Scrapy正在跳过链接

时间:2020-04-27 09:35:49

标签: python scrapy

这是网址https://www.arabam.com/ikinci-el/otomobil?page=14

我正在遍历URL。如果年份大于2010,它将处理广告。这是我的代码

class Myspider(SitemapSpider):
    name = 'spidername'

    custom_settings = {'FEED_FORMAT':'csv','FEED_URI': "arabam_"+str(datetime.today().strftime('%d%m%y'))+'.csv'}
    def start_requests(self):
        urls = ['https://www.arabam.com/ikinci-el/otomobil?page=14']
        # urls = ['https://www.arabam.com/ikinci-el/otomobil?page=' + str(i) for i in range(1, 50)]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)
    def parse(self,response):


            for td in response.xpath("/html/body/div[3]/div[6]/div[4]/div/div[2]/table/tbody/tr/td[4]/div/a/@href").extract():
                checks = str(td.split("/")[3]).split("-")

                for items in checks:
                    if items.isdigit():

                        if int(items) > 2010:

                            url = "https://www.arabam.com/"+ td
                            yield scrapy.Request(url, callback=self.parse_dir_contents)

此页面上大约有10个广告大于2010年。但是,Scrapy仅保存了大约3个页面。

1 个答案:

答案 0 :(得分:0)

您的xpath选择错误。

当前,您的td是包含所有链接并且看起来像这样的列表的元素:
['/ ilan / sahibinden-satilik-peugeot-407-1-6-hdi-millesim / 111-bin-km-de-efsane-d-segment / 14278421',
'/ ilan / galeriden-satilik-seat-le on-1-6-tdi-style / simsek-ten-2016-leon-cam-tavan-dsg-led-katlanir-ayna / 13804838',
'/ ilan / galeriden-satilik-skoda-favorit-135-lx / aci ll-satilik-firsat-araci / 13027823',
...]

然后用斜杠将其拆分,得到元素编号。 3,然后再用破折号将其分开,每个td都会返回类似的结果:
['111','bin','km','de','efsane','d','segment']
['simsek','ten','2016','leon','cam','tavan','dsg','led','katlanir','ayna']
['acill','satilik','firsat','araci']

如本例所示,您的代码仅适用于第二个链接,因为它包含您要查找的年份(2016> 2010)。其他链接只是不包含年份,因此您的代码不适用于它们。您应该从表格而不是从链接中获取年份信息。

我建议使用scrapy shell查找正确的选择器,因为您可以交互地测试xpath或css选择并准确查看结果(see this official example)。

以下解析定义应该适合您:

    def parse(self, response):
        rows = response.css('.listing-list-item') # extract all rows
        for row in rows:
            year = row.css('td:nth-child(4) a::text').extract_first() # extract year from every row
            if int(year) > 2010:
                suburl = row.css('td:nth-child(4) a::attr(href)').extract_first()
                url = "https://www.arabam.com" + suburl # create new url
                yield scrapy.Request(url, callback=self.parse_dir_contents) # request new url

代码首先获取表的每一行,然后获取该行的年份,如果今年是> 2010,则创建新的URL并请求它。
假设您在某处定义了parse_dir_contents-method,则此代码将起作用。

相关问题