如何在Python中无需Selenium触发网页JS函数完成parsing任务
解决JS动态表单提交的Python解析方案
不用Selenium也能搞定,核心是直接模拟JS函数的逻辑,不用执行JS。先拆解你给的代码逻辑,再一步步实现:
1. 先搞懂JS函数到底做了什么
看你提供的submit函数,它的核心动作是:
- 找到页面里的
PostForm表单,添加两个隐藏字段Key和Title - 把传入的
key、title参数赋值给这两个字段 - 把表单的提交目标设为
Groups.aspx,然后提交表单 - 页面锚点的修改只是视觉跳转,不影响表单提交的核心逻辑
2. 从HTML里提取需要的参数
首先要把每个<a>标签里的submit参数和文本提取出来,用BeautifulSoup就能搞定:
from bs4 import BeautifulSoup # 假设这是你爬取到的页面HTML内容 page_html = """ <a href="javascript:submit('RJuzPlvdavwzyOu12R7PKQ==','название товара....','0');">название товара....</a> <a href="javascript:submit('another-key','另一个商品','1');">另一个商品</a> """ soup = BeautifulSoup(page_html, "html.parser") items = [] for a_tag in soup.find_all("a", href=True): href = a_tag["href"] if not href.startswith("javascript:submit("): continue # 提取函数里的三个参数 param_str = href[len("javascript:submit("):-1] # 分割并清理引号和空格 key, title, value = [p.strip().strip("'") for p in param_str.split(",")] # 提取商品文本 item_text = a_tag.get_text(strip=True) items.append({ "text": item_text, "key": key, "title": title, "value": value }) # 打印提取结果 for item in items: print(f"文本: {item['text']}, Key: {item['key']}, Title: {item['title']}")
3. 模拟表单提交(获取实际跳转后的内容)
JS最终是提交表单到Groups.aspx,我们直接用requests模拟这个POST请求就行,注意要保持会话(带cookies),如果网站有ASPX的验证字段,还要提取ViewState:
import requests from bs4 import BeautifulSoup # 替换成目标网站的基础域名 BASE_URL = "https://目标网站域名.com" # 原页面的URL(就是包含这些a标签的页面) ORIGINAL_PAGE_URL = f"{BASE_URL}/包含a标签的页面路径" # 表单提交的目标URL SUBMIT_TARGET = f"{BASE_URL}/Groups.aspx" # 初始化会话,保持cookies session = requests.Session() # 先请求原页面,获取会话和可能需要的ASPX验证字段 original_response = session.get(ORIGINAL_PAGE_URL) original_soup = BeautifulSoup(original_response.text, "html.parser") # 提取ASPX页面的必要隐藏字段(如果有的话,没有可以删掉这部分) form_data = {} for field in ["__VIEWSTATE", "__VIEWSTATEGENERATOR", "__EVENTVALIDATION"]: input_tag = original_soup.find("input", {"name": field}) if input_tag: form_data[field] = input_tag["value"] # 遍历之前提取的每个商品,模拟提交 for item in items: # 添加Key和Title字段 form_data["Key"] = item["key"] form_data["Title"] = item["title"] # 提交表单 submit_response = session.post(SUBMIT_TARGET, data=form_data) # 这里可以处理提交后的响应,比如提取跳转后的页面内容 print(f"处理商品: {item['text']},响应状态码: {submit_response.status_code}") # 如果需要保存页面内容 # with open(f"{item['text']}.html", "w", encoding="utf-8") as f: # f.write(submit_response.text)
注意事项
- 网站可能有反爬,记得在请求头里加
User-Agent,模拟浏览器请求:session.headers.update({ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" }) - 如果表单是GET方法(看原页面
<form>标签的method属性),就把post改成get,并把data换成params - 锚点
value参数不影响表单提交,除非网站后端会读取锚点,但根据JS逻辑,这只是修改当前页面URL,不用管它
内容的提问来源于stack exchange,提问作者VeRteX
相关产品推荐
相关产品推荐

