杰瑞科技汇

Python爬虫入门教程,零基础怎么学?

Python 爬虫入门教程:从零开始,轻松上手

目录

  1. 什么是爬虫?
  2. 爬虫的基本原理
  3. 准备工作:安装 Python 和必要的库
  4. 实战篇一:爬取静态网页(最简单的例子)
    • requests 库:获取网页内容
    • BeautifulSoup4 库:解析网页内容
    • 完整代码与解析
  5. 实战篇二:爬取动态网页(JavaScript 渲染的页面)
    • Selenium 库:模拟浏览器操作
    • 完整代码与解析
  6. 爬虫进阶:应对反爬机制
    • 设置请求头
    • 使用代理 IP
    • 处理验证码
    • 控制爬取速度
  7. 数据存储:如何保存你爬取的数据
    • 保存为 TXT 文本
    • 保存为 CSV 文件(推荐)
    • 保存到数据库(SQLite 简介)
  8. 爬虫的“道”与“术”:法律与道德
  9. 总结与下一步学习方向

什么是爬虫?

网络爬虫,也叫网络蜘蛛,是一种按照一定规则,自动地抓取万维网信息的程序或脚本。爬虫就是一只在互联网上自动抓取数据的“机器人”

Python爬虫入门教程,零基础怎么学?-图1
(图片来源网络,侵删)

它可以做什么?

  • 搜索引擎:Google、百度等搜索引擎的核心就是巨大的爬虫系统,它们抓取全网网页,建立索引。
  • 价格监控:电商网站可以用爬虫监控竞争对手的商品价格变化。
  • 舆情分析:抓取社交媒体、新闻网站上的信息,分析公众对某个事件或产品的看法。
  • 数据收集:学术研究、市场分析等需要大量数据时,爬虫是最高效的工具。

爬虫的基本原理

爬虫的工作流程可以简化为以下几个步骤:

  1. 发起请求:爬虫向目标网站的服务器发送一个 HTTP 请求。
  2. 获取响应:服务器收到请求后,会返回一个 HTTP 响应,其中包含了网页的源代码(HTML)。
  3. :爬虫解析 HTML 源代码,从中提取出自己感兴趣的数据(比如标题、正文、链接等)。
  4. 存储数据:将提取出的数据保存到本地文件(如 TXT, CSV)或数据库中。
  5. 循环发现:从当前页面中提取出新的链接,然后对这些新链接重复以上步骤,实现遍历整个网站(或部分网站)的功能。

准备工作:安装 Python 和必要的库

安装 Python

如果你还没有安装 Python,请先访问 Python 官网 下载并安装。安装时请务必勾选 "Add Python to PATH" 选项,这样你就可以在命令行中直接使用 python 命令。

打开命令行工具(Windows 是 cmdPowerShell,macOS/Linux 是 Terminal),输入以下命令检查是否安装成功:

Python爬虫入门教程,零基础怎么学?-图2
(图片来源网络,侵删)
python --version

python3 --version

安装必要的库

我们将使用三个核心库:

  • requests:用于发送 HTTP 请求,获取网页内容,它是 Python 最流行的 HTTP 库。
  • beautifulsoup4:用于解析 HTML 和 XML 文档,方便地提取数据。
  • lxml:一个更快的 HTML/XML 解析器,BeautifulSoup 可以用它作为解析器。

在命令行中,使用 pip(Python 的包管理器)来安装它们:

pip install requests
pip install beautifulsoup4
pip install lxml

注意:如果上述命令报错,可以尝试使用 pip3 命令。

Python爬虫入门教程,零基础怎么学?-图3
(图片来源网络,侵删)

实战篇一:爬取静态网页

我们的第一个目标是爬取 豆瓣电影 Top250 的电影名称、评分和一句话简介,这是一个非常经典的静态网页案例。

requests 库:获取网页内容

requests 库非常简单,用一行代码就能获取网页源码。

import requests
# 目标网址
url = 'https://movie.douban.com/top250'
# 发送 GET 请求
response = requests.get(url)
# 检查请求是否成功 (状态码 200 表示成功)
if response.status_code == 200:
    # 打印网页源码的前 500 个字符
    print(response.text[:500])
else:
    print(f"请求失败,状态码: {response.status_code}")

运行这段代码,你会得到一堆 HTML 代码,我们的任务就是从这堆代码中“捞出”我们需要的信息。

BeautifulSoup4 库:解析网页内容

直接看 HTML 代码很痛苦,BeautifulSoup 能让我们用更直观的方式来定位元素。

我们用浏览器打开豆瓣 Top250 页面,右键点击一部电影的标题,选择“检查”,你会看到类似这样的 HTML 结构:

