我正在使用scrapy抓取网站,我想在其中提取一些细节,例如产品的价格,产品说明,功能等。我想知道如何使用css选择器或xpath选择器选择每个元素,并将它们存储为xml或json格式。
我已经编写了以下代码框架。请从这里指导我该怎么做。
# -*- coding: utf-8 -*-
import scrapy
import time
class QuotesSpider(scrapy.Spider):
name = 'myquotes'
start_urls = [
'https://www.amazon.com/international-sales-offers/b/ref=gbps_ftr_m-9_2862_dlt_LD?node=15529609011&gb_f_deals1=dealStates:AVAILABLE%252CWAITLIST%252CWAITLISTFULL%252CEXPIRED%252CSOLDOUT%252CUPCOMING,sortOrder:BY_SCORE,MARKETING_ID:ship_export,enforcedCategories:15684181,dealTypes:LIGHTNING_DEAL&pf_rd_p=9b8adb89-8774-4860-8b6e-e7cefc1c2862&pf_rd_s=merchandised-search-9&pf_rd_t=101&pf_rd_i=15529609011&pf_rd_m=ATVPDKIKX0DER&pf_rd_r=AA0VVPMWMQM1MF4XQZKR&ie=UTF8'
]
def parse(self, response):
all_div_quotes = response.css('a-section a-spacing-none tallCellView gridColumn2 singleCell')
for quotes in all_div_quotes:
title1 = all_div_quotes.css('.dealPriceText::text').extract()
title2 = all_div_quotes.css('.a-declarative::text').extract()
title3 = all_div_quotes.css('#shipSoldInfo::text').extract()
yield{
'price' : title1,
'details1' : title2,
'details2' : title3
}
我正在使用以下命令运行代码:
scrapy crawl myquotes -o myfile.json
将其保存在json文件中。此代码的问题在于,它没有按预期返回标题,产品价格,产品说明。如果有人可以帮助我如何取消亚马逊页面的产品名称,价格和说明,那将有很大的帮助。
答案 0 :(得分:1)
使用scrapy shell
是检查和验证CSS选择器的更简单方法。
对于您的情况,我列出了可以与代码一起使用的选择器:
名称:response.css("#productTitle::text").get()
价格:我的国家/地区无法提供价格,因此无法对其进行测试。
说明:response.css("#productDescription p::text").getall()
好运。
答案 1 :(得分:0)
解决此类错误的常规方法从顶部开始。我认为您的第一个CSS选择器太详细了。使用选择器小工具时,常规的CSS选择器为
.dealDetailContainer
在没有for循环的情况下获得整个响应,并检查输出以了解您正在获得某种响应。
对于单个产品,当我抓取其他亚马逊链接时,产品名称的css选择器为
#productTitle::text -># is not a commented line of code here
基本上,您在使用CSS选择器时会出错。使用CSS选择器小工具,并在使用命令将其输出到json之前,首先进行常规爬网。
答案 2 :(得分:0)
通常您可以做的是
Name: response.css("#productTitle::text").extract()
Description: response.css("#productDescription p::text").extract()
有了这个,你应该很好了。 CSS选择器更加稳定,因此通常比使用xpath和因此使用的方法更好。