如何选择网站的各种元素

时间:2019-09-10 05:58:37

标签: python web-scraping scrapy

我正在使用scrapy抓取网站,我想在其中提取一些细节,例如产品的价格,产品说明,功能等。我想知道如何使用css选择器或xpath选择器选择每个元素,并将它们存储为xml或json格式。

我已经编写了以下代码框架。请从这里指导我该怎么做。

enter image description here

# -*- 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文件中。此代码的问题在于,它没有按预期返回标题,产品价格,产品说明。如果有人可以帮助我如何取消亚马逊页面的产品名称,价格和说明,那将有很大的帮助。

3 个答案:

答案 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和因此使用的方法更好。