【python百度智能云】:Python — 三种获取__VIEWSTATE、__VIEWSTATEGENERATOR、__EVENTVALIDATION方法。

本文介绍使用Python通过正则表达式、XPath及BeautifulSoup三种方法获取网页中的__VIEWSTATE、__VIEWSTATEGENERATOR和__EVENTVALIDATION值,适用于表单提交等场景。
部署运行你感兴趣的模型镜像

 

学习目标:

       Python 获取获取__VIEWSTATE、__VIEWSTATEGENERATOR、__EVENTVALIDATION;相信很多python做CFC 函数调用、云函数、提交Form表单的时候,获取打开网页的三个值,并且提交表单.......有各种情况会使用到,这次我们总结三种常见方法,仅供参考!也欢迎大家一起讨论交流。


第一种方法:正则表达式解决(正则表达式:正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。)

Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。re 模块使 Python 语言拥有全部的正则表达式功能。

# 正则表达式解决

def get_VIEWSTATE(r):
    pattern1=r'VIEWSTATE\".*value=\".*\"'
    match=re.search(pattern1, r).group(0)
    pattern2 = r'VIEWSTATE\" id=\"__VIEWSTATE\" value=\"'
    match1 = re.split(pattern2, match)
    return match1[1][:-1]  # 返回_VIEWSTATE


def get_EVENTVALIDATION(r):
    pattern1 = r'EVENTVALIDATION\".*value=\".*\"'
    match = re.search(pattern1, r).group(0)
    pattern2 = r'EVENTVALIDATION\" id=\"__EVENTVALIDATION\" value=\"'
    match1 = re.split(pattern2, match)
    return match1[1][:-1]  # 返回_EVENTVALIDATION


def get_VIEWSTATEGENERATOR(r):
    pattern1 = r'VIEWSTATEGENERATOR\".*value=\".*\"'
    match = re.search(pattern1, r).group(0)
    pattern2 = r'VIEWSTATEGENERATOR\" id=\"__VIEWSTATEGENERATOR\" value=\"'
    match1 = re.split(pattern2, match)
    return match1[1][:-1]  # 返回_EVENTVALIDATION


login_url  #指的是网页超链接

html_yiban = session.get(login_url)
VIEWSTATE = get_VIEWSTATE(html_yiban.text)
VIEWSTATEGENERATOR = get_VIEWSTATEGENERATOR(html_yiban.text)
EVENTVALIDATION = get_EVENTVALIDATION(html_yiban.text)
print(VIEWSTATEGENERATOR)