<span class="title">肖申克的救赎</span>
<span class="rating_num">9.7</span>
<span class="inq">希望让人自由</span>

我们发现:

  • 电影名称都在 <span class="title"> 标签里。
  • 评分都在 <span class="rating_num"> 标签里。
  • 一句话简介都在 <span class="inq"> 标签里。

我们用 BeautifulSoup 来提取它们。

完整代码与解析

import requests
from bs4 import BeautifulSoup
# 1. 发送请求,获取网页内容
url = 'https://movie.douban.com/top250'
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'
}
response = requests.get(url, headers=headers)
# 2. 使用 BeautifulSoup 解析 HTML
soup = BeautifulSoup(response.text, 'lxml')
# 3. 定位并提取数据
# find_all('ol') 找到所有 class 为 'ol' 的 <ol> 标签,这里就是电影列表
movie_list = soup.find_all('ol', class_='grid_view')
for movie_item in movie_list:
    # find_all('li') 找到列表中的每一个电影条目
    movies = movie_item.find_all('li')
    for movie in movies:
        # 提取电影名称 (可能有中文和外文名,这里取第一个)
        title = movie.find('span', class_='title').text
        # 提取评分
        rating_num = movie.find('span', class_='rating_num').text
        # 提取一句话简介 (注意,可能没有)
        quote = movie.find('span', class_='inq')
        if quote:
            quote = quote.text
        else:
            quote = "暂无简介"
        print(f"电影: {title}, 评分: {rating_num}, 简介: {quote}")

代码解析

  1. headers:这是一个请求头,User-Agent 字段用来模拟浏览器访问,有些网站会拒绝没有 User-Agent 的请求,所以加上它是个好习惯。
  2. BeautifulSoup(response.text, 'lxml'):将 requests 获取到的文本内容交给 BeautifulSoup,并指定使用 lxml 解析器来生成一个对象 soup
  3. soup.find_all('ol', class_='grid_view')find_all 是查找所有符合条件的元素,这里我们查找所有 class 属性为 grid_view<ol> 标签,它返回一个列表。
  4. movie.find('span', class_='title')find 是查找第一个符合条件的元素,这里我们在一个电影条目内查找 classtitle<span>
  5. .text:获取标签内部的文本内容。

实战篇二:爬取动态网页

很多现代网站(如淘宝、微博)的内容是通过 JavaScript 动态加载的,直接用 requests 获取到的 HTML 可能是空的,或者只包含一个框架,这时我们需要一个能“运行” JavaScript 的工具——Selenium

Selenium 库:模拟浏览器操作

Selenium 可以模拟用户在浏览器中的各种操作,如点击、输入、滚动等,并获取最终渲染完成的页面内容。

准备工作

  1. 安装 Selenium:

    pip install selenium
  2. 下载浏览器驱动: Selenium 需要一个“驱动程序”来控制你的浏览器,你需要下载与你浏览器版本匹配的驱动。

完整代码与解析(以爬取今日头条热榜为例)

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from bs4 import BeautifulSoup
# 1. 设置 ChromeDriver 路径 (如果不在环境变量中)
# s = Service(executable_path='C:/path/to/your/chromedriver.exe')
# driver = webdriver.Chrome(service=s)
# 如果驱动在脚本同目录下,可以这样写
driver = webdriver.Chrome()
# 2. 打开目标网页
url = 'https://www.toutiao.com/hotboard/'
driver.get(url)
# 3. 等待页面加载完成
# 动态页面需要时间加载,我们等待几秒,或者使用更智能的等待方式
# 这里简单使用 time.sleep()
time.sleep(3)  # 等待 3 秒
# 4. 获取渲染后的页面源码
page_source = driver.page_source
# 5. 使用 BeautifulSoup 解析
soup = BeautifulSoup(page_source, 'lxml')
# 6. 提取数据
hot_items = soup.find_all('div', class_='HotItem-content')
for item in hot_items:= item.find('a').text.strip()
    print(title)
# 7. 关闭浏览器
driver.quit()

代码解析

  1. webdriver.Chrome():启动一个 Chrome 浏览器实例。
  2. driver.get(url):让浏览器打开指定的网址。
  3. time.sleep(3)非常重要! 给浏览器足够的时间去加载和执行 JavaScript,在实际项目中,推荐使用 WebDriverWait 进行“显式等待”,但这对于入门来说,time.sleep 更简单直观。
  4. driver.page_source:获取浏览器当前页面的完整 HTML 源码(是 JS 渲染后的)。
  5. 后续步骤:获取到源码后,就和静态网页的解析方法完全一样了。
  6. driver.quit():关闭浏览器,释放资源。一定要记得关闭!

