Python 无法使用参数中的正确值填充预期结果
我正试图从一个网站的多个页面中从每个页面中刮取不同的属性链接。我知道我可以使用Python 无法使用参数中的正确值填充预期结果,python,python-3.x,web-scraping,parameters,python-requests,Python,Python 3.x,Web Scraping,Parameters,Python Requests,我正试图从一个网站的多个页面中从每个页面中刮取不同的属性链接。我知道我可以使用文章[role='presentation']>解析属性链接。list card info>a.list-card-link。我甚至可以使用相同的链接来处理一些脚本标记,以便从那里捕获属性链接 但是,我希望在这里使用从json内容解析detailUrl 除了西部、东部、南部和北部的值之外,我非常接近模拟这些请求。下面的脚本可以解析来自页面源代码的值,但与我在开发工具中看到的值相比,它们不是正确的值。假设开发工具中的值不
文章[role='presentation']>解析属性链接。list card info>a.list-card-link
。我甚至可以使用相同的链接来处理一些脚本标记,以便从那里捕获属性链接
但是,我希望在这里使用从json内容解析detailUrl
除了西部
、东部
、南部
和北部
的值之外,我非常接近模拟这些请求。下面的脚本可以解析来自页面源代码的值,但与我在开发工具中看到的值相比,它们不是正确的值。假设开发工具中的值不同
到目前为止,我已经尝试过:
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)
如何在参数中使用正确的西
、东
、南
和北
值?
PS脚本似乎正在工作,但我不能以正确的方式使用参数
对于此脚本是否有效有疑问的人,请检查以证明其概念。问题似乎在于,您正在查找的数据是在获取主HTML后由JavaScript加载的,而您的
请求
调用只会返回初始HTML。解决方案是使用类似于Selenium
的东西来驱动web浏览器,然后在页面完全加载后,您可以检索解析的源代码。下面的源代码是如何使用Chrome实现这一点的示例。然而,有一个陷阱。zillow在加载所需页面之前,会不时提出一个recaptcha挑战。在我看来,在隐姓埋名模式下运行Chrome降低了这种情况的发生频率,但我无法确定这一点。我通常会使用headless
选项运行Chrome驱动程序,以保持浏览器不可见。在这里,我让它可见,以防出现recaptcha,尽管您可能无法在分配的5秒钟内解决它。最后可能不是一个好的解决方案,因为我不知道有什么简单的方法可以绕过recaptcha
from selenium import webdriver
import re
url = "https://www.zillow.com/ca/houses/"
options = webdriver.ChromeOptions()
options.add_argument("--incognito")
#options.add_argument("headless")
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(options=options)
driver.implicitly_wait(5)
driver.get(url)
driver.find_element_by_class_name('map-on-left') # implicitly wait for up to 5 seconds for this element to appear
text = driver.page_source
driver.close()
west_list = re.findall(r"west\":(.*?),", text)
print(west_list)
印刷品:
['-124.482044', '0', '-124.482044}}']
问题似乎在于,您正在查找的数据是在获取主HTML之后由JavaScript加载的,而您的
请求
调用将只返回初始HTML。解决方案是使用类似于Selenium
的东西来驱动web浏览器,然后在页面完全加载后,您可以检索解析的源代码。下面的源代码是如何使用Chrome实现这一点的示例。然而,有一个陷阱。zillow在加载所需页面之前,会不时提出一个recaptcha挑战。在我看来,在隐姓埋名模式下运行Chrome降低了这种情况的发生频率,但我无法确定这一点。我通常会使用headless
选项运行Chrome驱动程序,以保持浏览器不可见。在这里,我让它可见,以防出现recaptcha,尽管您可能无法在分配的5秒钟内解决它。最后可能不是一个好的解决方案,因为我不知道有什么简单的方法可以绕过recaptcha
from selenium import webdriver
import re
url = "https://www.zillow.com/ca/houses/"
options = webdriver.ChromeOptions()
options.add_argument("--incognito")
#options.add_argument("headless")
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(options=options)
driver.implicitly_wait(5)
driver.get(url)
driver.find_element_by_class_name('map-on-left') # implicitly wait for up to 5 seconds for this element to appear
text = driver.page_source
driver.close()
west_list = re.findall(r"west\":(.*?),", text)
print(west_list)
印刷品:
['-124.482044', '0', '-124.482044}}']