我正试图从一个网站的多个页面中从每个页面中刮取不同的属性链接。我知道我可以使用this url来解析使用article[role='presentation'] > .list-card-info > a.list-card-link
的属性链接。我甚至可以使用相同的链接来处理一些脚本标记,以便从那里捕获属性链接
但是,我希望在这里使用this link从json内容解析detailUrl
除了west
、east
、south
和north
的值之外,我非常接近于模拟请求。下面的脚本可以解析来自页面源代码的值,但与我在开发工具中看到的值相比,它们不是正确的值。假设开发工具中的值不同
到目前为止,我已经尝试过:
import re
import json
import requests
from bs4 import BeautifulSoup
url = "https://www.zillow.com/ca/houses/"
link = "https://www.zillow.com/search/GetSearchPageState.htm?"
var = {"pagination":{"currentPage":2},"mapBounds":{"west":"","east":"","south":"","north":""},"regionSelection":[{"regionId":9,"regionType":2}],"isMapVisible":"true","mapZoom":5,"filterState":{"con":{"value":"false"},"apa":{"value":"false"},"mf":{"value":"false"},"sort":{"value":"globalrelevanceex"},"land":{"value":"false"},"tow":{"value":"false"},"manu":{"value":"false"}},"isListVisible":"true"}
params = {
"searchQueryState": var,
"includeMap": "false",
"includeList": "true"
}
page = 2
with requests.Session() as s:
s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
r = s.get(url)
var['mapBounds']['west'] = re.findall(r"west\":(.*?),",r.text)[0]
var['mapBounds']['east'] = re.findall(r"east\":(.*?),",r.text)[0]
var['mapBounds']['south'] = re.findall(r"south\":(.*?),",r.text)[0]
var['mapBounds']['north'] = re.findall(r"north\":(.*?)}",r.text)[0]
params['searchQueryState'] = json.dumps(var)
while True:
if page==5:break
res = s.get(link,params=params)
for item in res.json()['searchResults']['listResults']:
print(item['detailUrl'])
page+=1
var['pagination']['currentPage'] = page
params['searchQueryState'] = json.dumps(var)
如何使用params中的west
、east
、south
和north
的正确值?
PS脚本似乎正在工作,但我不能以正确的方式使用参数
那些对该脚本是否有效持怀疑态度的人,请查看this video作为概念证明。
问题似乎是,在获取主HTML之后,JavaScript会加载您正在查找的数据,而您的
requests
调用只会返回初始HTML。解决方案是使用类似Selenium
的东西来驱动web浏览器,然后在页面完全加载后,您可以检索解析的源代码。下面的源代码是如何使用Chrome实现这一点的示例。然而,有一个陷阱。zillow在加载所需页面之前,会不时提出一个recaptcha挑战。在我看来,在隐姓埋名模式下运行Chrome降低了这种情况的发生频率,但我无法确定这一点。我通常会使用headless
选项运行Chrome驱动程序,以保持浏览器不可见。在这里,我让它可见,以防出现recaptcha,尽管您可能无法在分配的5秒钟内解决它。最后可能不是一个好的解决方案,因为我不知道有什么简单的方法可以绕过recaptcha印刷品:
相关问题 更多 >
编程相关推荐