Python 自动化 3:requests 爬虫入门(获取网页内容,提取 “新闻标题 + 链接”)
一、场景与目标
日常工作中,若需批量收集新闻资讯(如行业动态、xx信息),手动复制粘贴效率极低。本教程用requests(获取网页内容)+BeautifulSoup(解析网页数据)实现核心功能:
获取网页源码:通过 HTTP 请求获取目标新闻网站的页面内容提取关键信息:精准定位并提取 “新闻标题” 与对应 “跳转链接”数据持久化:将提取的信息保存到 TXT/CSV 文件,方便后续查看
最终实现 “10 分钟手动收集,10 秒自动化爬取” 的效率提升,且全程代码简洁易懂,适合爬虫新手入门。
二、环境准备
需安装两个核心库:requests(发送 HTTP 请求)和bs4(解析 HTML,含 BeautifulSoup):
|
pip install requests bs4 # 两个库总大小不足10MB,安装速度极快 |
三、核心功能实现(以 “某新闻网站科技板块” 为例)
3.1 第一步:用 requests 获取网页内容
3.1.1 基础请求:获取页面源码
|
import requests def get_html(url, headers=None): “”” 发送GET请求获取网页HTML源码 :param url: 目标网页URL(如新闻板块链接) :param headers: 请求头(模拟浏览器,避免被反爬) :return: 网页HTML源码(字符串格式) “”” # 1. 设置默认请求头(模拟Chrome浏览器,关键!否则可能被拒) if headers is None: headers = { “User-Agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36” }
try: # 2. 发送GET请求(超时设置10秒,避免无限等待) response = requests.get(url, headers=headers, timeout=10) # 3. 检查请求是否成功(状态码200表示成功) response.raise_for_status() # 若状态码非200,抛出异常 # 4. 设置正确编码(避免中文乱码,常见编码:utf-8、gbk) response.encoding = response.apparent_encoding # 自动识别编码 return response.text # 返回HTML源码 except Exception as e: print(f”获取网页失败:{str(e)}”) return None # 调用函数:获取某新闻网站科技板块页面 news_url = “https://example-news.com/tech” # 替换为真实新闻板块URL html_content = get_html(news_url) if html_content: print(“网页获取成功!前500字符如下:”) print(html_content[:500]) # 打印前500字符验证 |
3.1.2 关键说明:为什么需要请求头?
部分网站会拒绝 “非浏览器” 的请求(识别到爬虫后返回 403 错误)User-Agent是请求头核心字段,用于告诉服务器 “我是浏览器”如何获取自己的User-Agent?打开 Chrome→按 F12→Network→刷新页面→选任意请求→Headers→找到 User-Agent,直接复制即可
3.2 第二步:用 BeautifulSoup 提取 “标题 + 链接”
3.2.1 解析网页:定位新闻元素(关键步骤)
首先需要分析目标网页的 HTML 结构(以 “新闻标题在<a>标签,且父级有特定 class” 为例):
打开目标新闻页→按 F12 打开 “开发者工具”点击左上角 “选择元素” 按钮(图标:□),鼠标点击任意新闻标题右侧 Elements 面板会定位到对应 HTML 代码,观察规律(如:<h3 class=”news-title”><a href=”xxx”>新闻标题</a></h3>)
3.2.2 代码实现:提取并存储数据
|
from bs4 import BeautifulSoup import csv def extract_news(html, save_path=”news_result.csv”): “”” 解析HTML源码,提取新闻标题+链接,并保存到CSV :param html: 网页HTML源码 :param save_path: 结果保存路径(默认CSV格式) :return: 提取的新闻列表(含title和url) “”” # 1. 初始化BeautifulSoup解析器(指定lxml解析器,速度快) soup = BeautifulSoup(html, “lxml”)
# 2. 定位新闻元素(根据实际网页结构调整!以下为示例) # 假设新闻标题在 <h3 class=”news-title”> 下的 <a> 标签中 news_items = soup.find_all(“h3″, class_=”news-title”) # find_all:获取所有匹配元素 news_list = []
# 3. 遍历提取标题和链接 for item in news_items: a_tag = item.find(“a”) # 找到当前h3下的a标签 if a_tag: news_title = a_tag.get_text(strip=True) # 获取标题文本(strip=True:去除空格/换行) news_url = a_tag[“href”] # 获取链接(a标签的href属性) # 处理相对链接(如”/news/123″需补全为”https://example-news.com/news/123″) if not news_url.startswith(“http”): news_url = “https://example-news.com” + news_url # 替换为目标网站域名 news_list.append({“标题”: news_title, “链接”: news_url}) print(f”提取到:{news_title} → {news_url}”)
# 4. 保存到CSV文件(方便Excel打开) with open(save_path, “w”, encoding=”utf-8″, newline=””) as f: fieldnames = [“标题”, “链接”] writer = csv.DictWriter(f, fieldnames=fieldnames) writer.writeheader() # 写入表头 writer.writerows(news_list) # 批量写入数据
print(f” return news_list # 调用函数:解析并保存新闻 if html_content: extract_news(html_content) |
3.3 第三步:完整流程整合(一键爬取)
将 “获取网页” 和 “提取数据” 整合为完整脚本,实现一键运行:
|
# 完整爬虫脚本:获取新闻→提取信息→保存结果 def crawl_news(url): # 1. 获取网页 html = get_html(url) if not html: return # 2. 提取并保存新闻 extract_news(html) # 执行爬虫(替换为真实目标URL) target_url = “https://example-news.com/tech” # 如某网站科技板块 crawl_news(target_url) |
四、实用技巧(避坑 + 进阶)
4.1 常见问题解决
中文乱码:
原因:网页编码识别错误(如实际是 gbk,却用 utf-8 解码)解决:手动指定编码,如response.encoding = “gbk”(需根据网页实际编码调整,可通过开发者工具查看:Response Headers→Content-Type)
提取不到数据:
原因 1:HTML 结构匹配错误(class 名称写错、标签层级不对)解决:重新检查开发者工具中的元素结构,确保find_all的参数正确(class_带下划线,避免与 Python 关键字冲突)原因 2:网页是动态加载(如 JavaScript 渲染,requests 只能获取静态 HTML)解决:新手可先选择 “静态加载” 的网站(如部分传统新闻网),后续再学selenium处理动态页面
被网站封禁 IP:
原因:请求频率过高,被反爬机制识别解决:添加请求间隔(time.sleep(1),每次请求后等待 1 秒)、使用代理 IP(进阶内容)
4.2 进阶优化:添加请求间隔
|
import time def get_html(url, headers=None): # … 原有代码 … try: time.sleep(1) # 关键:每次请求前等待1秒,降低频率 response = requests.get(url, headers=headers, timeout=10) # … 原有代码 … |
4.3 合规提醒(重要!)
爬虫需遵守《网络安全法》和网站robots.txt协议(访问https://目标网站/robots.txt查看规则)禁止爬取敏感数据(如个人信息、付费内容),禁止高频请求影响网站正常运行建议在爬取前查看网站 “用户协议”,确保合规性
五、运行与验证
替换目标 URL:将代码中的https://example-news.com/tech替换为真实的新闻板块 URL(如某静态新闻网站的科技栏)调整解析规则:根据目标网页的 HTML 结构,修改extract_news函数中find_all的参数(如标签名、class 名称)运行脚本:
控制台会打印提取的新闻标题和链接生成news_result.csv文件,用 Excel 打开可查看结构化数据
验证结果:点击 CSV 中的链接,确认能正常跳转至对应新闻页面,标题与页面内容一致
六、后续学习方向
处理动态网页:学习selenium或playwright,爬取 JavaScript 渲染的内容(如知乎、微博)多页爬取:分析分页 URL 规律(如?page=1→?page=2),实现批量爬取多页新闻数据可视化:用matplotlib统计新闻关键词频次,生成词云图














暂无评论内容