Python 爬虫是利用代码自动获取网页数据的技术,广泛用于数据采集、信息监控等场景。本教程基于你已掌握的 Python 基础,从工具准备到实战案例,带你一步步学会简单爬虫开发,避开常见坑点。

一、爬虫基础认知:先搞懂 “为什么能爬”

  1. 爬虫原理

    网页本质是 HTML 代码构成的文本文件,浏览器能将代码渲染成可视化页面,而爬虫就是模拟浏览器,向目标网站发送请求、接收 HTML 响应,再从响应中提取需要的数据(如文字、图片链接)。

    注意:爬取前需遵守网站robots协议(访问网站域名 +/robots.txt查看,如https://www.baidu.com/robots.txt),禁止爬取标注 “禁止” 的内容,避免法律风险。

  2. 必备工具与库

    基于 Python 基础,需安装 3 个核心库,安装方式用入门教程学过的pip命令(Windows 打开 cmd、mac 打开终端):

  • requests:发送网页请求,获取 HTML 数据,安装命令:pip install requests

  • BeautifulSoup4:解析 HTML 代码,提取目标数据,安装命令:pip install beautifulsoup4

  • lxml:配合 BeautifulSoup4 提升解析速度,安装命令:pip install lxml

二、爬虫第一步:用 requests 获取网页数据

以爬取 “豆瓣读书 TOP250”(简单无反爬)的书籍名称为例,先学会获取网页 HTML:

  1. 发送请求

    requests.get()函数向目标网页发送请求,代码如下(结合入门教程的变量、函数知识):

import requests  # 导入库

\# 目标网页URL(豆瓣读书TOP250第一页)

url = "https://book.douban.com/top250?start=0"

\# 模拟浏览器请求(添加User-Agent,避免被网站识别为爬虫)

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"

}

\# 发送GET请求,获取响应

response = requests.get(url, headers=headers)

\# 查看响应状态码(200表示请求成功,403/404等表示失败)

print("请求状态码:", response.status\_code)

\# 查看获取的HTML内容(前500字符)

print("HTML内容片段:", response.text\[:500])
  • 关键知识点:headers中的User-Agent是浏览器标识,不添加可能被网站拒绝请求;response.text是获取的 HTML 文本。
  1. 处理请求异常

    为避免网络错误导致程序崩溃,用try-except捕获异常(入门教程的流程控制知识):

try:

    response = requests.get(url, headers=headers, timeout=10)  # 超时10秒

    response.raise\_for\_status()  # 若状态码非200,抛出异常

except requests.exceptions.RequestException as e:

    print("请求失败:", e)

三、解析数据:用 BeautifulSoup4 提取内容

获取 HTML 后,需从杂乱代码中提取目标数据(如书籍名称),步骤如下:

  1. 解析 HTML 结构

    先在浏览器中查看目标数据的 HTML 位置:打开 “豆瓣读书 TOP250”,右键 “检查”,用 “元素选择器” 点击书籍名称,可看到书籍名称在<div class="pl2">下的<a>标签中,代码如下:

from bs4 import BeautifulSoup  # 导入解析库

\# 用lxml解析器解析HTML

soup = BeautifulSoup(response.text, "lxml")

\# 找到所有包含书籍信息的\<div class="pl2">标签(返回列表)

book\_items = soup.find\_all("div", class\_="pl2")  # class\_加下划线避免与Python关键字冲突

\# 遍历列表,提取每本书的名称

for item in book\_items:

&#x20;   \# 找到\<a>标签,获取标签内的文字(strip()去除空格换行)

&#x20;   book\_name = item.find("a")\["title"].strip()  # \["title"]获取a标签的title属性值

&#x20;   print("书籍名称:", book\_name)
  • 运行结果:会打印出豆瓣 TOP250 第一页的 25 本图书名称,如 “活着”“百年孤独” 等。
  1. 常用解析方法

    | 方法 | 作用 | 示例 |

    |---------------------|-------------------------------|-------------------------------|

    | find("标签", 属性) | 找到第一个匹配的标签 | soup.find("div", class_="pl2") |

    | find_all("标签") | 找到所有匹配的标签(返回列表)| soup.find_all("a") |

    | 标签["属性名"] | 获取标签的属性值 | a_tag["href"](获取链接) |

    | 标签.get_text() | 获取标签内的所有文字 | div_tag.get_text() |

四、实战案例:爬取多页豆瓣读书数据

结合循环知识,爬取豆瓣读书 TOP250 前 3 页(每页 25 本,共 75 本),并将结果保存到文本文件:

import requests

from bs4 import BeautifulSoup

def get\_douban\_books(page\_start):

&#x20;   """获取某一页的豆瓣书籍名称,page\_start:起始位置(0、25、50...)"""

&#x20;   url = f"https://book.douban.com/top250?start={page\_start}"

&#x20;   headers = {

&#x20;       "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"

&#x20;   }

&#x20;   try:

&#x20;       response = requests.get(url, headers=headers, timeout=10)

&#x20;       response.raise\_for\_status()

&#x20;       soup = BeautifulSoup(response.text, "lxml")

&#x20;       book\_items = soup.find\_all("div", class\_="pl2")

&#x20;       books = \[item.find("a")\["title"].strip() for item in book\_items]  # 列表推导式

&#x20;       return books

&#x20;   except requests.exceptions.RequestException as e:

&#x20;       print(f"第{page\_start//25+1}页请求失败:", e)

&#x20;       return \[]

\# 爬取前3页(page\_start为0、25、50)

all\_books = \[]

for start in \[0, 25, 50]:

&#x20;   print(f"正在爬取第{start//25+1}页...")

&#x20;   page\_books = get\_douban\_books(start)

&#x20;   all\_books.extend(page\_books)  # 合并列表

\# 保存到文本文件(入门教程的文件操作延伸)

with open("豆瓣读书TOP75.txt", "w", encoding="utf-8") as f:

&#x20;   for i, book in enumerate(all\_books, 1):  # enumerate添加序号

&#x20;       f.write(f"{i}. {book}\n")

print("爬取完成!共获取", len(all\_books), "本图书,已保存到文件。")
  • 关键知识点:用enumerate给书籍加序号,with open(...)安全打开文件,避免忘记关闭;encoding="utf-8"防止中文乱码。

五、常见问题与注意事项

  1. 中文乱码:保存文件或打印时,在open()中加encoding="utf-8",或在print()前加response.encoding = "utf-8"

  2. 反爬机制:除了加User-Agent,还可设置请求间隔(用time.sleep(1)在循环中暂停 1 秒,需导入time库),避免频繁请求被封 IP。

  3. 复杂网页:若数据在 JavaScript 渲染的页面(如动态加载内容),需用selenium库模拟浏览器渲染,安装命令:pip install selenium,并下载对应浏览器的驱动(如 Chrome 驱动)。

通过本教程,你已掌握简单 Python 爬虫的核心流程。后续可学习爬取图片、数据存储到 Excel(用pandas库)、处理登录验证等进阶内容,记得始终遵守网站规则,合法爬取数据。

(注:文档部分内容可能由 AI 生成)

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