PYTHON爬取豆瓣电影Top 250排行榜

PYTHON爬取豆瓣电影Top 250排行榜

**爬虫是什么?**我觉得可以理解为:爬虫就是模拟浏览器发送网络请求,获取响应,接着按照规则提取数据的程序。
于是,我们可以按照上面的思路,实现对“豆瓣电影 Top 250”这样的排行榜页面进行爬取上面评分为9分以上电影的图片的一个爬虫。
下面图片就是我们要爬的其中一个页面:
PYTHON爬取豆瓣电影Top 250排行榜
一般步骤:
1.获取url:通过观察页面获取url地址的规律以及总的页码数:构造url地址的列表。
首先我们观察每一个页面的url地址的区别,发现它有以start=“(页面数-1)*25”这样的规律。
PYTHON爬取豆瓣电影Top 250排行榜
PYTHON爬取豆瓣电影Top 250排行榜
PYTHON爬取豆瓣电影Top 250排行榜
于是我们可以根据这个规律进行如下代码的构建:

#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标签
PYTHON爬取豆瓣电影Top 250排行榜
而li标签下又包含这样一个<div class="item"><div>
PYTHON爬取豆瓣电影Top 250排行榜
接下来我们继续看下去,下面是关于电影评分的部分。
PYTHON爬取豆瓣电影Top 250排行榜
于是我们继续用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')

接着再看到:
PYTHON爬取豆瓣电影Top 250排行榜
以及它下面的img标签:
PYTHON爬取豆瓣电影Top 250排行榜
因此我们可以这样做:

 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()

代码执行结果:
PYTHON爬取豆瓣电影Top 250排行榜
PYTHON爬取豆瓣电影Top 250排行榜
PYTHON爬取豆瓣电影Top 250排行榜