编写Python爬虫抓取豆瓣电影TOP100及图片资源的方法
本文演示如何使用现代Python工具编写网页爬虫,以豆瓣电影Top100为例,讲解构建URL地址池、伪造请求头、利用BeautifulSoup稳定解析HTML结构,并将提取到的电影名称与相关图片安全保存至本地。全文已修复原代码的版本缺陷,提供更可靠的执行逻辑与反爬规避建议。
分析页面结构与准备环境
豆瓣电影榜单采用分页加载机制,通过URL参数控制起始位置。完整获取前100部电影只需遍历4页,地址规律依次为 http://movie.douban.com/top250?start=0 、 ?start=25 、 ?start=50 以及 ?start=75 。每页包含25部影片,核心中文片名位于 <span class="title"> 标签内,页面同时提供海报或用户头像等图片链接。
在编写程序前,需确保运行环境支持主流第三方库。推荐放弃原文本中已废弃的 urllib2 模块与正则表达式硬解析,改用 requests 处理网络请求,配合 beautifulsoup4 进行DOM树定位。可通过终端运行 pip install requests beautifulsoup4 完成安装。
第1步:构建请求头并获取目标页面
目的:模拟浏览器行为特征,降低被服务端识别为自动化脚本的风险。
入口:定义基础URL前缀,循环生成地址池。
动作:在每次发起GET请求时注入 User-Agent 等基础头部信息,并设置连接超时阈值。
import requests
from bs4 import BeautifulSoup
base_url = "https://movie.douban.com/top250"
# 构建需要抓取的4页URL列表
url_pool = [f"{base_url}?start={i*25}" for i in range(4)]
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"
}
all_movies = []
for url in url_pool:
response = requests.get(url, headers=headers, timeout=10)
response.encoding = response.apparent_encoding
soup = BeautifulSoup(response.text, "html.parser")
# 进入下一步解析逻辑
pass
第2步:定位DOM节点并提取文本信息
目的:精准捕获主标题文本,过滤掉附带副标题或英文名的干扰标签。
入口:遍历当前页解析生成的 soup 对象。
重要参数:CSS选择器 span.title ,字符串去重与空白符清理逻辑。
titles_on_page = []
for span_tag in soup.select("span.title"):
text = span_tag.get_text(strip=True)
# 仅保留不含 '/' 分隔符与空格的主标题
if "/" not in text and " " not in text:
titles_on_page.append(text)
all_movies.extend(titles_on_page)
print(f"当前页成功提取 {len(titles_on_page)} 部电影")
验证操作是否成功的直观标志是控制台按顺序打印出各页提取数量,且累计条数逐步逼近目标值。收集完毕后,可将 all_movies 列表转为字典或写入CSV文件。
第3步:安全下载图片资源
目的:将页面中发现的图片链接批量保存至本地目录,替代原文本中Windows绝对路径硬编码与缺乏异常处理的下载逻辑。
动作:使用 requests 流式读取二进制内容,设置重试与超时保护,并规范文件命名规则。
import os
import time
save_dir = "./douban_images"
os.makedirs(save_dir, exist_ok=True)
def download_image(img_url):
try:
res = requests.get(img_url, headers=headers, timeout=5)
res.raise_for_status()
# 尝试从URL末尾截取有效文件名
filename = img_url.split("/")[-1].split("?")[0] or "image.jpg"
filepath = os.path.join(save_dir, filename)
with open(filepath, "wb") as f:
f.write(res.content)
return True
except Exception as e:
print(f"图片下载失败 {img_url}: {e}")
return False
# 实际使用时,先在page内容中用 soup.select('img') 获取源URL再传入此函数
# 下载过程建议加入随机延迟,避免触发频率限制
time.sleep(1)
download_image("占位图片URL")
完成判断与排错说明
当控制台完整输出4页提取结果,且指定文件夹内出现对应数量的文件时,表示流程跑通。若运行中抛出 ConnectionError 或返回非正常状态码,通常由IP限频或HTTPS证书校验引起,可在 requests.get() 增加 verify=False 临时跳过校验,或改用代理IP池。
涉及覆盖、清除或批量写入磁盘的操作,建议在正式抓取前备份目标文件夹,并使用 try-except 包裹IO读写语句,防止因网络中断导致的部分写入损坏。采集类代码应严格遵守目标站点的 Robots.txt 协议,合理控制请求间隔与单次抓取上限。
简要总结
以上就是编写Python爬虫抓取豆瓣电影TOP100及图片资源的详细内容,更多关于Python网页数据采集与反爬策略的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













