程序实现目标
- 用户输入电影类型,如【热门 最新 经典 华语】 可获得此分类排名 Top 100 电影信息(电影名 评分 封面链接)
程序实现工具
- 星愿浏览器 以chromium为内核,操作方法与 chorme类似
- Microsoft Visual Studio
程序设计分析
- 登陆豆瓣电影主页 https://movie.douban.com/
点击 选电影
选电影 - 以 华语电影 为例,抓取此类型的数据,其他电影类型以此类推
华语电影
1. 分析数据来源
- 通过观察源码中是否有数据,判断是否是动态加载
判断是否是动态加载 - 进入源代码界面,ctrl + f 搜索一个前端页面中展示出的电影名
例:此处搜索《流浪地球》得到结果为0
数据动态加载
2.查找电影信息位置
-
网页端按下 F12 调出浏览器的控制台;选择 network,按 F5 刷新
刷新后页面 -
依次选择 XHR 加载 json 链接 - response
此处可以清楚地看到我们所需的信息 -
点击 headers,查看其发送的链接地址和方法
关注 Request URL 和 Request Method -
将 链接地址 复制到浏览器中加载,可以得到如下内容
华语电影信息
3. 获取更多电影信息
- 返回 选电影 界面,点击 加载更多 ,观察 链接 的变化
加载前 page_start=0

加载更多

