爬虫小知识(二)网页进行交互

一、提交信息到网页

1、模块核心逻辑


“提交信息到网页” 是网络交互关键环节,借助 requests 库的 post() 函数,能模拟浏览器向网页发数据(如表单、文件 ),实现信息上传,让我们能与网页背后的服务器 “沟通”,像改密码、传文件等操作,都可通过它完成 。

2、浏览器提交请求流程(以改密码为例 )


操作触发:登录账户进改密码页面,填 “当前密码”“新密码” 等表单 。
抓包分析:网页空白处右键 → 检查 → Network 窗口,输密码点 “修改密码”,Network 会捕获交互信息,能看到请求方法是 POST,还能找到提交的密码等数据 。
数据传递:浏览器把表单里的密码等信息,通过 POST 请求发给服务器,服务器验证、处理后返回结果 。


3、post() 函数详解


基本形式:
 

requests.post(url, data=None, json=None, **kwargs)

参数说明:
url:必填,要提交信息的网页地址(如改密码的接口地址 ),告诉 post() 该把数据发哪 。
data:选填,要发送的数据,可是字典、元组、列表等(常用来传表单数据,像 {'old_pwd':'123','new_pwd':'456'} )。
json:选填,专门传 JSON 格式数据(当服务器要求接收 JSON 时用 ),传参后 requests 会自动设请求头 Content-Type 为 application/json 。
**kwargs:选填,额外配置(如设置请求头 headers、超时时间 timeout 等 ),让请求更灵活 。
返回值:
执行 post() 后,返回 Response 对象,和 get() 类似,可通过 r.text 看响应内容、r.status_code 查状态码等 。

示例理解:
 

import requests
# 表单数据,存字典里
data = {'OldPassword':'123456python','NewPassword':'123python','ConfirmPassword':'123python'}  
# 发 POST 请求,提交数据到指定 url
r = requests.post('https://account.ryjiaoyu.com/change-password', data=data)  
# 打印响应内容
print(r.text)  

这里 data 存改密码的表单数据,post() 带着数据发给服务器,虽然实际改密码还得先登录,但演示了 “传数据” 的核心流程 。

4、上传文件的方法(files 参数 )


想把文件(如图片、文档 )传到网页,用 files 参数,步骤:

打开文件:用 open() 函数以二进制模式(rb )打开文件,得到文件对象 。
构造参数:建字典,键是服务器接收文件的字段名(如 file ),值是文件对象 。
发起请求:post() 里传 files 参数,把文件数据发出去 。
示例代码:
 

import requests
# 打开文件,'rb' 是二进制读模式
fp = {'file':open('bitbug.ico', 'rb')}  
# 发 POST 请求,上传文件到指定 url
r = requests.post('可上传图片的网址', files=fp)  
# 打印响应内容
print(r.text)  

代码里,open() 拿到文件对象,files 带着它发请求,服务器接收后,就能把文件存到指定位置(实际要填正确的上传网址 )。

 二、代理服务器

1、会话(Session)


核心逻辑
HTTP 本身无记忆,每次请求独立。会话(Session) 就是为解决这问题,让客户端(浏览器)和服务器 “记住” 交互状态(比如登录态 ),常用 Cookie 实现:服务器发 Cookie 给客户端存着,下次请求带着,服务器就知道 “是同一用户” 。

创建会话(requests 实现 )
用 requests 库的 Session 类,自动维持会话、管理 Cookie,代码形式:

import requests
# 创建会话对象,后续用 s 发请求,自动带 Cookie
s = requests.Session()  

比如登录操作,先用 s.post() 提交账号密码,登录后的 Cookie 会存在 s 里,再用 s.get() 访问需要登录的页面,就自动带着登录态,不用手动传 Cookie 。

2、代理服务器


1是什么 & 作用


代理服务器是客户端和目标服务器中间的 “中转站” 。客户端发请求给代理,代理再转发给目标服务器,拿到响应后再回传给客户端。

作用超关键:

防封禁:频繁爬取时,目标服务器会封客户端 IP ,用代理换 IP ,让服务器以为是不同用户请求。
突破限制:有些资源限制访问来源,代理可伪装成允许的 IP 去请求。


2、工作流程(对应图文 )


客户端(你写的爬虫)→ 发 URL 请求给代理服务器 。
代理服务器 → 转发请求给目标服务器 。
目标服务器 → 把响应给代理服务器 。
代理服务器 → 再把响应回传给客户端 。
相当于代理 “替你” 和目标服务器沟通,隐藏真实 IP 。


