1.查看豆瓣热门电影模块源码:
看到其所在class为list-wp,我们想通过urllib里面的request,来获取豆瓣html源码,然后查找热门电影所在的位置,然后解析里面的信息。使用代码如下:
from bs4 import BeautifulSoup
from urllib import request
url = "https://movie.douban.com/"
def gethtml():
req = request.urlopen(url)
return req.read().decode('utf-8')
def get_movie_list(html):
#构建soup对象,用来解析,查找html元素
soup = BeautifulSoup(html,'lxml')
movie_list = soup.find('div','list-wp') #找到class为List-wp的div标签,返回为找到的div标签
print(movie_list)
if __name__ == "__main__":
html = gethtml()
get_movie_list(html)
'''
输入如下:
'''
我们发现爬取的html是未加载全的html,根据如下博客:
https://blog.csdn.net/datacastle/article/details/78812575
2.第二次发送请求,获取数据
查看XHR请求,发现第二次请求的网页如下:
我们发现,第二次请求的页面获取的是json数据,我们需要的电影海报、名称、评分等信息都再json里面了,也就是说,我们可以直接请求json页面,获取json数据,然后根据电影信息构造html文件。接下来就是实现过程:
3.从json页面爬电影信息,构造html
# -*- coding:utf-8 -*-
"""
time = '2019/1/19 20:51'
author = 'Gregory'
filename = 'GoKu_craw.py'
"""
from urllib import request, parse
import webbrowser
import requests
start_html = '''
我的热门电影
最近热门电影
'''
url_json = 'https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&page_limit=50&page_start=0'
#从网页中获取json数据
def getjson():
req = requests.get(url_json).json()
return req
#从json中读取所有的热门电影,下载海报,并根据电影信息构造html,写入文件
def get_movie_list(json):
file = open('我的热门电影.html','w',encoding='utf-8')
file.write(start_html) #将构造的html开始部分写入文件
for i in range(50):#json中请求有50条数据,我们都将它爬取出来
if i % 4 == 0:
#爬取4条数据,换行
file.write('\n')
dic = json['subjects'][i] #从json中获取每部电影的信息字典
rate = dic['rate'] #这是我们需要的评分
url = dic['url'] #豆瓣上的地址
title = dic['title'] #电影名称
pic = dic['cover'] #电影海报
request.urlretrieve(pic, "img//{}.jpg".format(title)) #保存电影海报到本地img文件夹下,注意img要手动创建
# 构造html
item_html = '''
{0}
{1}
'''.format(title,rate,url) #构建存电影信息的表格
file.write(item_html)
if i % 4 == 3:
#一行结束
file.write(' \n')
end_html = '''
'''
file.write(end_html)#将html剩余部分写入文件
file.close()
#用浏览器打开html文件
def drive_html(html_file):
webbrowser.open(html_file)
if __name__ == "__main__":
json = getjson()
get_movie_list(json)
drive_html("我的热门电影.html")
运行如下:
本地海报: