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编码如何处理?
看了下你的问题,中文可参考下面代码
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,还有问题。正在解决中
测试了下,好像也没起效,并没有出现现有查询的关键字,而是抓取到了查询主页的内容

