Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法使用参数中的正确值填充预期结果_Python_Python 3.x_Web Scraping_Parameters_Python Requests - Fatal编程技术网

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}}']