在元素检查器中工作时,使用xpath从scrapy shell获得空响应

时间:2019-07-12 09:46:09

标签: python json http scrapy

我正试图刮擦this webpage(出于教育目的)。

当我提取xpath并在浏览器的元素检查器中尝试时,它可以工作。 例如,要获取地址,我使用以下xpath:

//div[@class="address-coords"]/div[@class="address"]/p/span[@itemprop="address"]

同时,在刮板外壳中,它不起作用:

$ scrapy shell 'https://cloud.baladovore.com/map/sNRgAcGKiY' -s U
SER_AGENT='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, l
ike Gecko) Chrome/46.0.2490.80 Safari/537.36'

In [5]: response.xpath('//div[@class="address-coords"]/div[@class="address"]/p/span[@it
   ...: emprop="address"]').getall()

Out[5]: []

我得到一个空列表,尽管响应为200:

In [6]: response
Out[6]: <200 https://cloud.baladovore.com/map/008jPJuORI>

我已经尝试了所有在Internet上找到的建议。就像更改用户代理一样,将ROBOTSTXT_OBEY设置为False,并增加延迟。 如果有人帮助我解决了这个问题,我将不胜感激,因为我已经工作了好几天。

1 个答案:

答案 0 :(得分:0)

如果您使用scrapy shell(使用response.body)来查看响应的内容,您会看到服务器以一小页的响应作为响应,然后将其执行。

因此,您需要一种通过Scrapy运行Javascript或直接查询服务器以获取结果的方法。使用浏览器的开发工具(网络)是检查这些查询的一种常用方法(如linked answer所述)。

另一种解决方案是使用Selenium模拟完整的浏览器。

编辑1:您不仅需要https://cloud.baladovore.com/parse/classes/Address,还可以走得更远。

如果您检查请求,您将看到它不仅请求该页面,而且还提供其他信息:

  

请求网址:https://cloud.baladovore.com/parse/classes/Address

     

请求方法:POST

     

请求有效载荷:   {“ where”:{“ objectId”:“ sNRgAcGKiY”},“ limit”:1,“ _ method”:“ GET”,“ _ ApplicationId”:“ cB4rsS2KbFIG5IQyjJv0XaDC8M28e0YDu58SaolX”,“ _ JavaScriptKey”:“ eDoqTmoIS6YPF” 9“ js1.6.14“,” _ InstallationId“:” 02f7b7dd-31c7-b235-df1d-93c323dbcd60“}

让我们尝试使用requests进行模拟:

import requests

access_data = {"where":{"objectId":"sNRgAcGKiY"},
"limit":1,
"_method":"GET",
"_ApplicationId":"cB4rsS2KbFIG5IQyjJv0XaDC8M28e0YDu58SaolX",
"_JavaScriptKey":"eDoqTmoIS6Ofpf0OAgNdYKGm9TBs2fVv9MR8lS5u",
"_ClientVersion":"js1.6.14","_InstallationId":"02f7b7dd-31c7-b235-df1d-93c323dbcd60"
}
url = 'https://cloud.baladovore.com/parse/classes/Address'
test_req = requests.post(url, json=access_data)
test_req.status_code
test_req.json()

这会输出您可以使用的解码后的json响应。

我不知道_JavaScriptKey的属性。您将需要进行调查。

如果您坚持使用Srapy,则需要阅读documentation,了解如何设置请求正文。