Python中如何爬取window.open打开的网页,参数被escape编码如何处理?

例如网址: http://hr.bjx.com.cn/SearchResult.aspx

params = {‘keyWord’: input_str, ‘function2’: ‘’, ‘function1’: ‘’,‘class1’: ‘’, ‘class2’: ‘’, ‘workprovince’: ‘’, ‘record’: 0, ‘workTime’: 0,‘chkabove’: ‘’, ‘page’: i}
r=requests.get(‘http://hr.bjx.com.cn/SearchResult.aspx’,headers=headers_input,params=params,timeout=5) #params=params 时会出错
r.encoding = r.apparent_encoding #从内容分析出的响应内容编码方式
resp_text=r.text

如果 ·input_str· 为中文则搜索失败,为英文是 OK 的。
Python中如何爬取window.open打开的网页,参数被escape编码如何处理?


4 回复

看了下你的问题,中文可参考下面代码


import requests
headers_input={
“user-agent”:“Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36”
}
k=str(“运维”.encode(‘unicode-escape’))
k=k.replace("\\","%")
print(k)
u=“http://hr.bjx.com.cn/SearchResult.aspx?keyword={}&function1=&function2=&class1=&class2=&record=0&workTime=0&workprovince=&chkabove=”.format(k)
params = {‘keyWord’: k.upper(), ‘function2’: ‘’, ‘function1’: ‘’,‘class1’: ‘’, ‘class2’: ‘’, ‘workprovince’: ‘’, ‘record’: 0, ‘workTime’: 0,‘chkabove’: ‘’, ‘page’: 1}
r=requests.get(u,headers=headers_input,timeout=5) #params=params 时会出错
r.encoding = r.apparent_encoding #从内容分析出的响应内容编码方式
resp_text=r.text
print(r.text)


遇到这种弹窗页面,直接用Selenium处理最省事。escape编码其实就是JavaScript的escape()函数,用Python的urllib.parse.unquote()就能解码。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import urllib.parse
import time

# 启动浏览器
driver = webdriver.Chrome()
driver.get("你的目标网页URL")

# 找到触发window.open的元素并点击
open_button = driver.find_element(By.ID, "你的按钮ID")
open_button.click()

# 等待新窗口打开并切换过去
time.sleep(2)  # 简单等待,生产环境建议用WebDriverWait
handles = driver.window_handles
driver.switch_to.window(handles[-1])

# 获取新窗口的URL(可能包含escape编码参数)
new_url = driver.current_url

# 解析URL中的参数
from urllib.parse import urlparse, parse_qs
parsed = urlparse(new_url)
query_params = parse_qs(parsed.query)

# 解码escape编码的参数
decoded_params = {}
for key, values in query_params.items():
    decoded_values = [urllib.parse.unquote(v) for v in values]
    decoded_params[key] = decoded_values[0] if len(decoded_values) == 1 else decoded_values

print("解码后的参数:", decoded_params)

# 现在可以继续爬取新窗口的内容
# driver.find_element(...) 等操作

# 最后记得关闭
driver.quit()

如果不想用Selenium,可以手动解析JavaScript代码找到window.open的调用,然后自己构造请求。但这样比较麻烦,需要分析前端代码。

简单说就是:Selenium模拟点击获取真实URL,urllib.parse.unquote()解码参数。

谢谢,我 用 Python 2,还有问题。正在解决中

测试了下,好像也没起效,并没有出现现有查询的关键字,而是抓取到了查询主页的内容

回到顶部