Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 部分HTML对Scrapy不可见_Python_Html_Web Scraping_Scrapy - Fatal编程技术网

Python 部分HTML对Scrapy不可见

Python 部分HTML对Scrapy不可见,python,html,web-scraping,scrapy,Python,Html,Web Scraping,Scrapy,设置 我在用scrapy刮房屋广告 对于每一个广告,我都试图获得关于建设年份的信息 这一信息在大多数广告中都有说明 问题 当我在浏览器中查看广告,并在开发人员模式下查看其HTML代码时,我可以在about部分看到建设年份和其他相关信息 然而,当我使用Scrapy时,返回的是一个空列表。我可以浏览广告页面的其他部分(价格、房间等),但不能浏览“关于”部分 检查 如果我使用response.css('#caracteristique_bien').extract_first(),我得到 <d

设置

我在用scrapy刮房屋广告

对于每一个广告,我都试图获得关于建设年份的信息

这一信息在大多数广告中都有说明


问题

当我在浏览器中查看广告,并在开发人员模式下查看其HTML代码时,我可以在about部分看到建设年份和其他相关信息

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

检查

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

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

那是我所能做的。任何更深层次的回归都是空虚


我如何获得建设年份?

看看您的示例,add是用javascript动态加载的,因此您无法通过scrapy获得它

你可以使用(大规模)报废(我在一个著名的法国广告网站上做过类似的事情)

只需将其与铬合金选项一起使用即可:

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument('headless')
driver = webdriver.Chrome(options = options)

加载页面,打开浏览器的devtools,并使用您使用的css选择器(
caracteristique_bien
)执行
ctrl-F
),然后发现此请求:
在这里,您可以找到您要查找的内容,正如我提到的,这是使用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\u 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']
稍后,通过第二个请求,您可以获得“施工年”,例如:


它是否在浏览器中动态加载,并且您可能需要Splash来呈现页面?这是因为站点使用javascript呈现(大多数广告都是这样)。获取此信息的解决方案是使用浏览器仿真器(如selenium)或调试对站点的请求,并对其进行反向工程,以了解如何检索该信息。@alecxe:谢谢您的建议。我不熟悉Splash,所以我不能说你是对还是错。也许其他人可以。@eLRuLL:好的。我需要刮去大量的广告,所以Selenium是不可能的。@alecxe你介意分享一些链接来检查Splash吗?谢谢,但不可能找到建设年份:-(这种方法对我来说是全新的:我不知道它是如何工作的。我得到了一个
名称错误:当我运行最后一行以获得施工年份时,名称“json”没有定义。应该放置什么来代替“json”?你需要导入它:
导入json
对…愚蠢。好的,我做了,但我得到了一个
JSOND。)ecodeError:预期值:第337行第1列(字符932)
。检查最后一个代码是否应用于
https://www.seloger.com/detail,json,caracteristique_bien.json?idannone=139747359
,不是以前的OneHanks。但我正在抓取一百万个广告。您的解决方案不会“扩展”,那么让我更具体一点:使用我在脚本蜘蛛中提供的url作为模板.
IDANNOCE
可以抽象为一个参数,该参数的值来源于您给出的URL示例(此处为139747359).Really@LucSpan?Man,在尝试获取互联网数据时,没有什么比获取JSON更好的了!!废弃是不可靠的。JSON是!唯一的问题是您需要cookies来获取此信息:/cookies的所有相关内容都由scrapy@LaSul处理。在执行请求的爬行器部分,如果您使用例如获取JSON,您可以将cookies从scrapy响应转移到
请求
”请求,这样就不是什么大问题了
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']