我正在使用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)
问题在于它不会抓取所有页面。我还注意到价格并不完全正确。我在做什么错了?
答案 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个价格-数据将不正确地压缩。