3、使用方法(requests 代码 )


在 get()/post() 里加 proxies 参数,传代理的 IP 等信息,代码形式:
 

import requests
# 构造代理字典,http/https 按需选,值是代理地址(IP:端口 )
proxy = {'http': '代理服务器地址:端口'}  
# 请求时传 proxies,走代理访问目标网址
r = requests.get('https://www.xxx.com/', proxies=proxy)  
print(r.text)

比如代理地址是 115.29.199.168:1188 ,就写成 proxy = {'http': '115.29.199.168:1188'} ,请求时带着它,数据就会走代理服务器转发 。

注意:免费代理有时效性,可能用着用着就失效,实际项目常用付费、稳定的代理~

三、selenium库驱动浏览器

1、Selenium 库核心认知

Selenium 库是 Web 应用程序测试与自动化操作的利器 ,能驱动浏览器(如 Edge、Firefox 等)执行点击、输入、打开、验证等操作 。与 Requests 库差异显著:Requests 库仅能获取网页原始代码,而 Selenium 基于浏览器驱动程序工作,浏览器可渲染网页源代码,借此能轻松拿到渲染后的数据信息(如 JS 动态加载内容 ),完美解决 Requests 库无法处理的动态页面数据提取难题。

2、使用 Selenium 库前的准备

安装 WebDriver

浏览器依托内核(如 Edge 浏览器基于 Chromium 内核 )运行,Selenium 驱动浏览器需对应内核的 WebDriver 。以 Edge 浏览器为例:

  1. 确定浏览器内核版本:打开 Edge 浏览器,在设置 - 关于 Microsoft Edge 中查看版本。
  2. 下载匹配的 EdgeDriver:访问微软官方 EdgeDriver 下载页(Microsoft Edge WebDriver | Microsoft Edge Developer ),选择与浏览器版本适配的 EdgeDriver(版本尽量贴近 )。
  3. 配置驱动程序:解压下载的 EdgeDriver,将 msedgedriver.exe(Windows 系统 )移动到 Python 安装目录的 Scripts 文件夹(通过 where python(Windows)或 which python3(macOS/Linux )命令查找 Python 路径 ),完成环境关联。
安装 Selenium 库

在命令提示符(Windows)或终端(macOS/Linux )执行:

pip install selenium 

安装后,用 pip show selenium 查看库信息,确认安装成功。

3、驱动浏览器(以 Edge 为例 )

Selenium 支持多种浏览器,驱动 Edge 浏览器代码如下:

from selenium import webdriver  
from selenium.webdriver.edge.options import Options  # 创建浏览器配置对象
edge_options = Options()  
# 绑定 Edge 浏览器可执行文件路径(需替换为你电脑中 Edge 的实际安装路径)
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"  
# 初始化 Edge 浏览器驱动,通过配置对象关联浏览器
driver = webdriver.Edge(options=edge_options)  

4、加载网页

get() 方法加载单网页

get(url) 可在当前浏览器会话打开指定网页,示例:

from selenium import webdriver  
from selenium.webdriver.edge.options import Options  edge_options = Options()  
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"  
driver = webdriver.Edge(options=edge_options)  
# 加载人民邮电出版社官网期刊页
driver.get('https://www.ptpress.com.cn/periodical')  

执行后,Edge 浏览器自动启动并打开目标网页,用于后续数据提取、交互操作。

execute_script() 方法打开多标签页

该方法通过执行 JavaScript 脚本,在同一浏览器打开多个标签页,格式:execute_script(script, *args) ,script 为 JavaScript 脚本字符串。示例:

from selenium import webdriver  
from selenium.webdriver.edge.options import Options  edge_options = Options()  
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"  
driver = webdriver.Edge(options=edge_options)  
# 先打开主页面
driver.get('https://www.ptpress.com.cn/')  
# 打开新标签页(人民邮电出版社登录页)
driver.execute_script("window.open('https://www.ptpress.com.cn/login','_blank');")  
# 打开另一个新标签页(数艺社页面 )
driver.execute_script("window.open('https://www.shuyishe.com/','_blank');")  

借助 JavaScript 的 window.open 方法,实现多标签页批量打开,满足复杂网页跳转需求。

5、获取渲染后的网页代码

浏览器加载网页并渲染后,用 page_source 方法提取渲染后的完整代码(含 JS 动态加载内容 ),示例:

from selenium import webdriver  
from selenium.webdriver.edge.options import Options  edge_options = Options()  
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"  
driver = webdriver.Edge(options=edge_options)  
driver.get('https://www.ptpress.com.cn/')  
# 获取渲染后的网页源代码
rendered_html = driver.page_source  
print(rendered_html)  

