爬虫小知识(二)网页进行交互
一、提交信息到网页
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 浏览器为例:
- 确定浏览器内核版本:打开 Edge 浏览器,在设置 - 关于 Microsoft Edge 中查看版本。
- 下载匹配的 EdgeDriver:访问微软官方 EdgeDriver 下载页(Microsoft Edge WebDriver | Microsoft Edge Developer ),选择与浏览器版本适配的 EdgeDriver(版本尽量贴近 )。
- 配置驱动程序:解压下载的 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'))
遍历获取的元素列表,能批量提取信息(如图片链接 )或执行交互,提升自动化效率。