Python 自动化 3:requests 爬虫入门

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”
共提取{len(news_list)}条新闻,已保存到:{save_path}”)

    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统计新闻关键词频次,生成词云图

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
小叶今天好好学习了嘛的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容