page_source 获取的代码,可用于正则表达式、XPath 等方式提取目标数据(如商品价格、新闻内容 )。

5、获取和操作网页元素

获取网页中的指定元素

Selenium 提供多种元素定位方法(替代正则表达式筛选 ),常用如下:

  • find_element(By.ID, "id值"):通过元素 id 定位(页面唯一 )。
  • find_element(By.NAME, "name值"):按 name 属性定位。
  • find_element(By.XPATH, "XPath 表达式"):灵活的路径定位,适配复杂页面。

示例(定位搜索框并输入内容 ):

from selenium import webdriver  
from selenium.webdriver.edge.options import Options  
from selenium.webdriver.common.by import By  edge_options = Options()  
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"  
driver = webdriver.Edge(options=edge_options)  
driver.get('https://www.ptpress.com.cn/')  # 用 XPath 定位搜索框(需替换为实际页面 XPath )
search_box = driver.find_element(By.XPATH, '//input[@placeholder="搜索图书、作者、ISBN"]')  
# 输入搜索关键词(这里通过 input 交互,模拟用户输入 )
a = input("请输入搜索关键词:")  
search_box.send_keys(a)  

通过 find_element 系列方法,精准定位元素后,可执行输入、点击等交互操作。

获取多个元素与批量操作

find_elements() 方法(注意复数 )可获取页面中匹配条件的多个元素,示例(提取页面中所有图书封面图片元素 ):

from selenium import webdriver  
from selenium.webdriver.edge.options import Options  
from selenium.webdriver.common.by import By  edge_options = Options()  
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"  
driver = webdriver.Edge(options=edge_options)  
driver.get('https://www.ptpress.com.cn/search?keyword=python')  # 定位所有图书封面图片元素(假设用 XPath 匹配 )
book_covers = driver.find_elements(By.XPATH, '//img[@class="book-cover"]')  
for cover in book_covers:  # 可获取元素属性(如 src )或执行点击等操作print(cover.get_attribute('src'))  

遍历获取的元素列表,能批量提取信息(如图片链接 )或执行交互,提升自动化效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/89489.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/89489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF学习(五)

文章目录一、FileStream和StreamWriter理解1.1、具体关系解析1.2、类比理解1.3、总结1.4、示例代码1.5、 WriteLine()和 Write()的区别1.6、 StreamWriter.Close的作用二、一、FileStream和StreamWriter理解 在 C# 中,StreamWriter 和 FileS…

ctf.show-web习题-web2-最简单的sql注入-flag获取详解、总结

解题思路打开靶场既然提示是最简单的sql注入了,那么直接尝试永真登录1 or 11#这里闭合就是简单的单引号可以看到没登录成功,但是有回显:欢迎你,ctfshowsql注入最喜欢的就是回显了!这题的思路就是靠这个回显&#xff0c…

upload-labs 靶场通关(1-20)

