PYTHON爬取豆瓣电影Top 250排行榜
PYTHON爬取豆瓣电影Top 250排行榜
**爬虫是什么?**我觉得可以理解为:爬虫就是模拟浏览器发送网络请求,获取响应,接着按照规则提取数据的程序。
于是,我们可以按照上面的思路,实现对“豆瓣电影 Top 250”这样的排行榜页面进行爬取上面评分为9分以上电影的图片的一个爬虫。
下面图片就是我们要爬的其中一个页面:
一般步骤:
1.获取url:通过观察页面获取url地址的规律以及总的页码数:构造url地址的列表。
首先我们观察每一个页面的url地址的区别,发现它有以start=“(页面数-1)*25”这样的规律。
于是我们可以根据这个规律进行如下代码的构建:
#url中间值
url_temp = "https://movie.douban.com/top250?start={}&filter="
#1.根据URL地址的规律,构造url_list
def get_url_list():
url_list =[url_temp.format(i*25) for i in range(0,10)]
return url_list
2.接着就是发送请求,获取响应
发送请求需要我们使用requests模块,可以用下面的代码进行:
#头部
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"
,"Referer": "https://movie.douban.com/top250?start=225&filter=",
'Cookie':'ll="118292"; bid=-9mqIuy5TLY; ap_v=0,6.0; __utmc=30149280; __utmz=30149280.1544928739.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utmc=223695111; __utmz=223695111.1544928740.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __yadk_uid=LaGBI82pjP10clYAY37uAABoNZF28g1P; _vwo_uuid_v2=D9AD361B1CD2A96A698283F36DD173130|5055df744b5c8d0e1fadf31d0e824aaa; ps=y; push_noty_num=0; push_doumail_num=0; as="https://movie.douban.com/tv/"; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1544933798%2C%22https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DjbQpIlp0yy0Y1woN8TJ0rY7AHngsGI8wR1l7Em_eGZznaMpRc8HlRoO7G453-J2m%26wd%3D%26eqid%3D8d5fe28f001d6578000000065c15bddc%22%5D; _pk_ses.100001.4cf6=*; __utma=30149280.1081739882.1544928739.1544928739.1544933799.2; __utmb=30149280.0.10.1544933799; __utma=223695111.1927962863.1544928740.1544928740.1544933799.2; __utmb=223695111.0.10.1544933799; _pk_id.100001.4cf6=674e3dd46599b683.1544928738.2.1544935392.1544929388.'
}
response = requests.get( url=url, headers=headers)
3.跟着就是提取数据
提取数据需要我们使用BeautifulSoup模块,如下面代码所示:
#获取HTML对象
response.encoding = response.apparent_encoding
html = BeautifulSoup(response.text, features='lxml')
此刻我们已经获取到相关HTML的对象,跟着可以使用BeautifulSoup继续提取数据。
我们通过开发者工具可以看到每一个电影模块就是一个li标签
而li标签下又包含这样一个<div class="item"><div>
接下来我们继续看下去,下面是关于电影评分的部分。
于是我们继续用HTML这个对象提取我们关心的每一块电影内容div。
#提取每一块电影内容div的列表
film_div_list = html.find_all('div','item')
这是一个列表类型,于是我们循环遍历它,获取我们关心的评分:
for film_div in film_div_list:
#获取评分
score = film_div.find('span','rating_num')
接着再看到:
以及它下面的img标签:
因此我们可以这样做:
if film_score >=9:
# print(film_score)
#获取图片div对象
film_picture = film_div.find('div','pic')
img = film_picture.find('img')
并且我们在上面可以看到它的两个属性:alt和src就是我们所需要的电影中文名以及图片路径,于是有:
if img:
#电影的中文名
film_Name = img.attrs.get('alt')
#相关图片的路径
picture_src = img.attrs.get('src')
print(film_Name)
print(picture_src)
4.最后就是保存数据
我们根据图片的路径再发送一次url请求,获取响应。
#图片路径
picture_url = picture_src
picture_response = requests.get(url=picture_url)
根据得到的响应将其以二进制格式打开一个文件只用于写入。
# 4.保存
file_name = "movie\\" + score.text + film_Name + ".jpg"
#根据得到的响应将其以二进制格式打开一个文件只用于写入。
with open(file_name, 'wb') as f:
f.write(picture_response.content)#字节
f.close()#关闭资源
到这里我们便可以实现对“豆瓣电影 Top 250”这样的排行榜页面进行爬取上面评分为9分以上电影的图片的一个爬虫。
下面是完整代码:
import requests
from bs4 import BeautifulSoup
import os
#url中间值
url_temp = "https://movie.douban.com/top250?start={}&filter="
#头部
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"
,"Referer": "https://movie.douban.com/top250?start=225&filter=",
'Cookie':'ll="118292"; bid=-9mqIuy5TLY; ap_v=0,6.0; __utmc=30149280; __utmz=30149280.1544928739.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utmc=223695111; __utmz=223695111.1544928740.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __yadk_uid=LaGBI82pjP10clYAY37uAABoNZF28g1P; _vwo_uuid_v2=D9AD361B1CD2A96A698283F36DD173130|5055df744b5c8d0e1fadf31d0e824aaa; ps=y; push_noty_num=0; push_doumail_num=0; as="https://movie.douban.com/tv/"; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1544933798%2C%22https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DjbQpIlp0yy0Y1woN8TJ0rY7AHngsGI8wR1l7Em_eGZznaMpRc8HlRoO7G453-J2m%26wd%3D%26eqid%3D8d5fe28f001d6578000000065c15bddc%22%5D; _pk_ses.100001.4cf6=*; __utma=30149280.1081739882.1544928739.1544928739.1544933799.2; __utmb=30149280.0.10.1544933799; __utma=223695111.1927962863.1544928740.1544928740.1544933799.2; __utmb=223695111.0.10.1544933799; _pk_id.100001.4cf6=674e3dd46599b683.1544928738.2.1544935392.1544929388.'
}
os.makedirs("movie")
#1.根据URL地址的规律,构造url_list
def get_url_list():
url_list =[url_temp.format(i*25) for i in range(0,10)]
return url_list
def run():
#1.根据URL地址的规律,构造url_list
url_list = get_url_list()
#2.发送请求,获取响应
for url in url_list:
#发送请求,获取响应
response = requests.get(
url=url, headers=headers
)
# 3.提取数据
#获取HTML对象
response.encoding = response.apparent_encoding
html = BeautifulSoup(response.text, features='lxml')
# print(html)
# print("--------------------------------------------------------------")
#提取每一块电影内容div的列表
film_div_list = html.find_all('div','item')
for film_div in film_div_list:
#获取评分
score = film_div.find('span','rating_num')
#将评分转换为浮点数
film_score =float(score.text)
if film_score >= 9:
# print(film_score)
#获取图片div对象
film_picture = film_div.find('div','pic')
img = film_picture.find('img')
if img:
#电影的中文名
film_Name = img.attrs.get('alt')
#相关图片的路径
picture_src = img.attrs.get('src')
print(film_Name)
print(picture_src)
#图片路径
picture_url = picture_src
picture_response = requests.get(url=picture_url)
# 4.保存
file_name = "movie\\" + score.text + film_Name + ".jpg"
#根据得到的响应将其以二进制格式打开一个文件只用于写入。
with open(file_name, 'wb') as f:
f.write(picture_response.content)#字节
f.close()#关闭资源
run()
代码执行结果: