情况:
我正在尝试使用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
调用,包括提取上层标签级别的数据,但没有成功。
:
下面是代码的摘录。标题标签(和其他)工作得很好,价格标签是这里的问题。
url: https://www.milanuncios.com/volkswagen - de -乙级联赛mano/volkswagen高尔夫- 2 - 0 - tdi - 184 - cv - 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代码,我没有看到?我该如何解决这个问题?
这里的问题似乎是页面需要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继续使用bot保护的错误。
当使用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
预期价格已返回。
要解决这个问题,你要么需要考虑将硒纳入scrapy,要么只使用硒来收集数据。