Python爬虫学习过程

14 阅读5分钟

开飞机的舒克 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模块
  • 保存到数据库:使用sqlite3pymysql
  • 保存到MongoDB:使用pymongo

3. 更高级的反爬处理

  • 使用代理IP
  • 处理Cookie
  • 模拟登录
  • 使用Selenium模拟浏览器行为

4. 并发爬取

  • 使用threadingmultiprocessing实现并发
  • 使用asyncioaiohttp实现异步爬取

七、总结

通过这个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爬虫有了基本的了解。爬虫技术博大精深,需要不断学习和实践才能掌握。祝你在爬虫学习的道路上越走越远!