1. 爬虫基础概念
爬虫是一种按照一定规则,自动抓取互联网信息的程序或脚本。Python爬虫主要涉及以下几个核心环节:
发送HTTP请求获取网页内容
解析和提取目标数据
存储数据
2. urllib库基础
2.1 基本使用(first.py)
urllib是Python内置的HTTP请求库,用于发送请求和获取响应。
from urllib.request import urlopen
# 1. 定义目标URL
baseUrl = "https://www.baidu.com"
# 2. 发送GET请求,获取响应对象
response = urlopen(baseUrl)
# 3. 读取响应内容并解码为字符串
html = response.read().decode("utf-8")
# 4. 将内容保存到本地文件
with open('./mybaidu.html', 'w', encoding='utf-8') as f:
f.write(html)2.2 核心知识点
urlopen(): 发送HTTP请求,返回响应对象read(): 读取响应内容(字节流)decode(): 将字节流转换为字符串,需要指定编码格式(如utf-8)文件读写: 使用
with open()上下文管理器安全操作文件
3. requests库入门
3.1 基本使用(test_requests.py)
requests是Python最流行的HTTP库,比urllib更简洁易用。
import requests
# 1. 定义目标URL
url = 'https://www.baidu.com'
# 2. 发送GET请求,获取响应对象
response = requests.get(url)
# 3. 查看响应信息
print("响应对象:", response) # <Response [200]>
print("响应状态码:", response.status_code) # 200
print("响应头:", response.headers) # 包含服务器返回的所有头信息
print("响应内容(bytes):", response.content) # 字节流形式
print("响应内容(str):", response.text) # 字符串形式3.2 核心知识点
requests.get(): 发送GET请求响应对象的核心属性:
status_code: 响应状态码(200表示成功)headers: 响应头content: 字节流响应内容text: 自动解码的字符串响应内容
4. requests库进阶 - GET请求
4.1 带Headers的GET请求(requests_do.py)
Headers用于模拟浏览器请求,避免被服务器识别为爬虫。
import requests
# 1. 定义目标URL
url = f'https://www.sougou.com/web?query=周杰伦&_asf=www.sogou.com&_ast=1768034633&w=01019900&p=40040100&ie=utf8&from=index-nologin&s_from=index'
# 2. 定义Headers,模拟浏览器
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',
# 其他Headers...
}
# 3. 发送带Headers的GET请求
res = requests.get(url, headers=headers)4.2 带Params的GET请求(douban.py)
Params用于构建查询字符串,适合动态参数传递。
import requests
# 1. 定义基础URL
url = "https://movie.douban.com/j/chart/top_list"
# 2. 定义查询参数
params = {
'type': '24', # 电影类型(喜剧)
'interval_id': '100:90', # 评分区间
'action': '',
'start': '0', # 起始索引
'limit': '20' # 获取数量
}
# 3. 定义Headers
header = {
'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',
}
# 4. 发送带Params和Headers的GET请求
res = requests.get(url, params=params, headers=header)
# 5. 处理JSON响应
print(res.json())
# 6. 保存JSON数据到本地
with open('./douban.json', 'w', encoding='utf-8') as f:
f.write(res.text)4.3 GET请求核心知识点
headers参数:模拟浏览器,包含User-Agent等信息params参数:构建查询字符串,自动添加到URLjson()方法:将JSON格式的响应内容转换为Python字典
5. requests库进阶 - POST请求
5.1 带Data的POST请求(baidufanyi.py)
POST请求用于向服务器提交数据,如表单提交、API调用等。
import requests
# 1. 定义目标URL
url = f'https://fanyi.baidu.com/sug'
# 2. 定义Headers
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',
# 其他Headers...
}
# 3. 定义要提交的数据
data = {
'kw': 'dog', # 翻译关键词
}
# 4. 发送POST请求
res = requests.post(url, headers=headers, data=data)
# 5. 处理JSON响应
print(res.json()['data'][0]) # 获取翻译结果5.2 POST请求核心知识点
requests.post(): 发送POST请求data参数:提交表单数据,适合application/x-www-form-urlencoded格式对于JSON格式的请求体,使用
json参数
6. 数据解析 - 正则表达式
6.1 正则表达式基础(datadeal.py)
正则表达式是一种用于匹配字符串的强大工具,常用于从HTML、JSON等文本中提取数据。
6.1.1 常用元字符
6.1.2 常用量词
6.1.3 贪婪匹配与惰性匹配
.*贪婪匹配:匹配尽可能多的字符.*?惰性匹配:匹配尽可能少的字符
6.2 re模块常用方法
import re
# 1. findall() - 获取所有匹配结果,返回列表
res = re.findall(r'\d+', '永远18岁,还要有很多很多100万') # ['18', '100']
# 2. finditer() - 获取所有匹配结果,返回迭代器
res = re.finditer(r'\d+', '永远18岁,还要有很多很多100万')
for item in res:
print(item.group()) # 18, 100
# 3. search() - 返回第一次匹配结果,返回匹配对象
res = re.search(r'\d+', '永远18岁,还要有很多很多100万')
print(res.group()) # 18
# 4. match() - 从字符串开头匹配,返回匹配对象
res = re.match(r'\d+', '永远18岁') # None,因为开头不是数字
# 5. compile() - 编译正则表达式,提高复用性
pattern = re.compile(r'\d+')
res = pattern.findall('永远18岁,还要有很多很多100万') # ['18', '100']6.3 正则表达式解析HTML
# HTML示例
html = '''
<html>
<head>
<title>这是一个标题</title>
</head>
<body>
<h1>这是一个h1标题</h1>
<p>这是一个段落</p>
<div>这是一个div<span id="span1">中国移动</span></div>
<div>这是一个div<span id="span2">中国电信</span></div>
</body>
</html>
'''
# 提取标题
res = re.findall(r'<title>(.*?)</title>', html)
print(res[0]) # 这是一个标题
# 提取span内容和id(分组)
res = re.findall(r'<div>这是一个div<span id="(span\d+?)">(.*?)</span></div>', html)
print(res) # [('span1', '中国移动'), ('span2', '中国电信')]
# 使用命名分组
res = re.finditer(r'<div>这是一个div<span id="(?P<span_id>span\d+?)">(?P<span_content>.*?)</span></div>', html)
for item in res:
print(item.group('span_id')) # span1, span2
print(item.group('span_content')) # 中国移动, 中国电信7. 学习建议
基础巩固:熟练掌握HTTP协议、HTML结构和CSS选择器
库的选择:
发送请求:requests库(简洁易用)
数据解析:
正则表达式(通用但复杂)
BeautifulSoup(HTML解析神器)
lxml(高效的HTML/XML解析库)
jsonpath(JSON数据解析)
进阶学习:
动态加载数据爬取(Selenium、Playwright)
异步爬虫(asyncio + aiohttp)
爬虫框架(Scrapy)
反爬策略应对(代理IP、验证码识别、动态UA)
实战练习:从简单网站开始,逐步挑战复杂网站
遵守规则:尊重网站robots.txt协议,不要过度请求影响网站正常运行
8. 下一步学习方向
学习BeautifulSoup和lxml库,更高效地解析HTML
学习处理JavaScript动态加载的内容
学习使用Scrapy框架进行大规模爬虫开发
学习数据库操作,将爬取的数据持久化存储
学习爬虫部署和监控