我正试图刮擦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,并增加延迟。 如果有人帮助我解决了这个问题,我将不胜感激,因为我已经工作了好几天。
答案 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,了解如何设置请求正文。