【Python爬虫实战】零基础入门:手把手教你爬取网页数据


一、爬虫简介与道德法律红线

网络爬虫是什么?简单来说,它就是一段自动访问互联网并抓取所需信息的程序,就像一个不知疲倦的、高效的“数据采集员”。

在开始之前,我们必须先划清道德与法律的界线,这是每个爬虫学习者的第一课:

  1. 遵守 robots.txt:在爬取任何网站前,请先访问 网站域名/robots.txt(例如:https://example.com/robots.txt)。这个文件规定了哪些内容允许或被禁止爬取。

  2. 避免暴力爬取:设置合理的请求间隔时间,不要对目标网站服务器造成过大压力。

  3. 尊重版权与隐私:爬取的数据仅用于个人学习与研究,不得用于商业用途或侵犯他人隐私。

  4. 切勿爬取敏感信息

本文仅以公开的、用于学习的技术演示为目的。

二、环境搭建与工具准备

工欲善其事,必先利其器。我们需要安装两个核心库:

  • Requests:一个优雅而简单的HTTP库,用于发送网络请求,获取网页源代码。

  • BeautifulSoup:一个HTML/XML解析库,用于从Requests获取的杂乱HTML中提取整洁的数据。

安装命令:
打开你的命令行(CMD或Terminal),输入以下命令:

bash

pip install requests beautifulsoup4

注意:本文使用的是 beautifulsoup4(简称bs4)。如果你的环境是Python 3,请确保使用 pip3 或配置了正确的Python环境路径。

三、实战开始:爬取优快云资讯首页文章标题

我们将以优快云资讯首页(https://blog.youkuaiyun.com/nav/news)为例进行演示。

步骤1:获取网页源代码

首先,我们使用Requests库来获取整个页面的HTML内容。

python
import requests

# 目标URL
url = 'https://blog.youkuaiyun.com/nav/news'

# 设置请求头,模拟浏览器访问,这是一个简单的反反爬虫策略
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}

# 发送GET请求
response = requests.get(url, headers=headers)

# 检查请求是否成功 (状态码200表示成功)
if response.status_code == 200:
    # 打印网页源代码(前500个字符用于预览)
    print(response.text[:500])
else:
    print(f'请求失败,状态码:{response.status_code}')
  • 代码解释

    • headers:有些网站会拒绝没有浏览器标识(User-Agent)的请求。我们通过添加这个信息,让请求看起来像是从浏览器发出的。

    • response.status_code:HTTP响应状态码,200代表成功。

    • response.text:包含了服务器返回的网页HTML源代码。

运行这段代码,你会看到一堆结构化的HTML文本,这就是我们数据的“矿藏”。

步骤2:解析HTML并提取数据

现在轮到BeautifulSoup大显身手了!我们需要先分析网页结构,找到文章标题所在的HTML标签。

  1. 使用浏览器“检查”元素

    • 在优快云资讯页面,右键点击一篇文章的标题,选择“检查”或“审查元素”。

    • 你会发现,标题很可能在一个 <a> 标签里,并且这个标签有特定的类(class),比如 class="text" 或 class="title"。通过观察,我们确定目标结构。

  2. 编写解析代码

    python
    from bs4 import BeautifulSoup
    
    # 假设我们已经有了 response.text
    html_content = response.text
    
    # 使用BeautifulSoup解析HTML,指定解析器为'html.parser'
    soup = BeautifulSoup(html_content, 'html.parser')
    
    # 查找所有包含文章标题的标签。
    # 注意:你需要根据实际检查结果来修改选择器!
    # 这里是一个示例,实际选择器可能需要调整。
    # 例如,可能是 soup.find_all('a', class_='text') 或 soup.find_all('h2')
    title_list = soup.find_all('a', class_='text') # 请根据实际情况修改class_
    
    # 创建一个空列表来存储提取出来的纯文本标题
    articles = []
    
    # 遍历找到的所有标题标签
    for title_tag in title_list:
        # .get_text() 方法可以获取标签内的纯文本,.strip() 用于去除首尾空白字符
        article_title = title_tag.get_text().strip()
        articles.append(article_title)
        # 打印看看效果
        print(article_title)
    
    # 打印总共爬取了多少篇文章
    print(f"\n总共爬取了 {len(articles)} 篇文章")

  3. 核心方法

    • BeautifulSoup(html, 'html.parser'):创建解析对象。

    • soup.find_all(‘tag', class_=‘class_name’):查找所有指定的标签。这是最常用的方法。

    • .get_text():提取标签内的文本。

  4. 重要提示:网站的HTML结构可能会更新,class_='text' 这个选择器在未来可能失效。你必须使用浏览器的“检查”功能,找到当前页面标题正确的CSS选择器,并替换上面的代码。这是爬虫工程中的常态。

    步骤3:将数据存储到CSV文件

    将数据保存在文件中,便于后续分析。CSV(逗号分隔值)是一种通用且简单的格

  5. python
    import csv
    
    # 定义要保存的文件名
    filename = 'csdn_articles.csv'
    
    # 以写入模式打开文件,`newline=''` 是为了防止在Windows下出现空行
    with open(filename, 'w', newline='', encoding='utf-8-sig') as csvfile:
        # 创建一个csv写入器
        writer = csv.writer(csvfile)
        # 写入表头
        writer.writerow(['文章标题'])
        # 遍历文章列表,将每个标题作为一行写入
        for article in articles:
            writer.writerow([article])
    
    print(f'数据已成功保存到 {filename}')

四、常见反爬虫策略及应对建议
  1. User-Agent检测:解决方案就是我们上面使用的,添加合法的请求头。

  2. 访问频率过高:解决方案是在请求之间增加随机延时。

python
import time
import random
# 在循环请求中插入
time.sleep(random.uniform(1, 3)) # 休眠1到3秒之间的随机时间
  1. IP被封禁:对于大规模爬取,可能需要使用代理IP池。

  2. 动态加载内容:有些数据是通过JavaScript异步加载的,在HTML源码中看不到。这时需要使用 Selenium 或 Playwright 等工具来模拟浏览器行为。

对于入门者来说,做好前两点已经能应对很多场景。

五、总结与完整代码

我们来回顾一下本篇文章的完整流程和代码:

python
import requests
from bs4 import BeautifulSoup
import csv

# 1. 发送请求
url = 'https://blog.youkuaiyun.com/nav/news'
headers = {'User-Agent': '你的User-Agent'} # 请复制使用上面的User-Agent
response = requests.get(url, headers=headers)

if response.status_code == 200:
    # 2. 解析内容
    soup = BeautifulSoup(response.text, 'html.parser')
    # !!! 关键:请根据实际网页结构修改下面的选择器 !!!
    title_list = soup.find_all('a', class_='text') 

    articles = []
    for title_tag in title_list:
        article_title = title_tag.get_text().strip()
        articles.append(article_title)

    # 3. 存储数据
    filename = 'csdn_articles.csv'
    with open(filename, 'w', newline='', encoding='utf-8-sig') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(['文章标题'])
        for article in articles:
            writer.writerow([article])

    print(f'成功爬取 {len(articles)} 篇文章并保存到 {filename}!')
else:
    print('请求失败')

你已经成功搭建了一个基础但功能完整的爬虫!从这个起点出发,你可以去学习更强大的解析方法(如CSS选择器)、处理分页、模拟登录等高级主题。


互动与讨论

欢迎在评论区分享你的爬取成果和遇到的问题!

  • 你成功运行这个爬虫了吗?爬取到了什么内容?

  • 在寻找正确的CSS选择器时遇到了什么困难?

  • 你还想了解爬虫的哪些进阶知识(例如:爬取图片、处理登录、应对更复杂的反爬机制)?

免责声明:本文所有代码及技术仅用于学习交流,请勿用于任何非法或侵犯他人权益的用途。爬取数据时请务必遵守目标网站的相关规定,尊重版权与隐私。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值