爬虫进阶:应对反爬机制

网站并不喜欢被爬虫“光顾”,所以会有各种反爬措施,一个成熟的爬虫需要学会应对它们。

设置请求头

除了 User-Agent,还可以设置 Referer(表示请求从哪里来)、Cookie(维持登录状态)等,让请求看起来更“正常”。

headers = {
    'User-Agent': '...',
    'Referer': 'https://movie.douban.com/',
    'Cookie': 'some_cookie_value' # 如果需要登录
}
response = requests.get(url, headers=headers)

使用代理 IP

当你的 IP 访问过于频繁时,可能会被网站封禁,使用代理 IP 可以更换你的出口 IP,继续访问。

proxies = {
    'http': 'http://your_proxy_ip:port',
    'https': 'https://your_proxy_ip:port',
}
response = requests.get(url, proxies=proxies)

处理验证码

对于复杂的验证码(如滑动、点选),可能需要使用第三方打码平台,对于简单的图片验证码,可以使用 Tesseract-OCR 等工具进行识别,但准确率不高。

控制爬取速度

在两次请求之间加入随机延时,避免请求过于密集。

import random
import time
time.sleep(random.uniform(1, 3)) # 随机等待 1 到 3 秒

数据存储

保存为 TXT 文本

最简单的方式,适合少量数据。

with open('movies.txt', 'w', encoding='utf-8') as f:
    f.write(f"电影: {title}, 评分: {rating_num}\n")

保存为 CSV 文件(推荐)

CSV(逗号分隔值)是存储表格数据的理想格式,可以用 Excel 直接打开。

import csv
# 第一次写入时,需要写入表头
with open('movies.csv', 'w', newline='', encoding='utf-8-sig') as f:
    writer = csv.writer(f)
    writer.writerow(['电影名称', '评分', '简介']) # 写入表头
# 追加数据
with open('movies.csv', 'a', newline='', encoding='utf-8-sig') as f:
    writer = csv.writer(f)
    writer.writerow([title, rating_num, quote])

注意utf-8-sig 编码可以避免用 Excel 打开 CSV 文件时中文乱码的问题。

保存到数据库(SQLite 简介)

对于海量数据,数据库是最佳选择,Python 自带了轻量级的 SQLite 数据库,无需额外安装。

import sqlite3
# 连接到数据库 (如果不存在则创建)
conn = sqlite3.connect('movies.db')
cursor = conn.cursor()
# 创建表
cursor.execute('''
    CREATE TABLE IF NOT EXISTS douban_top250 (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        title TEXT NOT NULL,
        rating REAL,
        quote TEXT
    )
''')
# 插入数据
cursor.execute("INSERT INTO douban_top250 (title, rating, quote) VALUES (?, ?, ?)", (title, rating_num, quote))
# 提交事务
conn.commit()
# 关闭连接
conn.close()

爬虫的“道”与“术”:法律与道德

技术是中立的,但使用技术的人需要承担责任。

  • 查看 robots.txt:大多数网站根目录下都有一个 robots.txt 文件(如 https://www.douban.com/robots.txt),它规定了哪些页面可以爬,哪些不可以,在爬取前最好先查看。
  • 尊重网站意愿:如果网站明确禁止爬取,就不要强行突破。
  • 控制访问频率:不要对服务器造成过大压力,robots.txt 中通常也提到了 Crawl-delay(爬取延时)的建议。
  • 不要用于商业用途或非法活动:爬取的数据仅用于个人学习或研究,切勿滥用。

总结与下一步学习方向

恭喜你!你已经掌握了 Python 爬虫的核心技能。

下一步可以学习什么?

  1. Scrapy 框架:当爬虫项目变得复杂时,使用 Scrapy 框架可以让你更高效地构建、管理和运行爬虫,它集成了数据提取、请求调度、数据存储等众多功能。
  2. 异步爬虫:使用 aiohttpasyncio 可以实现异步请求,大幅提升爬取效率,尤其是在爬取大量独立页面时。
  3. 数据清洗与分析:学习 Pandas 库,可以对爬取到的数据进行清洗、转换、分析和可视化。
  4. 分布式爬虫:对于超大规模的数据抓取,可以学习使用 Scrapy-Redis 等工具,将爬虫任务分发到多台机器上并行执行。
  5. 更高级的反反爬技术:如使用 Selenium 模拟登录、处理更复杂的验证码、使用 Headless Chrome(无头浏览器)等。

爬虫的世界非常广阔,希望这份入门教程能为你打开一扇门。多动手实践,多思考,你将成为一名出色的爬虫工程师!

分享:
扫描分享到社交APP
上一篇
下一篇