第二种方法:xpath方法解决(xpath:XPath,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历

  • XPath 使用路径表达式在 XML 文档中进行导航
  • XPath 包含一个标准函数库
  • XPath 是 XSLT 中的主要元素
# xpath方法解决

from lxml import etree

login_url  #指的是网页超链接

html = etree.parse(login_url, etree.HTMLParser())
VIEWSTATE = html.xpath("//input[@id='__VIEWSTATE']/@value")
VIEWSTATEGENERATOR = html.xpath("//input[@id='__VIEWSTATEGENERATOR']/@value")
print(VIEWSTATEGENERATOR)
EVENTVALIDATION = html.xpath("//input[@id='__EVENTVALIDATION']/@value")

第三种方法:BeautifulSoup方法解决(BeautifulSoup方法:提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。)

Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。

# BeautifulSoup方法解决

from bs4 import BeautifulSoup

login_url  #指的是网页超链接

html_yiban = session.get(login_url).content
bsObj = BeautifulSoup(html_yiban, "html.parser")
VIEWSTATE = bsObj.find('input', {'id': '__VIEWSTATE'}).attrs['value']
VIEWSTATEGENERATOR = bsObj.find('input', {'id': '__VIEWSTATEGENERATOR'}).attrs['value']
print(VIEWSTATEGENERATOR)
EVENTVALIDATION = bsObj.find('input', {'id': '__EVENTVALIDATION'}).attrs['value']

总结

        以上方法亲测有效,具体需要大家自己摸索一下,根据自己获取的网页代码从而进行更改,xpath方法如何获取请大家自行百度,有很多大牛写的挺不错!正则表达式也是!

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

获取合法的 `Ecp_ClientId`,你需要模拟用户在浏览器中访问知网(CNKI)时的行为,让服务器为你生成一个有效的 `Ecp_ClientId`。由于 `Ecp_ClientId` 是服务器端生成的客户端唯一标识符,不能随意伪造,否则可能导致请求失败或触发反爬机制。 --- ## ✅ 获取合法 `Ecp_ClientId` 的方法 ### 1. **使用浏览器开发者工具抓包获取(最直接)** #### 步骤如下: 1. 打开浏览器(如 Chrome),进入 [知网高级检索页面](https://kns.cnki.net/kns8s/AdvSearch) 2. 按下 `F12` 打开开发者工具 3. 切换到 `Network` 标签 4. 刷新页面,在请求列表中找到任意一个请求(如 `AdvSearch` 页面请求) 5. 点击该请求,在 `Headers` 中找到 `Cookie` 字段 6. 在 `Cookie` 中查找 `Ecp_ClientId=xxx` 的值 #### 示例 Cookie 片段: ``` Ecp_ClientId=your_valid_client_id; SID_kns_new=xxx; ... ``` --- ### 2. **使用 Scrapy 登录知网自动获取 Cookie** 你可以使用 `Scrapy` 模拟登录知网,登录后服务器会自动返回包含 `Ecp_ClientId` 的 Cookie。 #### 示例代码: ```python import scrapy from scrapy import FormRequest class CnkiLoginSpider(scrapy.Spider): name = 'cnki_login' login_url = 'https://kns.cnki.net/kns8s/Login' def start_requests(self): yield scrapy.Request(url='https://kns.cnki.net/kns8s/AdvSearch', callback=self.parse) def parse(self, response): # 提取登录所需参数(如 __VIEWSTATE、__EVENTVALIDATION 等) login_data = { 'username': 'your_username', 'password': 'your_password', # 可能还需要其他隐藏字段 } yield FormRequest( url=self.login_url, formdata=login_data, callback=self.after_login ) def after_login(self, response): # 登录成功后,从响应头中提取 Cookie cookies = response.request.headers.get('Cookie') self.log(f'登录成功,Cookie: {cookies}') # 你可以从 cookies 中提取 Ecp_ClientId # 示例:Ecp_ClientId=xxx; ... yield scrapy.Request(url='https://kns.cnki.net/kns8s/brief/grid', callback=self.parse_result) def parse_result(self, response): self.log('当前响应 Cookie: %s' % response.request.headers.get('Cookie')) # 处理搜索结果 ``` --- ### 3. **使用 Selenium 自动化浏览器登录获取 Cookie** Selenium 会模拟真实浏览器行为,登录后会自动保存 Cookie,包括 `Ecp_ClientId`。 #### 示例代码: ```python from selenium import webdriver # 启动浏览器 driver = webdriver.Chrome() driver.get("https://kns.cnki.net/kns8s/AdvSearch") # 手动或自动登录(需要填写用户名密码) # 示例自动填写: # driver.find_element("id", "username").send_keys("your_username") # driver.find_element("id", "password").send_keys("your_password") # driver.find_element("id", "loginBtn").click() # 获取所有 Cookie cookies = driver.get_cookies() # 查找 Ecp_ClientId for cookie in cookies: if cookie['name'] == 'Ecp_ClientId': print("获取到合法 Ecp_ClientId:", cookie['value']) break ``` --- ### 4. **使用 requests.Session() 模拟登录获取 Cookie** 如果你不想用 Scrapy 或 Selenium,可以使用 `requests` 库模拟登录,自动维护 Cookie。 ```python import requests session = requests.Session() login_data = { 'username': 'your_username', 'password': 'your_password', # 其他字段如 __VIEWSTATE 等可能需要 } # 模拟登录 session.post('https://kns.cnki.net/kns8s/Login', data=login_data) # 获取 Cookie cookies = session.cookies.get_dict() print("Cookies:", cookies) # 提取 Ecp_ClientId if 'Ecp_ClientId' in cookies: print("Ecp_ClientId:", cookies['Ecp_ClientId']) else: print("未找到 Ecp_ClientId,请检查登录是否成功") ``` --- ## ✅ 注意事项 | 事项 | 说明 | |------|------| | **Cookie 有效期** | `Ecp_ClientId` 通常在 24 小时内有效,需定期更新 | | **反爬机制** | 频繁请求可能导致 IP 被封,建议设置请求间隔 | | **Session 一致性** | 使用 `Session` 或 `Scrapy` 的 Cookie 管理机制保持会话一致性 | | **使用代理 IP** | 可以防止 IP 被封,提高爬虫稳定性 | --- ## ✅ 总结 | 方法 | 是否推荐 | 说明 | |------|----------|------| | 浏览器抓包 | ✅ 推荐 | 最直接,适合调试 | | Scrapy 登录 | ✅ 推荐 | 适合自动化爬虫 | | Selenium | ✅ 推荐 | 模拟浏览器,适合复杂反爬 | | requests.Session | ✅ 推荐 | 简洁易用,适合轻量级任务 | --- ##
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值