跳到主要内容

Python 爬取网页内容

题目

使用 Python 编写一个程序,获取豆瓣电影网页中的一周口碑榜电影名称并输出为一个文本文件。

相关网址

https://movie.douban.com/chart

程序设计思路

访问网址读取网页内容

  1. 创建 HTTP 请求头的用户代理(User-Agent)。
  2. 使用 requests 软件包中的 get() 方法,指定请求头访问并获取网页内容。
  3. 设置 encodingutf-8 设置读取网页的编码,避免读取内容为乱码。
备注

HTTP 请求头设置用户代理的目的是向服务器提供虚拟的用户信息,大部分的网站都有防爬虫的机制,利用用户代理可以越过一些简易的反爬虫机制,若不使用用户代理,则可能读取失败

匹配爬取的内容

  1. 观察网页中一周口碑榜中各电影名称的 HTML 布局结构。
  2. 使用 re 软件包中的 compile 方法创建针对一周口碑榜电影名称的正则表达式。
  3. 使用 findall() 方法执行匹配操作并获取匹配结果。

输出为文本文件

  1. 使用 open() 方法打开一个 txt 文件,指定 w 模式,将编码设置为 utf-8
  2. 使用 for 循环语句和 write() 方法将匹配的内容写入该文本文件。
  3. 使用 close() 方法关闭文本文件。

使用 open() 方法的常用打开模式

模式说明
"w"用于打开文件进行写入,如果文件存在则会清空文件内容,文件不存在则会创建一个新文件,文件指针位于文件的开头。
"r"用于打开文件进行读取,如果文件不存在,会发生错误,文件指针位于文件的开头。
"a"用于在文件末尾追加内容,如果文件不存在则会创建一个新文件,文件指针位于文件的末尾。

参考答案

reptile.py
import requests
import re

url = "https://movie.douban.com/chart"
head = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'} # 添加用户代理的HTTP请求头
resp = requests.get(url, headers=head) # 通过网址访问并获取网页内容
resp.encoding = "utf-8" # 设置获取的内容编码为utf-8
pattern = re.compile(
r'<a onclick="moreurl\(this, \{from:\'mv_week\'\}\)".*?class="">\s*(.*?)\s*</a>') # 创建正则表达式匹配一周口碑榜中的电影名称
movie_names = pattern.findall(resp.text) # 执行正则表达式的匹配并获取匹配结果
file = open("movie.txt", "w", encoding="utf-8") # 打开一个文本文件,"w"模式下若文件不存在将会自动创建
file.write("一周口碑榜:\n")
for name in movie_names: # 将匹配出的电影名称逐行导入文本文件
file.write(name.strip())
file.write('\n')
file.close() # 关闭文件