设置
我正在使用 scrapy 来抓取住房广告。
对于每个广告,我都试图获取有关制作年份的信息。
大多数广告中都会说明此信息。
问题
当我在浏览器中检查广告及其在开发者模式下的 HTML 代码时,我可以在“关于”部分中看到 build 年份以及相关的其他信息。
但是,当我使用 Scrapy 时,我返回一个空列表。我可以抓取广告页面的其他部分(价格、房间等),但不能抓取“关于”部分。
检查this example ad .
如果我使用 response.css('#caracteristique_bien').extract_first()
,我得到,
<div id="caracteristique_bien"></div>
这就是我所能做到的。任何更深的回归都会带来空虚。
如何获得 build 年份?
最佳答案
正如我提到的,这是使用 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']
关于python - 部分 HTML 对 Scrapy 不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53780385/