Python爬虫入门实战:从基础请求到Selenium自动化
一、前言对于爬虫入门者而言最核心的需求是 “能看懂、能运行、能落地”。本文从零开始循序渐进讲解 Python 爬虫核心技术 —— 从基础的requests请求、UA 伪装、数据保存到re正则解析、lxml的 XPath 提取再到 Selenium 自动化浏览器操作全程附完整可运行代码 详细注释帮你快速上手避开入门常见坑。入门提醒静态网页用requests结合解析工具即可高效爬取但如今多数网站采用 JavaScript 动态渲染如滚动加载、点击加载更多、登录后才显示内容此时requests无法获取渲染后的完整数据而 Selenium 能完美解决这一痛点。下面先吃透 Selenium 核心知识再逐步开展实战演练。二、基础篇requests 请求与 UA 伪装入门必学1. 基础 GET 请求 UA 伪装避坑核心很多新手刚入门时直接用requests发送请求会被网站拦截核心原因是未进行 UA 伪装 —— 网站会识别出请求来自 Python 程序而非真实浏览器。因此UA 伪装是爬虫入门的第一个必学技巧。pythonUA伪装模拟浏览器请求避免被服务器拦截入门必写 import requests # 目标URL百度首页可直接替换为其他静态网页 url https://www.baidu.com/ # UA伪装模拟Chrome浏览器的请求头复制自己浏览器的UA更稳妥 headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 } # 发送GET请求带UA伪装避免被拦截 response requests.get(url, headersheaders) # 自动识别网页编码彻底解决中文乱码问题新手必加 response.encoding response.apparent_encoding # 打印网页源码验证请求是否成功 print(response.text)2. 保存网页中的图片 / 文件实战常用爬虫实战中经常需要下载图片、文档等资源核心是通过requests获取资源的二进制内容再以二进制写入模式保存到本地步骤简单且通用。python保存网页中的图片二进制文件写入实战通用模板 import requests # 图片URL可替换为任意图片链接 img_url https://cdn.ptpress.cn/uploadimg/Material/978-7-115-68312-0/72jpg/68312_s300.jpg # 发送请求获取图片二进制数据图片、视频均为二进制资源 response requests.get(img_url) # 以二进制写入模式保存图片wb二进制写不可修改 with open(book_cover.jpg, wb) as f: f.write(response.content) print(图片保存成功可在当前文件夹查看) # 补充保存文本文件示例爬虫结果保存常用 with open(a.txt, w, encodingutf-8) as f: f.write(人工智能) print(文本文件保存成功)3. 正则解析网页数据简单场景首选对于简单的文本提取场景如提取标题、链接无需复杂解析工具用re.findall()即可快速提取目标信息适合新手入门练习。python使用正则表达式提取网页中的图书信息简单场景实战 import requests import re # 目标网页可替换为自己需要爬取的静态网页 url https://www.ryjiaoyu.com/tag/details/7 # 发送请求带UA伪装更佳此处简化演示 response requests.get(url) html response.text # 正则表达式匹配标题和链接根据网页源码调整正则规则 pattern rtitle(.?)(.?) result re.findall(pattern, html) # 打印提取结果格式化输出更易查看 for i, (link, title) in enumerate(result, 1): print(f第{i}本书{title}链接{link}) # 注意若提取结果为空需检查正则表达式是否与网页源码匹配三、进阶篇XPath 解析与数据提取实战核心1. XPath 基础用法复杂网页首选当网页结构复杂、需要精准提取结构化数据时XPath 比正则更高效、更易维护。下面通过本地 HTML 文件快速掌握 XPath 核心定位方法新手可直接复制代码练习。pythonXPath解析本地HTML文件基础示例新手必练 from lxml import etree # 解析本地HTML文件需提前创建test.html文件或替换为在线网页解析 tree etree.parse(test.html) # 1. 获取网页标题最基础定位必学 print(网页标题, tree.xpath(/html/head/title/text())) # 2. 获取body下所有div的p标签文本批量提取 print(所有段落文本, tree.xpath(/html/body/div/p/text())) # 3. 索引定位重点XPath索引从1开始而非0 print(第一个div下的p文本, tree.xpath(/html/body/div[1]/p/text())) print(第二个div下的p文本, tree.xpath(/html/body/div[2]/p/text())) print(第二个div下第二个p文本, tree.xpath(/html/body/div[2]/p[2]/text())) # 4. 属性定位最常用根据class、id筛选元素 print(class为song的div下第二个p文本, tree.xpath(//div[classsong]/p[2]/text())) # 5. 层级定位//表示跨层级无需写完整路径高效 print(跨层级定位class为song的div下第三个p文本, tree.xpath(//div[classsong]/p[3]/text())) # 6. 获取标签属性值爬取链接、图片常用src/href print(图片的src属性, tree.xpath(//div[classsong]/img/src)) print(链接的href属性, tree.xpath(//div[classtang]/ul/li[3]/a/href)[0])2. 实战爬取虎扑热榜XPath 实战演练结合在线网页实战练习 XPath 解析提取虎扑热榜话题代码可直接运行新手可通过此案例熟悉 “请求 - 解析 - 提取” 完整流程。python爬取虎扑热榜话题XPath解析版新手可直接运行 import requests from lxml import etree # 目标URL虎扑热榜移动端结构更简洁适合新手 url https://m.hupu.com/hot # 发送请求建议添加UA伪装避免被拦截 headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36} response requests.get(url, headersheaders) tree etree.HTML(response.text) # 解析在线网页源码 # 定位热榜话题容器根据网页源码调整XPath路径 hot_list tree.xpath(//article[classhot_hot-page__jgBZU]/div) # 遍历提取话题添加异常捕获避免报错终止程序 for i, item in enumerate(hot_list, 1): try: topic item.xpath(./section/div[2]/text())[0].strip() print(f热点第{i}{topic}) except: continue # 补充更简洁的写法直接定位话题文本新手推荐 topics tree.xpath(//div[classhot_hot-page-item-title__HL2kw]/text()) for i, topic in enumerate(topics, 1): print(f热点第{i}{topic.strip()})3. 实战批量爬取壁纸图片综合实战结合fake_useragent随机 UA 伪装提升反爬能力批量爬取壁纸网站图片并保存到本地文件夹整合 “请求 - 解析 - 下载 - 保存” 全流程适合新手巩固基础。python批量爬取壁纸图片含随机UA伪装综合实战案例 import fake_useragent import requests from lxml import etree import os # 全局计数器用于图片命名避免文件名重复 n 0 def count(): global n n 1 return n # 创建保存图片的文件夹不存在则创建避免报错 if not os.path.exists(./Picture): os.mkdir(./Picture) # 随机UA伪装自动生成不同浏览器UA降低被拦截概率 headers { User-Agent: fake_useragent.UserAgent().random } # 爬取多页图片可修改range范围控制爬取页数 for page in range(1, 4): url fhttps://10wallpaper.com/List_wallpapers/page/{page} response requests.get(url, headersheaders) tree etree.HTML(response.text) # 定位所有图片容器若提取不到需检查XPath路径是否正确 p_list tree.xpath(//div[idpics-list]/p) for p in p_list: try: # 提取图片URL并拼接完整地址避免URL不完整导致下载失败 img_url p.xpath(./a/img/src)[0] full_img_url https://10wallpaper.com img_url print(图片地址, full_img_url) # 下载图片添加异常捕获避免单张图片下载失败影响全局 img_response requests.get(full_img_url, headersheaders) img_name count() # 保存图片到本地wb模式适配所有图片格式 with open(f./Picture/{img_name}.jpg, wb) as f: f.write(img_response.content) print(f图片{img_name}.jpg 保存成功) except Exception as e: print(f图片下载失败{e}) continue # 注意若出现404报错说明壁纸网站页面不存在可替换为其他壁纸网站URL4. 实战爬取豆瓣 Top250 电影信息高频实战豆瓣 Top250 是爬虫入门高频实战案例结合 XPath 和正则表达式提取电影名称、导演、主演、年份、评分和简介同时将结果保存到本地文件贴近真实爬虫需求。python爬取豆瓣Top250电影信息高频实战新手必练 import fake_useragent import requests from lxml import etree import re # 目标URL豆瓣Top250首页 url https://movie.douban.com/top250 # 随机UA伪装豆瓣反爬较严格必须添加 headers { User-Agent: fake_useragent.UserAgent().random } # 发送请求添加超时设置避免程序卡死 response requests.get(url, headersheaders, timeout10) html response.text # 打开文件保存结果utf-8编码避免中文乱码 with open(doubanFilm.txt, w, encodingutf8) as f: # 解析HTML tree etree.HTML(html) li_list tree.xpath(//ol[classgrid_view]/li) for li in li_list: try: # 提取电影名称核心信息精准定位 film_name li.xpath(.//div[classhd]/a/span[1]/text())[0] # 提取导演和主演信息正则XPath结合处理复杂文本 info_text li.xpath(.//div[classbd]/p[1]/text())[0].strip() film_director re.match(r导演: (.?) .*, info_text).group(1) film_star re.match(r.*主演: (.), info_text).group(1) film_year re.match(r.*?(\d).*, info_text).group(1) # 提取评分和简介用户关注的核心信息 film_star_rating li.xpath(.//div[classstar]/span[2]/text())[0] film_quote li.xpath(.//div[classbd]/p[classquote]/span/text())[0] # 打印并写入文件用#分隔方便后续处理数据 print(film_name, film_director, film_star, film_year, film_star_rating, film_quote) f.write(f{film_name}#{film_director}#{film_star}#{film_year}#{film_star_rating}#{film_quote}\n) except Exception as e: print(f提取失败{e}) continue print(豆瓣电影信息已保存到doubanFilm.txt可在当前文件夹查看)四、自动化篇Selenium 浏览器操作附详细介绍动态网页必学1. 什么是 Selenium很多新手疑惑有了requests为什么还要学 Selenium答案很简单 ——requests无法处理动态渲染网页而 Selenium 能完美解决这一问题。Selenium 是一款开源的 Web 自动化测试工具诞生于 2004 年最初用于 Web 应用程序的自动化测试后来被广泛应用于爬虫开发。它的核心作用是模拟真实用户的浏览器操作包括打开浏览器、访问网页、点击按钮、填写表单、滚动页面、切换标签页等就像真实用户在操作浏览器一样能够获取到 JavaScript 渲染后的完整网页源码彻底解决动态网页爬取的痛点。2. Selenium 的核心特性与工作原理核心特性新手重点关注跨浏览器支持兼容 Chrome、Firefox、Edge、Safari 等所有主流浏览器适配 Windows、Mac、Linux 等操作系统新手优先用 Chrome/Edge。多语言支持支持 Python、Java、C#、JavaScript 等多种编程语言爬虫开发中最常用 Python 语言绑定上手门槛低。模拟真实交互可模拟点击、输入、下拉、前进 / 后退、切换窗口等所有用户操作还原真实浏览行为避开网站反爬。支持无头模式可在不显示浏览器界面的情况下运行脚本节省系统资源提高运行效率适合服务器部署和批量爬取。核心组件完善包含 Selenium WebDriver核心驱动控制浏览器、Selenium IDE录制回放工具新手快速生成脚本、Selenium Grid分布式并行测试满足不同场景需求。工作原理通俗理解无需深入Selenium 采用 “客户端 - 服务器” 架构运行流程简单易懂新手无需深入底层知道大致逻辑即可开发者编写 Python Selenium 脚本调用 Selenium WebDriver 客户端 API就是我们写的代码。WebDriver 客户端将脚本中的操作指令如打开网页、点击按钮转换为符合 W3C 标准的 HTTP 请求。HTTP 请求发送给对应浏览器的驱动程序如 Chrome 对应 ChromeDriverEdge 对应 EdgeDriver。浏览器驱动接收请求后通过浏览器内置调试接口控制浏览器执行对应操作如打开百度、点击搜索。浏览器执行操作后将结果如网页源码通过驱动、WebDriver 客户端反馈给脚本完成一次交互。Selenium 与 requests 的核心区别新手必看避免用错工具很多新手会混淆两者的用途这里用一张表格清晰区分帮你根据场景选择合适的工具避免做无用功表格对比维度requestsSelenium核心定位发送 HTTP 请求直接与服务器交互控制浏览器模拟用户操作获取渲染后内容动态网页支持不支持无法解析 JavaScript 渲染内容完全支持可获取 JS 渲染后的完整源码运行速度快轻量无冗余资源消耗低慢需启动浏览器资源消耗大交互能力无交互能力仅能发送请求、接收响应强可模拟点击、输入、滚动等所有用户操作适用场景静态网页爬取、API 接口调用、高频数据采集动态网页爬取、需要交互的场景登录、下拉加载、浏览器环境检测的网站前置准备必看否则必报错使用 Selenium 前必须完成两个核心准备工作新手最容易栽在这一步一定要仔细看安装 Selenium 库打开终端执行命令pip install selenium确保 Python 环境已配置若安装失败可加-i https://pypi.tuna.tsinghua.edu.cn/simple用清华源。下载浏览器驱动驱动必须与本地浏览器版本对应如 Edge 浏览器 142 版本需下载 142 版本的 EdgeDriverChrome 同理下载后将驱动路径配置到环境变量或在代码中指定驱动路径。关键提示浏览器驱动版本必须与浏览器版本完全匹配如 Chrome 142.0.7026.64需下载对应 142 版本的 ChromeDriver否则会出现 “驱动不兼容” 报错新手可在浏览器设置中查看版本再去对应官网下载驱动。3. Selenium 实战基础操作新手入门必练1基础打开网页并获取源码入门第一步使用 Selenium 驱动 Edge 浏览器打开指定网页并获取渲染后的源码代码可直接运行新手可先熟悉浏览器启动和关闭流程。python使用Selenium打开Edge浏览器并访问网页入门基础 from selenium import webdriver from selenium.webdriver.edge.options import Options # 配置Edge浏览器选项新手可直接复制修改浏览器路径即可 edge_options Options() # 指定Edge浏览器的安装路径根据自己的电脑路径修改避免报错 edge_options.binary_location rC:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe # 初始化浏览器驱动若驱动已配置环境变量可省略executable_path参数 driver webdriver.Edge(optionsedge_options) # 打开目标网页可替换为任意网页 driver.get(https://www.ptpress.com.cn/) # 暂停脚本方便观察浏览器窗口按回车继续执行避免浏览器瞬间关闭 input(等待用户操作按回车继续...) # 关闭浏览器释放资源避免后台残留进程新手必写 driver.quit()2进阶打开多个标签页实战中经常需要同时访问多个网页使用 JavaScript 的window.open()方法可模拟用户打开多个标签页提升爬取效率。python使用Selenium打开多个标签页实战常用 from selenium import webdriver from selenium.webdriver.edge.options import Options # 配置Edge浏览器新手可直接复用 edge_options Options() edge_options.binary_location rC:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe driver webdriver.Edge(optionsedge_options) # 打开百度首页第一个标签页作为主页面 driver.get(https://www.baidu.com/) # 执行JS代码打开多个新标签页_blank表示新标签页不可修改 driver.execute_script(window.open(https://www.bilibili.com/, _blank);) driver.execute_script(window.open(https://www.shuyishe.com/, _blank);) driver.execute_script(window.open(https://www.shuyishe.com/course, _blank);) # 暂停脚本方便观察标签页效果 input(等待用户操作按回车继续...) # 关闭所有浏览器窗口释放资源 driver.quit()3核心获取渲染后的网页源码这是 Selenium 最核心的优势对于 JS 动态渲染的网页如滚动加载、点击加载更多requests只能获取到初始的 HTML 源码无法获取到 JS 渲染后的内容而 Selenium 可以轻松获取完整源码。python使用Selenium获取渲染后的网页源码核心功能 from selenium import webdriver from selenium.webdriver.edge.options import Options # 配置Edge浏览器 edge_options Options() edge_options.binary_location rC:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe # 可选开启无头模式不显示浏览器界面适合服务器运行、批量爬取 # edge_options.add_argument(--headlessnew) driver webdriver.Edge(optionsedge_options) # 打开需要爬取的动态网页示例百度首页可替换为动态网页URL driver.get(https://www.baidu.com) # 获取渲染后的完整HTML源码包含JS渲染的内容核心代码 html_source driver.page_source print(网页源码长度, len(html_source)) print(前500字符, html_source[:500]) # 关闭浏览器 driver.quit()补充提示开启无头模式添加--headlessnew参数后浏览器不会显示界面脚本在后台运行能节省系统资源适合批量爬取或服务器部署新手可先不开启方便观察运行过程。4补充Selenium 常用操作拓展实战必备除了基础操作Selenium 的表单填写、元素点击、页面滚动等操作是复杂爬虫如登录、下拉加载的核心补充代码可直接复用新手重点练习。pythonSelenium常用操作拓展表单填写、点击、滚动实战必备 from selenium import webdriver from selenium.webdriver.edge.options import Options from selenium.webdriver import options from selenium.webdriver.common.by import By import time # 配置浏览器 edge_options Options() edge_options.binary_location rC:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe driver webdriver.Edge(optionsedge_options) # 1. 打开网页 driver.get(https://www.baidu.com/) # 等待3秒让页面完全加载避免元素未渲染导致定位失败新手必加 time.sleep(3) # 2. 定位元素并填写表单示例百度搜索框实战高频 # 方式1通过ID定位最常用、最高效优先选择 search_input driver.find_element(By.ID, kw) # 填写内容可替换为任意搜索关键词 search_input.send_keys(Python爬虫) # 3. 定位按钮并点击示例百度搜索按钮 search_btn driver.find_element(By.ID, su) search_btn.click() time.sleep(3) # 等待搜索结果加载避免后续操作报错 # 4. 滚动页面示例滚动到页面底部下拉加载常用 # 执行JS代码实现滚动通用模板无需修改 driver.execute_script(window.scrollTo(0, document.body.scrollHeight)) time.sleep(2) # 5. 获取元素文本示例获取搜索结果数量提取数据常用 result_text driver.find_element(By.CLASS_NAME, nums_text).text print(搜索结果, result_text) # 6. 后退、前进操作模拟用户浏览行为避坑常用 driver.back() # 后退到上一页百度首页 time.sleep(2) driver.forward() # 前进到下一页搜索结果页 time.sleep(2) # 关闭浏览器 driver.quit()