使用scrapy

时间:2018-07-18 17:42:32

标签: python scrapy

我正在使用scrapy抓取此网站:https://www.cartrade.com/buy-used-cars/p-10

我的代码:

import scrapy

class ShopcluesSpider(scrapy.Spider):
   name = 'example'
   allowed_domains = ['www.cartrade.com/buy-used-cars']
   start_urls = ['https://www.cartrade.com/buy-used-cars/']
   custom_settings = { 'FEED_URI' : 'tmp/data.csv'}

   def parse(self, response):
       # Extract product information
       titles = response.xpath('//div[@class = "carimgblk"]/a/img/@title').extract()
       URLs = response.xpath('//div[@class = "carimgblk"]/a/meta/@content').extract()
       prices = response.xpath('//div[@class = "cr_prc"]/text()').extract()

       for item in zip(titles,prices,URLs):
           scraped_info = {
               'title' : item[0].strip(),
               'price' : item[1].strip().replace(',', ''),
               'URL': item[2].strip(),
           }    
           yield scraped_info

       next_page = response.css('li.next a::attr(href)').extract_first()
       if next_page:
          yield scrapy.Request(response.urljoin(next_page),callback=self.parse)

问题在于它不会抓取所有页面。我还注意到价格并不完全正确。我在做什么错了?

1 个答案:

答案 0 :(得分:1)

关于解析的准确性:从html中解析产品的一般方法是查找产品块并对其进行迭代,然后分别分析每个块。

在您的示例中,您可以看到每个汽车列表都有自己的<div>块,类别为carlistblk

cars = response.css('.carlistblk')
for car in cars:
    item = {}
    item['title'] = car.xpath('.//img/@title')
    ...
    yield item

如果一个列表中没有一个字段,则您的zip方法很容易被破坏,那么您拥有10个标题和9个价格-数据将不正确地压缩。