访问这个website之后,当我用Sydney CBD, NSW
填写输入框并点击搜索按钮时,我可以看到那个站点上显示的所需结果。
我想刮属性链接使用请求模块。当我去下面的尝试,我可以从第一页的属性链接。
这里的问题是我在params中硬编码了sha256Hash
的值,这不是我想要做的。我不知道通过向建议URL发出get请求检索到的ID是否需要转换为sha256Hash
。
但是,当我使用get_hashed_string()
函数执行此操作时,它产生的值与params中的硬编码值不同,因此,脚本在以下行中生成一个keyError
:container = res.json()
.
import requests
import hashlib
from pprint import pprint
from bs4 import BeautifulSoup
url = 'https://suggest.realestate.com.au/consumer-suggest/suggestions'
link = 'https://lexa.realestate.com.au/graphql'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36',
}
payload = {
'max': '7',
'type': 'suburb,region,precinct,state,postcode',
'src': 'homepage-web',
'query': 'Sydney CBD, NSW'
}
params = {"operationName":"searchByQuery","variables":{"query":"{\"channel\":\"buy\",\"page\":1,\"pageSize\":25,\"filters\":{\"surroundingSuburbs\":true,\"excludeNoSalePrice\":false,\"ex-under-contract\":false,\"ex-deposit-taken\":false,\"excludeAuctions\":false,\"excludePrivateSales\":false,\"furnished\":false,\"petsAllowed\":false,\"hasScheduledAuction\":false},\"localities\":[{\"searchLocation\":\"sydney cbd, nsw\"}]}","testListings":False,"nullifyOptionals":False},"extensions":{"persistedQuery":{"version":1,"sha256Hash":"ef58e42a4bd826a761f2092d573ee0fb1dac5a70cd0ce71abfffbf349b5b89c1"}}}
def get_hashed_string(keyword):
hashed_str = hashlib.sha256(keyword.encode('utf-8')).hexdigest()
return hashed_str
with requests.Session() as s:
s.headers.update(headers)
r = s.get(url,params=payload)
hashed_id = r.json()['_embedded']['suggestions'][0]['id']
# params['extensions']['persistedQuery']['sha256Hash'] = get_hashed_string(hashed_id)
res = s.post(link,json=params)
container = res.json()['data']['buySearch']['results']['exact']['items']
for item in container:
print(item['listing']['_links']['canonical']['href'])
如果我按原样运行脚本,它会运行得很漂亮。当我取消注解params['extensions']['persistedQuery']-->
行并再次运行脚本时,脚本会中断。
如何生成sha256Hash
的值并在上面的脚本中使用该值?
1条答案
按热度按时间ergxz8rk1#
这不是
graphql
的工作方式,sha
的值在所有请求中保持不变,但缺少的是一个有效的graphql
查询。您必须首先重新构造它,然后使用API分页-这是关键。
具体方法如下:
这将为您提供: