Python 爬虫入门:基础类库与实战案例详解
Python 爬虫的基础知识与实战技巧。内容涵盖 urllib 标准库的使用,包括请求发送、响应读取、URL 编码及文件写入。通过百度翻译、肯德基店铺、豆瓣电影等案例演示了 GET 与 POST 请求的处理方法,以及 Ajax 动态数据的抓取。此外,文章还补充了 Requests 库的高级用法、Session 会话管理、异常处理机制、HTML 解析方案以及常见的反爬策略与合规注意事项,旨在帮助读者建立完整的爬虫开发知识体系。

Python 爬虫的基础知识与实战技巧。内容涵盖 urllib 标准库的使用,包括请求发送、响应读取、URL 编码及文件写入。通过百度翻译、肯德基店铺、豆瓣电影等案例演示了 GET 与 POST 请求的处理方法,以及 Ajax 动态数据的抓取。此外,文章还补充了 Requests 库的高级用法、Session 会话管理、异常处理机制、HTML 解析方案以及常见的反爬策略与合规注意事项,旨在帮助读者建立完整的爬虫开发知识体系。

网络爬虫(Web Crawler)是自动化抓取互联网信息的技术。在 Python 中,最基础的爬虫开发通常基于标准库 urllib,但实际工程中更推荐使用第三方库 requests 配合 BeautifulSoup 或 lxml 进行解析。本文将详细介绍从基础请求到高级反爬策略的完整流程。
Python 内置的 urllib 模块提供了处理 URL 的核心功能。
from urllib import request, parse
import json
# 定义目标 URL
url = "http://www.baidu.com"
# 发起请求,返回响应对象
response = request.urlopen(url)
响应对象包含状态码、URL 和响应体等信息。
# 读取响应体(字节形式)
data_bytes = response.read()
# 解码为文本(注意编码格式,通常为 utf-8)
text = data_bytes.decode("utf-8")
print(text)
# 获取状态码
status_code = response.getcode()
# 获取最终请求地址(可能包含重定向)
final_url = response.geturl()
# 获取响应头
headers = response.getheaders()
将抓取的网页源码保存至本地。
with open('baidu.html', 'w', encoding='utf-8') as fp:
fp.write(text)
在构造请求参数时,特殊字符需要进行 URL 编码。
# 单个参数编码
encoded_name = parse.quote("小鲁班")
# 多个参数编码
params_dict = {
"name": "肖",
"password": "213123 丽华",
"age": "五十岁"
}
base_url = "http://www.baidu.com/s?"
encoded_params = parse.urlencode(params_dict)
full_url = base_url + encoded_params
GET 请求通常用于获取数据,参数直接拼接在 URL 后。
url = "https://tieba.baidu.com/f?kw=斗罗大陆&ie=utf-8&pn=0"
req = request.Request(url=url)
response = request.urlopen(req)
text = response.read().decode('utf-8')
POST 请求常用于提交表单数据,需携带 data 参数。
post_url = "https://fanyi.baidu.com/sug"
data_dict = {"kw": "sogreat"}
# 编码并转为 bytes
data = parse.urlencode(data_dict).encode("utf-8")
# 封装请求对象
req = request.Request(url=post_url, headers={}, data=data)
response = request.urlopen(req)
text = response.read().decode('utf-8')
# 解析 JSON
json_obj = json.loads(text, encoding='utf-8')
for item in json_obj["data"]:
print(item)
服务器通常会检查 User-Agent 头以识别客户端。爬虫需模拟真实浏览器的请求头。
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36"
}
req = request.Request(url=url, headers=headers)
response = request.urlopen(req)
通过循环分页参数获取所有数据,并封装函数提高可维护性。
headers1 = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36 Edg/100.0.1185.44"
}
newaddr = input("请输入城市名:")
KFCurl = "http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword"
pageindex = 1
while True:
datas = {
"cname": "",
"pid": "",
"pageIndex": pageindex,
"pageSize": 10,
"keyword": newaddr
}
# 编码转码
data = parse.urlencode(datas).encode(encoding="utf-8")
req1 = request.Request(url=KFCurl, headers=headers1, data=data)
try:
response1 = request.urlopen(req1, timeout=10)
address = response1.read().decode('utf-8')
address1 = json.loads(address)
if len(address1['Table1']) == 0:
break
for addr in address1['Table1']:
print(addr)
pageindex += 1
except Exception as e:
print(f"请求出错:{e}")
break
现代网站常使用 Ajax 异步加载数据,需分析 Network 面板中的 API 接口。
headers = {
'User-Agent': "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36"
}
base_url = "https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=&start={}&genres=%E5%8A%A8%E7%94%BB"
for p in range(0, 4):
total = p * 20
url = base_url.format(total)
req = request.Request(url=url, headers=headers)
response = request.urlopen(req)
text = response.read().decode('utf-8')
json_obj = json.loads(text)
for val in json_obj['data']:
title = val['title']
rate = val['rate']
print(f"title:{title}, rate:{rate}")
虽然 urllib 是标准库,但 requests 库语法更简洁,功能更强大。
import requests
response = requests.get(url, headers=headers)
print(response.text)
使用 Session 对象可以自动处理 Cookie,适合需要登录的场景。
session = requests.Session()
resp = session.post(login_url, data=login_data)
# 后续请求会自动携带登录后的 Cookie
resp2 = session.get(target_url)
网络不稳定时需增加超时设置和重试机制。
try:
response = requests.get(url, timeout=5)
response.raise_for_status()
except requests.exceptions.Timeout:
print("请求超时")
except requests.exceptions.HTTPError as err:
print(f"HTTP 错误:{err}")
对于 HTML 页面,推荐使用 BeautifulSoup 或 lxml 提取数据。
from bs4 import BeautifulSoup
soup = BeautifulSoup(text, 'html.parser')
titles = soup.find_all('div', class_='title')
robots.txt 协议。Python 爬虫技术涵盖了 HTTP 协议理解、数据编码、请求发送、响应解析及反爬对抗等多个环节。初学者应从 urllib 入手理解原理,随后掌握 requests 和解析库提升效率。在实际项目中,务必注重代码的健壮性与合法性,确保技术应用的可持续性。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 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