Scrapy无法看到部分HTML

时间:2018-12-14 13:05:32

标签: python html web-scraping scrapy

设置

我正在使用scrapy抓取房屋广告。

对于每个广告,我都在尝试获取有关建设年份的信息。

大多数广告中都注明了此信息。


问题

当我在浏览器中查看广告及其在开发人员模式下的HTML代码时,我可以在“关于”部分中看到建造年份以及有关它的其他信息。

但是,当我使用Scrapy时,会返回一个空列表。我可以抓取广告页面的其他部分(价格,房间等),但不能抓取“关于”部分。

选中this example ad

如果我使用response.css('#caracteristique_bien').extract_first(),我会得到

<div id="caracteristique_bien"></div>

就我所能做到的。任何更深的回报空虚。

如何获得建造年份?

4 个答案:

答案 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)

  1. 在开发人员模式下,转到网络并刷新页面。
  2. 选择 XHR (XMLHttpRequest)。
  3. 通过 json
  4. 过滤类型

XHR Request

检查响应主体的构建年份。如果在其中,请使用标头中的URL发送请求,而不是最初使用的请求。

我无法访问该网站,但是很多时候,这将返回一个已经以json格式结构化的“迷你API”响应。