无法使用参数中的正确值填充预期结果

2024-10-02 00:34:26 发布

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

我正试图从一个网站的多个页面中从每个页面中刮取不同的属性链接。我知道我可以使用this url来解析使用article[role='presentation'] > .list-card-info > a.list-card-link的属性链接。我甚至可以使用相同的链接来处理一些脚本标记,以便从那里捕获属性链接

但是,我希望在这里使用this link从json内容解析detailUrl

除了westeastsouthnorth的值之外,我非常接近于模拟请求。下面的脚本可以解析来自页面源代码的值,但与我在开发工具中看到的值相比,它们不是正确的值。假设开发工具中的值不同

start page

start page having params

到目前为止,我已经尝试过:

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中的westeastsouthnorth的正确值?

PS脚本似乎正在工作,但我不能以正确的方式使用参数

那些对该脚本是否有效持怀疑态度的人,请查看this video作为概念证明。


Tags: re脚本jsonfalsevalue链接varpage
1条回答
网友
1楼 · 发布于 2024-10-02 00:34:26

问题似乎是,在获取主HTML之后,JavaScript会加载您正在查找的数据,而您的requests调用只会返回初始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}}']

相关问题 更多 >

    热门问题