Python 网络爬虫技术基础与实战指南
一、引言
网络爬虫(Web Crawler),又称网页蜘蛛或网络机器人,是一种按照既定规则自动抓取万维网信息的程序或脚本。它在数据采集、搜索引擎索引、舆情监控等领域发挥着核心作用。本文将深入讲解 HTTP 协议基础、Python 爬虫常用库的使用,并通过豆瓣电影数据爬取案例,演示从请求到存储的完整流程。
Python 网络爬虫的基础知识,涵盖 HTTP 协议原理、请求响应结构及常见状态码。重点讲解了 requests、BeautifulSoup、lxml 等核心库的使用方法,并通过豆瓣 Top250 电影数据爬取的实战案例,演示了如何分析网页结构、处理翻页逻辑、应对反爬机制以及将数据存入 MySQL 数据库。内容包含完整的代码示例,涉及异常处理、日志记录及合规性建议,旨在帮助开发者建立规范的爬虫开发流程。

网络爬虫(Web Crawler),又称网页蜘蛛或网络机器人,是一种按照既定规则自动抓取万维网信息的程序或脚本。它在数据采集、搜索引擎索引、舆情监控等领域发挥着核心作用。本文将深入讲解 HTTP 协议基础、Python 爬虫常用库的使用,并通过豆瓣电影数据爬取案例,演示从请求到存储的完整流程。
HTTP(HyperText Transfer Protocol)是超文本传输协议,用于客户端和服务器之间的通信。HTTPS 则是基于 SSL/TLS 的安全版本,对传输数据进行加密。默认端口分别为 80 和 443。
HTTP 通信由两部分组成:客户端请求消息与服务器响应消息。
浏览器发送 HTTP 请求的过程通常如下:
响应状态代码由三位数字组成,第一个数字定义了响应的类别:
requests 是 Python 中最流行的 HTTP 库,用来获取目标网页文本。它简化了 HTTP 请求的复杂性,支持 Session 保持连接、Cookie 管理、代理设置等高级功能。
使用 pymysql 封装 MySQL 接口,实现对数据库的读写。在实际项目中,建议定义一个 DBHelper 类来二次封装操作,提高代码复用性。
以豆瓣电影 Top250 为例,目标链接为 https://movie.douban.com/top250。
start 发生变化,例如 ?start=25&filter=。这表明下一页是从第 25 条数据开始加载的。time.sleep(),模拟人类浏览行为。requests.exceptions.RequestException 防止程序崩溃。以下是一个完整的示例,整合了请求、解析、数据存储逻辑。代码中使用了 lxml 进行高效解析,并模拟了数据库插入过程。
import requests
import time
from lxml import etree
import pymysql
# 配置项
BASE_URL = 'https://movie.douban.com/top250?start={}&filter='
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'
}
DB_CONFIG = {
'host': 'localhost',
'user': 'root',
'password': 'your_password',
'database': 'douban',
'charset': 'utf8mb4'
}
def get_source(url):
"""获取网页源码"""
try:
response = requests.get(url, headers=HEADERS, timeout=10)
response.encoding = 'utf-8'
if response.status_code == 200:
return response.text
else:
print(f"Request failed with status code: {response.status_code}")
return None
except Exception as e:
print(f"Error fetching URL: {e}")
return None
def parse_movies(html):
"""解析电影信息"""
if not html:
return []
tree = etree.HTML(html)
movie_items = tree.xpath("//div[@class='info']")
result = []
for item in movie_items:
movie_dict = {}
# 标题
title_list = item.xpath("div[@class='hd']/a/span[@class='title']/text()")
other_title_list = item.xpath("div[@class='hd']/a/span[@class='other']/text()")
movie_dict['title'] = ''.join(title_list + other_title_list).strip()
# 评分
star_list = item.xpath("div[@class='bd']/div[@class='star']/span[@class='rating_num']/text()")
movie_dict['star'] = star_list[0] if star_list else 'N/A'
# 链接
link_list = item.xpath('div[@class="hd"]/a/@href')
movie_dict['url'] = link_list[0] if link_list else ''
# 短评
quote_list = item.xpath("div[@class='bd']/p[@class='quote']/span/text()")
movie_dict['quote'] = quote_list[0].strip() if quote_list else ''
result.append(movie_dict)
return result
def save_to_mysql(data_list):
"""保存数据到 MySQL"""
conn = pymysql.connect(**DB_CONFIG)
cursor = conn.cursor()
sql = "INSERT INTO movies (title, star, url, quote) VALUES (%s, %s, %s, %s)"
try:
cursor.executemany(sql, data_list)
conn.commit()
print(f"Successfully saved {len(data_list)} records.")
except Exception as e:
conn.rollback()
print(f"Database error: {e}")
finally:
cursor.close()
conn.close()
def main():
all_movies = []
for i in range(10): # 爬取前 10 页
url = BASE_URL.format(i * 25)
print(f"Fetching page {i+1}...")
source = get_source(url)
if source:
movies = parse_movies(source)
all_movies.extend(movies)
time.sleep(1) # 延时防止被封
if all_movies:
save_to_mysql(all_movies)
if __name__ == '__main__':
main()
robots.txt 文件,遵守其规定。掌握 HTTP 原理与 Python 工具是构建爬虫的基础。实际开发中需结合具体场景调整策略,确保稳定高效。通过本教程,读者应能理解从 URL 构造、HTML 解析到数据存储的完整链路,并能编写出具备基本容错能力的爬虫程序。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online