5.28-豆瓣电影信息爬取



程序实现目标

  • 用户输入电影类型,如【热门 最新 经典 华语】 可获得此分类排名 Top 100 电影信息(电影名 评分 封面链接)

程序实现工具

  1. 星愿浏览器 以chromium为内核,操作方法与 chorme类似
  2. 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

  1. 增加查找功能时,可以定义 Search 函数单独进行查找输入的处理
  2. self.url_list_temp 目前是字典形式,可以将 url 链接 放入字典处理
  3. python的 缩进 相比其他语言更加严格

参考文献

https://mp.weixin.qq.com/s/JmEQrJIlFlsPmymJlkNkcQ



原文地址 :https://www.jianshu.com/p/0c45f9bd3d67



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。