这是网址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个页面。
答案 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,则此代码将起作用。