python - 部分 HTML 对 Scrapy 不可见

标签 python html web-scraping scrapy

设置

我正在使用 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/

相关文章:

regex - 使用表格抓取维基页面(为什么查询并不总是正确?)

python - 文件夹存在时 os.path.isdir 返回 false?

python - 如何使用 cv2 覆盖/替换图像的一部分?

html - 三列CSS滚动表布局错误

html - 如何使用 node.js 在 cheerio 中获取元素名称

javascript - Puppeteer 按 Enter 按钮或单击 Dialog OK 按钮

python - Django 双因素身份验证,在特定 View 上需要 2FA

python - 在 OS X Lion : initialization from incompatible pointer type 上安装 PIL

html - 使用图像 Bootstrap 将轮播标题居中并调整大小

javascript - JS Div 标签没有隐藏在 if 和 else 语句中