开飞机的舒克 halo.gaodaimou.cn
一、爬虫简介
这是一个使用Python爬取XXX电影Top250的示例代码,通过该案例可以学习到Python爬虫的基本流程和核心技术。
二、环境准备
1. 安装必要库
pip install requests
2. 了解基本概念
- HTTP请求:使用GET方法获取网页内容
- User-Agent:模拟浏览器请求,避免被反爬
- 正则表达式:用于解析HTML页面,提取所需信息
- 文件操作:将爬取结果保存到本地文件
三、代码分析(分步骤学习)
1. 导入必要库
import requests
import re
requests:用于发送HTTP请求,获取网页内容re:用于正则表达式匹配,解析HTML页面
2. 初步尝试 - API方式(注释部分)
# url = 'https://movie.XXX.com/j/chart/top_list'
# parmas = {
# 'type': 24,
# 'interval_id': '100:90',
# 'action': '',
# 'start': 0,
# 'limit': 20
# }
# 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',
# }
# res = requests.get(url, params=parmas, headers=headers)
# print(res.json()) #获取到了XXX爱情电影的排行榜
- 学习点:使用API接口获取数据,返回JSON格式,易于解析
- 特点:数据格式规范,解析简单,但可能有访问限制
3. 正式实现 - 网页爬取方式
3.1 打开文件准备写入
f = open('top250.txt', 'w', encoding='utf-8')
- 学习点:文件操作,使用
open()函数打开文件,指定写入模式和编码
3.2 设置基础参数
url = 'https://movie.XXX.com/top250'
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',
}
pageStart = 0
-
学习点:
- 设置目标URL
- 配置请求头,添加User-Agent模拟浏览器
- 初始化分页参数
3.3 分页爬取逻辑
for i in range(0, 226, 25):
pageStart = i
params = {
'start': pageStart,
}
res = requests.get(url, params=params, headers=headers)
res.encoding = 'utf-8'
html = res.text
-
学习点:
- 使用
range()函数实现分页,步长为25(每页25条数据) - 构建请求参数,设置起始位置
- 发送GET请求,获取响应
- 设置响应编码为UTF-8,避免中文乱码
- 提取响应文本,即HTML内容
- 使用
3.4 正则表达式解析HTML
pattern = (r'<div class="item">.*?<a h'
r'ref="(?P<imgLink>.*?)?">.*?</a>.*?<span class="title">(?P<title>.*?)'
r'</span>.*?<div class="bd">.*?<p>.*?导演: (?P<director>.*?) .*?'
r'<br>\s+(?P<intor>\d*) / (?P<country>.*?) / (?P<type>.*?)\s+</p>.*?'
r'\s+<span>(?P<person>\d*)人评价</span>.*?</div>')
reg = re.compile(pattern, re.S)
result = reg.finditer(html)
-
学习点:
- 编写正则表达式,使用命名捕获组提取所需信息
- 使用
re.compile()编译正则表达式,提高匹配效率 - 使用
re.S标志,使.可以匹配换行符 - 使用
finditer()方法,返回匹配结果的迭代器
3.5 提取数据并写入文件
for item in result:
imgLink = item.group('imgLink')
title = item.group('title')
director = item.group('director')
intor = item.group('intor')
country = item.group('country')
type = item.group('type')
person = item.group('person')
f.write(f'{imgLink},{title},{director},{intor},{country},{type},{person}\n')
res.close()
f.close()
-
学习点:
- 遍历匹配结果,使用
group()方法获取命名捕获组的内容 - 将提取的数据写入文件,使用CSV格式存储
- 关闭响应对象和文件对象,释放资源
- 遍历匹配结果,使用
四、学习要点
1. 爬虫基本流程
发送请求 → 获取响应 → 解析内容 → 提取数据 → 保存数据
2. 核心技术点
- HTTP请求:使用
requests库发送GET/POST请求 - 反爬处理:设置User-Agent,模拟浏览器行为
- 页面解析:使用正则表达式提取所需信息
- 分页处理:通过URL参数实现多页爬取
- 文件操作:将数据保存到本地文件
3. 正则表达式技巧
- 使用命名捕获组
(?P<name>pattern),提高代码可读性 - 使用非贪婪匹配
.*?,避免过度匹配 - 使用
re.S标志,处理多行HTML - 处理空白字符,使用
\s+匹配一个或多个空白字符
五、注意事项
1. 遵守robots.txt协议
在爬取网站前,应查看网站的robots.txt文件,了解网站的爬取规则。
2. 控制爬取频率
不要过于频繁地发送请求,避免给服务器造成过大压力。可以添加延时:
import time
time.sleep(1) # 每次请求后延时1秒
3. 异常处理
添加异常处理机制,提高爬虫的稳定性:
try:
res = requests.get(url, params=params, headers=headers)
res.raise_for_status() # 检查请求是否成功
except Exception as e:
print(f"请求失败:{e}")
continue
4. 编码问题
确保正确设置响应编码,避免中文乱码:
res.encoding = 'utf-8' # 或使用res.apparent_encoding自动检测
六、扩展建议
1. 使用更高级的解析库
- BeautifulSoup:简化HTML解析
- lxml:更快的XML/HTML解析器
- XPath:更灵活的节点选择方式
2. 数据存储方式
- 保存到CSV文件:使用
csv模块 - 保存到数据库:使用
sqlite3或pymysql - 保存到MongoDB:使用
pymongo
3. 更高级的反爬处理
- 使用代理IP
- 处理Cookie
- 模拟登录
- 使用Selenium模拟浏览器行为
4. 并发爬取
- 使用
threading或multiprocessing实现并发 - 使用
asyncio和aiohttp实现异步爬取
七、总结
通过这个XXX电影Top250爬虫案例,我们学习了Python爬虫的基本流程和核心技术。从发送请求、获取响应,到解析HTML、提取数据,再到保存数据,完整地实现了一个简单的爬虫程序。
在学习过程中,我们掌握了:
- requests库的基本使用
- 正则表达式的编写技巧
- 文件操作的基本方法
- 分页爬取的实现逻辑
- 反爬的基本处理方式
这个案例虽然简单,但涵盖了Python爬虫的核心概念和技术,是学习Python爬虫的良好起点。在此基础上,可以进一步学习更高级的爬虫技术,实现更复杂的爬虫项目。
八、完整代码
import requests
import re
# 打开文件准备写入
f = open('top250.txt', 'w', encoding='utf-8')
url = 'https://movie.XXX.com/top250'
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',
}
# 分页爬取
for i in range(0, 226, 25):
params = {
'start': i,
}
res = requests.get(url, params=params, headers=headers)
res.encoding = 'utf-8'
html = res.text
# 编写正则表达式
pattern = (r'<div class="item">.*?<a h'
r'ref="(?P<imgLink>.*?)?">.*?</a>.*?<span class="title">(?P<title>.*?)'
r'</span>.*?<div class="bd">.*?<p>.*?导演: (?P<director>.*?) .*?'
r'<br>\s+(?P<intor>\d*) / (?P<country>.*?) / (?P<type>.*?)\s+</p>.*?'
r'\s+<span>(?P<person>\d*)人评价</span>.*?</div>')
reg = re.compile(pattern, re.S)
result = reg.finditer(html)
# 提取数据并写入文件
for item in result:
imgLink = item.group('imgLink')
title = item.group('title')
director = item.group('director')
intor = item.group('intor')
country = item.group('country')
type = item.group('type')
person = item.group('person')
f.write(f'{imgLink},{title},{director},{intor},{country},{type},{person}\n')
res.close()
f.close()
print("爬取完成!")
通过这个案例的学习,相信你已经对Python爬虫有了基本的了解。爬虫技术博大精深,需要不断学习和实践才能掌握。祝你在爬虫学习的道路上越走越远!