使用xpath从scrapy shell获取空响应,而它在element insp中工作

2024-06-28 20:16:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力刮this webpage(为了教育目的)

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

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

同时,在scrapy shell中,它不起作用:

$ 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>

我已经尝试了我在网上找到的所有建议。例如更改用户代理,将ROBOTSTXT\u OBEY设置为False,并增加延迟。 如果有人帮我解决这个问题,我会非常感激,因为我已经做了好几天了


Tags: inhttpsdivcomcloudmapaddressresponse
1条回答
网友
1楼 · 发布于 2024-06-28 20:16:13

如果您使用scrapy shell查看响应的内容(使用response.body),您将看到服务器用一个充满脚本的小页面进行响应,然后执行这些脚本

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

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

编辑1:你需要做的不仅仅是https://cloud.baladovore.com/parse/classes/Address

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

Request URL: https://cloud.baladovore.com/parse/classes/Address

Request Method: POST

Request Payload: {"where":{"objectId":"sNRgAcGKiY"},"limit":1,"_method":"GET","_ApplicationId":"cB4rsS2KbFIG5IQyjJv0XaDC8M28e0YDu58SaolX","_JavaScriptKey":"eDoqTmoIS6Ofpf0OAgNdYKGm9TBs2fVv9MR8lS5u","_ClientVersion":"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中关于如何设置请求主体的内容

相关问题 更多 >