目录 Pass-01(JS 绕过) Pass-02(文件类型验证) Pass-03(黑名单验证) Pass-04(黑名单验证.htaccess) Pass-05(大小写绕过) Pass-06(末尾空格) Pass-07(增加一个.) Pass-08(增加一个::$DATA) Pass-09(代码不严谨) Pass-10(PPHPHP&am…

[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+vue实现的酒店预订管理系统,推荐!

摘 要 使用旧方法对酒店预订信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在酒店预订信息的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。 这次开发的酒店预订管理系…

LSTM入门案例(时间序列预测)| pytorch实现(可复现)

需求 假如我有一个时间序列,例如是前113天的价格数据(训练集),然后我希望借此预测后30天的数据(测试集),实际上这143天的价格数据都已经有了。这里为了简单,每一天的数据只有一个价…

Axure RP 10 预览显示“无标题文档”的空白问题探索【护航版】

1. 安装情况 官网 Axure RP 10:Download Axure RP 10 - Axure (PS:11都出了) 版本:10.0.0.3924 激活码:49bb9513c40444b9bcc3ce49a7a022f9 (10/11都可以用,但只尝试了10&#xff…

基于SpringBoot+Vue的汽车租赁系统(协同过滤算法、腾讯地图API、支付宝沙盒支付、WebsSocket实时聊天、ECharts图形化分析)

系统亮点:协同过滤算法、腾讯地图API、支付宝沙盒支付、WebsSocket实时聊天、ECharts图形化分析;01系统开发工具与环境搭建—前后端分离架构项目架构:B/S架构运行环境:win10/win11、jdk17前端:技术:框架Vue…

数据结构入门:像整理收纳一样简单!

在我们生活中,经常会面对这样的问题: “我要怎么整理我的衣柜?” “电脑里照片太多了,怎么归类才方便查找?” 其实,程序员也有类似的烦恼。他们不整理衣柜,而是“整理数据”。而这门关于如何“收…

力扣每日一题--2025.7.15

📚 力扣每日一题–2025.7.15 3135. 有效单词 (简单) 大家好!今天我们要来聊聊一道有趣的编程题——有效单词 📝 题目描述 题目分析 📚 题目要求我们判断一个字符串是否为有效单词。有效单词需要满足以下…

Mysql数据库——增删改查CRUD

文章目录一、数据库的基础命令二、创建表三、增(create)四、查询(retrieve)五、条件查询(where)六、修改(update)七、删除(delete)一、数据库的基础命令 1.使用客户端连接服务器 mysql -u root…

关于pytorch虚拟环境及具体bug问题修改

本篇博客包含对于虚拟环境概念的讲解和代码实现过程中相关bug的解决关于虚拟环境我的pytorch虚拟环境在D盘,相应python解释器也在D盘(一起),但是我的pycharm中的项目在C盘,使用的是pytorch的虚拟环境,这是为…

U盘量产工具与性能优化完全指南

本文还有配套的精品资源,点击获取 简介:U盘量产工具是IT行业中的专业软件,用于批量生产或修复U盘。安国和银灿是两个提供U盘量产工具的主控芯片制造商,提供初始化、格式化、分区管理、性能优化、故障修复、个性化定制、固件升级…

Golang http开发实战:构建RESTful API保姆级教程

目录 章节1:RESTful API的精髓与Go的Web开发哲学 RESTful API的设计原则 Go的http包核心组件 实战:第一个RESTful API端点 章节2:设计优雅的RESTful路由 路由设计的注意事项 使用Gorilla Mux实现动态路由 章节3:请求与响应的艺术:解析与格式化 解析请求数据 统一…

UGUI 性能优化系列:第一篇——基础优化与资源管理

UGUI 性能优化系列:第一篇——基础优化与资源管理 UGUI 性能优化系列:第二篇——Canvas 与 UI 元素管理 在 Unity 游戏中,用户界面(UI)是玩家与游戏交互的核心。然而,不当的 UGUI 使用常常成为游戏性能的…

多端协同的招聘系统源码开发指南:小程序+APP一体化设计

当下,很多企业选择搭建属于自己的多端协同招聘平台,尤其是中大型人力资源公司、连锁品牌企业,以及同城服务平台,更是将“小程序APP”一体化招聘系统视为提升效率、降低用工成本的利器。 今天,笔者将从源码开发的角度&a…

Maven 配置文件核心配置:本地仓库、镜像与 JDK 版本

Maven 配置文件核心配置:本地仓库、镜像与 JDK 版本 在 Maven 项目开发中,合理配置 settings.xml 文件能显著提升依赖管理效率。本文将聚焦本地仓库、镜像加速和 JDK 版本这三个核心配置,结合 IDEA 环境详细讲解配置方法与作用。 一、Maven 配…

【时时三省】(C语言基础)通过指针引用字符串

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省如在printf函数中输出一个字符串。这些字符串都是以直接形式(字面形式)给出的,在一对双撇号中包含若干个合法的字符。使用字符串的更加灵活方便的方法——通…

【Linux驱动-快速回顾】一文快速理解GIC内部寄存器对中断的控制

第一部分:GIC的功能和组成 1. GIC要解决的根本问题 在一个复杂的片上系统(SoC)中,有非常多的硬件模块(如定时器、串口、按键、DMA等),它们都需要在完成任务或遇到特定事件时通知CPU。同时&#…

【IoTDB 线上小课 17】开源 ≠ 免费,3 分钟总结开源商用指南

【IoTDB 视频小课】第十七期,解答你最关心的开源商业使用问题!关于 IoTDB,关于物联网,关于时序数据库,关于开源...一个问题重点,3-5 分钟,我们讲给你听:原来开源商业化有这么多规则开…

VUE项目学习笔记 v-for绑定数据,该数据异步获取,同时需要对v-for的DOM节点进行js操作

问题描述:项目里有一个轮播图,轮播图的图片数据从服务器获取,用v-for生成DOM在页面中显示,轮播图插件会通过new Swiper给DOM添加CSS、事件等,实现轮播效果。在这里存在操作顺序问题:当服务器返回图片数据后…