加载后 page_start=20
-
得到结论:若要 加载更多,只需改变 page_start
程序设计过程
1. 引入所需的包
#coding=ut f-8
import requests
import time
import json
from lxml import etree
2. 创建一个类,并定义 init
(包含 url列表和请求头)
class DoubanMovieSpider:
def __init__(self):
# 定义一个url列表,可以存放各种类别的url链接,这里只存放了华语电影的链接
self.url_list_temp = [
{
"url_temp": "https://movie.douban.com/j/search_subjects?type=movie&tag=%E5%8D%8E%E8%AF%AD&sort=recommend&page_limit=20&page_start={}",
"country": "CN"
}
]
# 定义请求头headers
self.headers = {
"Accept" : "*/*",
"Accept-Encoding" : "gzip, deflate, br",
"Accept-Language" : "zh,zh-TW;q=0.9,en-US;q=0.8,en;q=0.7,zh-CN;q=0.6",
"Connection" : "keep-alive",
"Host" : "movie.douban.com",
"Referer" : "https://movie.douban.com/explore",
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36",
"X-Requested-With" : "XMLHttpRequest"
}
3. 定义请求函数
# 定义请求函数
def parse_url(self, url):
try:
html_str = requests.get(url, headers=self.headers)
except Exception as e:
print(e)
# 如果报错就将其至为None
html_str = None
return html_str
4.定义函数:提取电影url
# 定义提取电影url的函数
def get_url_list(self, html_str):
# 将json格式数据转换为字典(也可以理解为将字符串转化为字典)
dict_response = json.loads(html_str.text)
# 获取电影内容,获取电影内容列表
content_list = dict_response["subjects"]
# print(content_list)
# 定义url列表,将获取到的url放到列表中返回
url_list = []
for moves_url in content_list:
move_url = moves_url["url"]
url_list.append(move_url)
return url_list
5.定义函数:获取电影信息(电影名 评分 封面链接)
# 只获取电影名、评分和封面等信息
def get_message(self, html_str):
# 将json格式数据转换为字典(也可以理解为将字符串转化为字典)
dict_response = json.loads(html_str.text)
# 获取电影内容,获取电影内容列表
content_list = dict_response["subjects"]
for movies in content_list:
item = {}
item["电影名"] = movies["title"]
item["评分"] = movies["rate"]
item["封面"] = movies["cover"]
print(item)
6.定义函数:run函数 main函数
def run(self):
# 遍历要爬取的电影类别url
for url_temp in self.url_list_temp:
num = 0
# 设置想要爬取的电影数量
totle = 100
while num <= totle + 20:
# 拼接url
url = url_temp["url_temp"].format(num)
# print(url)
# 携带发送请求获取数据
html_str = self.parse_url(url)
# 提取电影url
# url_list = self.get_url_list(html_str)
# 获取电影名、评分和封面等信息
self.get_message(html_str)
num += 20
if __name__ == '__main__':
douban = DoubanMovieSpider()
douban.run()
程序源码
- 此源码的url中只存放了华语电影链接
# coding=utf-8
import requests
import json
class DoubanMovieSpider:
def __init__(self):
# 定义一个url列表,可以存放各种类别的url链接,这里只放了华语电影的链接
self.url_list_temp = [
{
"url_temp": "https://movie.douban.com/j/search_subjects?type=movie&tag=%E5%8D%8E%E8%AF%AD&sort=recommend&page_limit=20&page_start={}",
"country": "CN"
}
]
# 定义请求头headers
self.headers = {
"Accept" : "*/*",
"Accept-Encoding" : "gzip, deflate, br",
"Accept-Language" : "zh,zh-TW;q=0.9,en-US;q=0.8,en;q=0.7,zh-CN;q=0.6",
"Connection" : "keep-alive",
"Host" : "movie.douban.com",
"Referer" : "https://movie.douban.com/explore",
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36",
"X-Requested-With" : "XMLHttpRequest"
}
# 定义请求函数
def parse_url(self, url):
try:
html_str = requests.get(url, headers=self.headers)
except Exception as e:
print(e)
# 如果报错就将其至为None
html_str = None
return html_str
# 定义提取电影url的函数
def get_url_list(self, html_str):
# 将json格式数据转换为字典(也可以理解为将字符串转化为字典)
dict_response = json.loads(html_str.text)
# 获取电影内容,获取电影内容列表
content_list = dict_response["subjects"]
# print(content_list)
# 定义url列表,将获取到的url放到列表中返回
url_list = []
for moves_url in content_list:
move_url = moves_url["url"]
url_list.append(move_url)
return url_list
# 只获取电影名、评分和封面等信息
def get_message(self, html_str):
# 将json格式数据转换为字典(也可以理解为将字符串转化为字典)
dict_response = json.loads(html_str.text)
# 获取电影内容,获取电影内容列表
content_list = dict_response["subjects"]
for movies in content_list:
item = {}
item["电影名"] = movies["title"]
item["评分"] = movies["rate"]
item["封面"] = movies["cover"]
print(item)
def run(self):
# 遍历要爬取的电影类别url
for url_temp in self.url_list_temp:
num = 0
# 设置想要爬取的电影数量
totle = 100
while num <= totle + 20:
# 拼接url
url = url_temp["url_temp"].format(num)
# print(url)
# 携带发送请求获取数据
html_str = self.parse_url(url)
# 提取电影url
# url_list = self.get_url_list(html_str)
# 获取电影名、评分和封面等信息
self.get_message(html_str)
num += 20
if __name__ == '__main__':
douban = DoubanMovieSpider()
douban.run()
程序拓展
- 前文中只实现了华语电影信息的展示,后文将拓展功能,通过查找 对 【热门 最新 经典 华语】电影信息进行提取
1. 查看发送的链接地址和方法
-
热门电影
Request URL:https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0
Request Method:GET
-
最新电影
Request URL:https://movie.douban.com/j/search_subjects?type=movie&tag=%E6%9C%80%E6%96%B0&page_limit=20&page_start=0
Request Method:GET
-
经典电影
Request URL:https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%BB%8F%E5%85%B8&sort=time&page_limit=20&page_start=0
Request Method:GET
2. 拓展 init 函数
def __init__(self):
self.url_list_temp_1 = [
{
"url_temp": "https://movie.douban.com/j/search_subjects?type=movie&tag=%E5%8D%8E%E8%AF%AD&sort=recommend&page_limit=20&page_start={}",
"country": "CN"
}]
self.url_list_temp_2 = [{
"url_temp": "https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start={}",
"country": "CN"
}]
self.url_list_temp_3 = [{
"url_temp": "https://movie.douban.com/j/search_subjects?type=movie&tag=%E6%9C%80%E6%96%B0&page_limit=20&page_start={}",
"country": "CN"
}]
self.url_list_temp_4 = [{
"url_temp": "https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%BB%8F%E5%85%B8&sort=time&page_limit=20&page_start={}",
"country": "CN"
}]
self.headers = {
"Accept" : "*/*",
"Accept-Encoding" : "gzip, deflate, br",
"Accept-Language" : "zh,zh-TW;q=0.9,en-US;q=0.8,en;q=0.7,zh-CN;q=0.6",
"Connection" : "keep-alive",
"Host" : "movie.douban.com",
"Referer" : "https://movie.douban.com/explore",
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.204 Safari/537.36",
"X-Requested-With" : "XMLHttpRequest"
}
3. 拓展 run 函数
- 通过输入【热门 最新 经典 华语】选择对 某一类型 电影信息的 查找
def run(self):
while(1):
kind = input('你想要搜索的电影类型【热门 最新 经典 华语】')
if kind == '华语':
for url_temp in self.url_list_temp_1:
num = 0
totle = 100
while num <= totle + 20:
url = url_temp["url_temp"].format(num)
html_str = self.parse_url(url)
self.get_message(html_str)
num += 20
break
elif kind == '热门':
for url_temp in self.url_list_temp_1:
num = 0
totle = 100
while num <= totle + 20:
url = url_temp["url_temp"].format(num)
html_str = self.parse_url(url)
self.get_message(html_str)
num += 20
break
elif kind == '最新':
for url_temp in self.url_list_temp_1:
num = 0
totle = 100
while num <= totle + 20:
url = url_temp["url_temp"].format(num)
html_str = self.parse_url(url)
self.get_message(html_str)
num += 20
break
elif kind == '经典':
for url_temp in self.url_list_temp_1:
num = 0
totle = 100
while num <= totle + 20:
url = url_temp["url_temp"].format(num)
html_str = self.parse_url(url)
self.get_message(html_str)
num += 20
break
print('输入有误,请重新输入')
程序源码更新
- 增加了查找【热门 最新 经典 华语】电影信息
# coding=utf-8
import requests
import json
class DoubanMovieSpider:
def __init__(self):
self.url_list_temp_1 = [
{
"url_temp": "https://movie.douban.com/j/search_subjects?type=movie&tag=%E5%8D%8E%E8%AF%AD&sort=recommend&page_limit=20&page_start={}",
"country": "CN"
}]
self.url_list_temp_2 = [{
"url_temp": "https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start={}",
"country": "CN"
}]
self.url_list_temp_3 = [{
"url_temp": "https://movie.douban.com/j/search_subjects?type=movie&tag=%E6%9C%80%E6%96%B0&page_limit=20&page_start={}",
"country": "CN"
}]
self.url_list_temp_4 = [{
"url_temp": "https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%BB%8F%E5%85%B8&sort=time&page_limit=20&page_start={}",
"country": "CN"
}]
self.headers = {
"Accept" : "*/*",
"Accept-Encoding" : "gzip, deflate, br",
"Accept-Language" : "zh,zh-TW;q=0.9,en-US;q=0.8,en;q=0.7,zh-CN;q=0.6",
"Connection" : "keep-alive",
"Host" : "movie.douban.com",
"Referer" : "https://movie.douban.com/explore",
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.204 Safari/537.36",
"X-Requested-With" : "XMLHttpRequest"
}
def parse_url(self, url):
try:
html_str = requests.get(url, headers=self.headers)
except Exception as e:
print(e)
html_str = None
return html_str
def get_url_list(self, html_str):
dict_response = json.loads(html_str.text)
content_list = dict_response["subjects"]
url_list = []
for moves_url in content_list:
move_url = moves_url["url"]
url_list.append(move_url)
return url_list
def get_message(self, html_str):
dict_response = json.loads(html_str.text)
content_list = dict_response["subjects"]
for movies in content_list:
item = {}
item["电影名"] = movies["title"]
item["评分"] = movies["rate"]
item["封面"] = movies["cover"]
print(item)
def run(self):
while(1):
kind = input('你想要搜索的电影类型【热门 最新 经典 华语】')
if kind == '华语':
for url_temp in self.url_list_temp_1:
num = 0
totle = 100
while num <= totle + 20:
url = url_temp["url_temp"].format(num)
html_str = self.parse_url(url)
self.get_message(html_str)
num += 20
break
elif kind == '热门':
for url_temp in self.url_list_temp_1:
num = 0
totle = 100
while num <= totle + 20:
url = url_temp["url_temp"].format(num)
html_str = self.parse_url(url)
self.get_message(html_str)
num += 20
break
elif kind == '最新':
for url_temp in self.url_list_temp_1:
num = 0
totle = 100
while num <= totle + 20:
url = url_temp["url_temp"].format(num)
html_str = self.parse_url(url)
self.get_message(html_str)
num += 20
break
elif kind == '经典':
for url_temp in self.url_list_temp_1:
num = 0
totle = 100
while num <= totle + 20:
url = url_temp["url_temp"].format(num)
html_str = self.parse_url(url)
self.get_message(html_str)
num += 20
break
print('输入有误,请重新输入')
if __name__ == '__main__':
douban = DoubanMovieSpider()
douban.run()
小反思 5.29
- 增加查找功能时,可以定义 Search 函数单独进行查找输入的处理
- self.url_list_temp 目前是字典形式,可以将 url 链接 放入字典处理
- python的 缩进 相比其他语言更加严格
参考文献
https://mp.weixin.qq.com/s/JmEQrJIlFlsPmymJlkNkcQ








