设置
我正在使用scrapy抓取房屋广告。
对于每个广告,我都在尝试获取有关建设年份的信息。
大多数广告中都注明了此信息。
当我在浏览器中查看广告及其在开发人员模式下的HTML代码时,我可以在“关于”部分中看到建造年份以及有关它的其他信息。
但是,当我使用Scrapy时,会返回一个空列表。我可以抓取广告页面的其他部分(价格,房间等),但不能抓取“关于”部分。
如果我使用response.css('#caracteristique_bien').extract_first()
,我会得到
<div id="caracteristique_bien"></div>
就我所能做到的。任何更深的回报空虚。
如何获得建造年份?
答案 0 :(得分:3)
正如我提到的,这是使用javascript呈现的,这意味着html的某些部分将由浏览器动态加载(Scrapy
不是浏览器)。
这种情况的好处是javascript在实际请求中,这意味着您仍然可以解析信息,但信息有所不同。
例如,要获取描述,您可以在内部找到它:
import re
import demjson
script_info = response.xpath('//script[contains(., "Object.defineProperty")]/text()').extract_first()
# getting description
description_json = re.search("descriptionBien', (\{.+?\});", script_info, re.DOTALL)
real_description = demjson.decode(description_json)['value']
# getting surface area
surface_json = re.search("surfaceT', (\{.+?\})\);", script_info, re.DOTALL).group(1)
real_surface = demjson.decode(surface_json)['value']
...
如您所见script_info
包含所有信息,您只需要想出一种方法来解析该信息即可得到想要的东西
但是有些信息不在同一响应之内。要获取它,您需要执行GET请求:
https://www.seloger.com/detail,json,caracteristique_bien.json?idannonce=139747359
如您所见,它仅需要idannonce
,您可以使用以下命令从上一个响应中获取它:
demjson.decode(re.search("idAnnonce', (\{.+?\})\);", script_info, re.DOTALL).group(1))['value']
第二次提出请求后,您可以通过以下方式获得“施工年”:
import json
...
[y for y in [x for x in json.loads(response.body)['categories'] if x['name'] == 'Général'][0]['criteria'] if 'construction' in y['value']][0]['value']
答案 1 :(得分:1)
以您的示例为例,该添加项会使用javascript动态加载,因此您将无法通过 scrapy 来获取它。
您可以使用Selenium进行(大规模)报废(我在一家著名的法国广告网站上做了类似的事情)
只需将它与Chrome选项一起使用,就可以了:
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('headless')
driver = webdriver.Chrome(options = options)
答案 2 :(得分:1)
加载页面,打开浏览器的devtools,并对您使用的CSS选择器(ctrl-F
)进行caracteristique_bien
,并发现以下请求:https://www.seloger.com/detail,json,caracteristique_bien.json?idannonce=139747359
在这里您可以找到想要的东西
答案 3 :(得分:-1)