【问题标题】:How can I access the "price" tag within this response?如何访问此响应中的“价格”标签?
【发布时间】:2021-12-10 19:48:06
【问题描述】:

情况:

我正在尝试使用 scrapy 抓取广告网站。 我可以访问并从与我相关的标签中提取信息,但是,“价格”标签不愿意提供文本。

我尝试过的:

对于价格标签,我尝试了不同的方法,即 css 选择器和 xpath,但没有任何效果。

response.css('span.ma-AdPrice-value.ma-AdPrice-value--default.ma-AdPrice-value--heading--l::text').get()
response.xpath("//span[@class='ma-AdPrice-value ma-AdPrice-value--default ma-AdPrice-value--heading--l']/text()").get()

我在终端中用scrapy shell 尝试了不同的response 调用,包括在较高的标签级别提取数据,但没有成功。

守则

下面是代码的摘录。标题标签(和其他标签)工作正常,价格标签是这里的问题。

网址:https://www.milanuncios.com/volkswagen-de-segunda-mano/volkswagen-golf-2-0-tdi-184cv-dsg-gtd-bmt-409202986.htm

class AdSpider(scrapy.Spider):
    name = 'ads'
    start_urls = [
        'https://www.milanuncios.com/volkswagen-de-segunda-mano/volkswagen-golf-2-0-tdi-184cv-dsg-gtd-bmt-409202986.htm'
    ]

    def parse(self, response):
        title = response.css('h1.ma-AdDetail-title.ma-AdDetail-title-size-heading-m::text').get()
        price = response.css('span.ma-AdPrice-value.ma-AdPrice-value--default.ma-AdPrice-value--heading--l::text').get()

        items['title'] = title
        items['price'] = price

        yield items

问题: 我没有网络抓取经验,所以网站 html 代码中是否有我没有看到的隐藏功能? 我该如何解决这个问题?

【问题讨论】:

  • 您好,如果无法看到您尝试从中收集数据的网页,任何人都无法提供帮助
  • 网址在代码上,但我同意最好将其添加出来。

标签: python css web-scraping xpath scrapy


【解决方案1】:

这里的问题似乎是页面需要 JavaScript。

使用请求和 BeautifulSoup 运行测试时:


>>> import requests
>>> from bs4 import BeautifulSoup as bs
>>> res = requests.get("https://www.milanuncios.com/volkswagen-de-segunda-mano/volkswagen-golf-2-0-tdi-184cv-dsg-gtd-bmt-409202986.htm")
>>> soup = bs(res.text, "lxml")
>>> soup.find("span", text="Precio financiado")

未找到该项目,因为它引发了要求 javascript 与机器人保护一起继续的错误。

当使用 selenium 收集它时:

>>> from selenium import webdriver
>>> from bs4 import BeautifulSoup as bs

>>> path ="path_to_executable"
>>> driver = webdriver.Firefox(executable_path=path)
>>> driver.get("https://www.milanuncios.com/volkswagen-de-segunda-mano/volkswagen-golf-2-0-tdi-184cv-dsg-gtd-bmt-409202986.htm")
>>> soup = bs(driver.page_source, "lxml")
>>> soup.find("span", text="Precio financiado").findNext("span").text

返回了预期的价格。

要解决这个问题,您要么需要考虑将 selenium 合并到 scrapy 中,要么只使用 selenium 来收集数据。

【讨论】:

  • 您的解决方案运行良好,感谢@Kwsswart
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 2016-11-10
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
相关资源
最近更新 更多