python使用request+xpath爬取豆瓣电影数据

2023-05-16

python使用request+xpath爬取豆瓣电影

  • 背景
    • 话不多说上代码

背景

由于毕设需要用到电影相关的数据,在网上想查找一个可以爬电影的教程,但是基本上所有的教程都是爬的豆瓣top250,并没有找到别的相关的教程,所以学习了一下使用python的request结合xpath爬取电影的相关信息。

话不多说上代码

我所爬取的url是:https://movie.douban.com/subject/25845392/,这个界面上的信息
在这里插入图片描述
如何获取到这个界面呢,我们首先来分析一下这个页面
豆瓣电影列表
在这里插入图片描述
通过查看url的参数发现,可能是使用了分页的功能,所以要想查看所有的电影需要看看这些参数都是什么,打开开发者工具查看network,发现每次点击加载更多的时候都会有新的请求,这个请求后面携带的参数start=140应该就是每次分页所请求到的数据,因此我们就获取到了电影展示列表的url和参数都是什么,每次的参数都是增加20

网页分析完了我们开始写代码

#首先需要引入我们所需要的库
import requests
from lxml import html
import json
import time
import random
import csv
import re
class douban:
	 def __init__(self):
        self.URL = 'https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=%E7%94%B5%E5%BD%B1'
        self.start_num = []
        self.movie_url = []
        # 从0开始到101结束,每次步长为20
        # 定义一个range方法,通过这个来更改start的参数,每次增加20
        for start_num in range(0, 20, 20):
            self.start_num.append(start_num)
        # 定义一下header模拟一下浏览器请求
        self.header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}

好了准备工作结束了,我们来写通过xpath获取到页面的内容

    def get_top250(self):
        for start in self.start_num:
            start = str(start)
            # 当前访问会获取到一个json数据格式,里面的url就是每一部电影的访问页面
            response = requests.get(self.URL, params={'start':start}, headers=self.header)
            page_content = response.content.decode()
            # 解析json数据
            json_data = json.loads(page_content)
            # 定义一个空列表,添加字典数据
            movieList = []
            # 循环这个json
            for key in range(len(json_data['data'])):
                # 定义一个字典保存每部电影的数据
                movieDict = {}
                # 获取到json中的url
                movie_url = json_data['data'][key]['url']
                # 从url中获取电影id
                rex = re.compile(r'subject/(\d+)')  # 编译正则表达式
                mo = rex.search(movie_url)  # 查询
                movie_id = mo.group(1)
                # 根据url获取网页html
                page_response = requests.get(movie_url, headers=self.header)
                page_result = page_response.content.decode()
                page_html = html.etree.HTML(page_result)
                # 片名
                movie_name = page_html.xpath('//*[@id="content"]/h1/span[1]/text()')
                # 导演
                director = page_html.xpath('//*[@id="info"]/span[1]/span[2]/a/text()')
                # 演员
                yanyuan = page_html.xpath('//*[@id="info"]/span[3]/span[2]')
                for yanyuanList in yanyuan:
                    yanyuanData = yanyuanList.xpath('././a/text()')
                # 剧情
                juqing = page_html.xpath('//*[@id="info"]/span[@property="v:genre"]/text()')
                # 国家
                country = page_html.xpath(u'//*[@id="info"]/span[contains(./text(), "制片国家/地区:")]/following::text()[1]')
                # 语言
                language = page_html.xpath('//*[@id="info"]/span[contains(./text(), "语言:")]/following::text()[1]')
                # 发布时间
                push_time = page_html.xpath('//*[@id="info"]/span[11]/text()')
                # 影片时常
                movie_long = page_html.xpath('//*[@id="info"]/span[13]/text()')
                # 评分
                pingfen = page_html.xpath('//*[@id="interest_sectl"]/div[1]/div[2]/strong/text()')
                # 封面地址
                conver_img = page_html.xpath('//*[@id="mainpic"]/a/img/@src')
                # 去除空格和换行符
                # 影片简介
                describe = page_html.xpath('normalize-space(//*[@id="link-report"]/span/text())')

下面我来讲一下如何通过xpath获取到标签的内容,非常简单只需要打开网页的开发者工具,然后找到所需要的信息的标签,例如制片国家
在这里插入图片描述
我们通过右键,copyxpath就能获取到这个标签所在的位置,但是我们会发现,我们要的数据并不是在span标签里的数据,而是在span标签后,这应该怎么办呢,

#我们可以通过contains来标记span包含什么信息的span标签,然后通过/following::text()[1]来获取不在标签中的信息
u'//*[@id="info"]/span[contains(./text(), "制片国家/地区:")]/following::text()[1]'

在这里插入图片描述
这样我们就能获取到了页面标签中的信息,下面就是如何存储的问题,详细看如下的完整代码吧,我保存的是csv格式的数据,非常简单直接定义好了就能存储。
完整代码如下:

import requests
from lxml import html
import json
import time
import random
import csv
import re

class Douban:

    def __init__(self):
        self.URL = 'https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=%E7%94%B5%E5%BD%B1'
        self.start_num = []
        self.movie_url = []
        # 从0开始到20结束,每次步长为20,如果想多爬数据只需要将中间的值调整即可
        for start_num in range(0, 20, 20):
            self.start_num.append(start_num)
        self.header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}

    def get_top250(self):
        for start in self.start_num:
            start = str(start)
            response = requests.get(self.URL, params={'start':start}, headers=self.header)
            page_content = response.content.decode()
            # 解析json数据
            json_data = json.loads(page_content)
            # 定义一个空列表,添加字典数据
            movieList = []
            for key in range(len(json_data['data'])):
                # 定义一个字典保存每部电影的数据
                movieDict = {}
                movie_url = json_data['data'][key]['url']
                # 从url中获取电影id
                rex = re.compile(r'subject/(\d+)')  # 编译正则表达式
                mo = rex.search(movie_url)  # 查询
                movie_id = mo.group(1)
                # 根据url获取网页html
                page_response = requests.get(movie_url, headers=self.header)
                page_result = page_response.content.decode()
                page_html = html.etree.HTML(page_result)
                # 片名
                movie_name = page_html.xpath('//*[@id="content"]/h1/span[1]/text()')
                # 导演
                director = page_html.xpath('//*[@id="info"]/span[1]/span[2]/a/text()')
                # 演员
                yanyuan = page_html.xpath('//*[@id="info"]/span[3]/span[2]')
                for yanyuanList in yanyuan:
                    yanyuanData = yanyuanList.xpath('././a/text()')
                # 剧情
                juqing = page_html.xpath('//*[@id="info"]/span[@property="v:genre"]/text()')
                # 国家
                country = page_html.xpath(u'//*[@id="info"]/span[contains(./text(), "制片国家/地区:")]/following::text()[1]')
                # 语言
                language = page_html.xpath('//*[@id="info"]/span[contains(./text(), "语言:")]/following::text()[1]')
                # 发布时间
                push_time = page_html.xpath('//*[@id="info"]/span[11]/text()')
                # 影片时常
                movie_long = page_html.xpath('//*[@id="info"]/span[13]/text()')
                # 评分
                pingfen = page_html.xpath('//*[@id="interest_sectl"]/div[1]/div[2]/strong/text()')
                # 封面地址
                conver_img = page_html.xpath('//*[@id="mainpic"]/a/img/@src')
                # 去除空格和换行符
                # 影片简介
                describe = page_html.xpath('normalize-space(//*[@id="link-report"]/span/text())')
                # 保存数据
                movieDict['movie_id'] = movie_id
                movieDict['movie_name'] = movie_name
                movieDict['director'] = director
                movieDict['yanyuanData'] = yanyuanData
                movieDict['juqing'] = juqing
                movieDict['country'] = country
                movieDict['language'] = language
                movieDict['push_time'] = push_time
                movieDict['movie_long'] = movie_long
                movieDict['pingfen'] = pingfen
                movieDict['conver_img'] = conver_img
                movieDict['describe'] = describe
                movieList.append(movieDict)
                print("正在执行中---", movie_url)
                self.random_sleep(1, 0.4)
        return movieList

    # 设置休眠函数,防止访问过快导致ip被封
    def random_sleep(self, mu, sigma):
        '''正态分布随机睡眠
        :param mu: 平均值
        :param sigma: 标准差,决定波动范围
        '''
        secs = random.normalvariate(mu, sigma)
        if secs <= 0:
            secs = mu  # 太小则重置为平均值
        print("休眠中。。。")
        time.sleep(secs)

    # 保存数据
    def writeData(self, movieList):
        with open('douban.csv', 'w', encoding='utf-8', newline='') as f:
            writer = csv.DictWriter(f, fieldnames=['movie_id', 'movie_name', 'director', 'yanyuanData', 'juqing',
                                                   'country', 'language', 'push_time', 'movie_long', 'pingfen',
                                                   'conver_img', 'describe'])
            writer.writeheader()
            for each in movieList:
                writer.writerow(each)

if __name__ == '__main__':
    movieList = []
    cls = Douban()
    movieList = cls.get_top250()
    cls.writeData(movieList)



···········
第一次写博客,可能写的不够好,如果文章有不懂的地方或者有疑问的地方可以留言或者加我qq:19686862360,我们一起学习进步

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python使用request+xpath爬取豆瓣电影数据 的相关文章

  • Ubuntu中安装配置JDK1.8

    JDK1 8安装配置 下载JDK 点击下载jdk 解压 将下载的压缩包解压到 opt目录下 span class token function tar span zxvf 下载的jdk压缩包名字 C opt 设置软链接 切换到 opt目录下
  • 使用Systemback制作Ubuntu20.04自定义系统镜像和系统备份

    为了方便我们自定义系统的镜像文件和系统下载的软件 xff0c 减轻再次部署的麻烦 xff0c 我们会制作镜像文件 本文就是利用Systemback来制作Ubuntu20 04自定义系统镜像和系统备份 查看网上的Systemback安装教程很
  • Key exchange was not finished, connection is closed.解决办法

    错误 利用java连接Linux服务器中碰到错误 xff1a Key exchange was not finished connection is closed xff0c 导致服务器的连接失败 xff0c 报错如下 原因 是ssh中的k
  • JAVA数据结构之顺序表、单向链表及双向链表的设计和API实现

    一 顺序表 顺序表在内存中是数组的形式存储 类名SequenceList构造方法SequenceList int capacity xff1a 创建容量为capacity的SequenceList对象成员方法1 public void cl
  • 单向链表快慢指针实际应用问题

    快慢指针 所谓快慢指针 xff1a 就是利用两个指针移动速度的不同来实现需求 xff0c 一般设置两个指针 xff0c 慢指针每次移动一格 xff0c 快指针每次移动两格 下面分享利用快慢指针解决中间值 链表环路以及环路入口的问题 中间值问
  • Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax 解决方法

    问题描述 Caused by java sql SQLSyntaxErrorException You have an error in your SQL syntax xff1b check the manual that corresp
  • 数组和JSON之间的格式转换

    数组和JSON之间的格式转换 主要代码 xff1a span class token keyword const span a span class token operator 61 span span class token const
  • Linux vncpasswd and passwd

    1 vncpasswd 功能 xff1a 使用vncpasswd命令可以创建或更改一个VNC的登录密码 xff0c 这将同时在用户的主目录下创建一个隐藏的目录 vnc xff0c 该目录内有一个文件passwd保存着VNC登录密码 语法 v
  • 修改运行中的docker容器的端口映射(简单、高效)

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言查看已经存在容器id关闭docker服务 xff0c 修改配置文件结束 xff0c 启动容器 前言 在docker run创
  • 人脸识别系列(十六):AMSoftmax

    论文链接 xff1a Additive Margin Softmax for Face Verification 2019 1 24 xff1a 注 xff1a 腾讯AI Lab的 CosFace Large Margin Cosine L
  • C语言:strtok()的用法。

    char strtok char str const char sep 1 sep参数是个字符串 xff0c 定义了用作分隔符的字符集合 xff1b 2 第一个参数指定一个字符串 xff0c 它包含了0个或者多个由sep字符串中一个或者多个
  • 日积月累

    目录 PYTHONUBUNTUTRACKINGNEURAL NETWORKMACHINE LEARNING PYTHON 有路径的地方要注意区别 和 ubuntu使用 分割文件夹 xff1b 对于别人的代码 xff0c 首先仔细阅读read
  • 19.RFID复习

    题型 填空题30分 xff08 一空一分 xff09 简答题30分 xff08 三道题 xff09 综合题40分 xff08 两道题 xff09 重点章节第一章 xff0c 第二章 xff08 见整理的练习题 xff09 xff0c 第四章
  • [Linux驱动]-----NAND FLASH

    一 NAND原理及硬件操作 C xff1a fopen xff0c fread xff0c fwrite APP open read write 1 txt 文件读写 文件系统 xff1a vfat ext2 ext3 yaffs xff0
  • sklearn中train_test_split里,参数stratify含义解析

    直接上代码 xff1a span class token keyword from span sklearn span class token punctuation span model selection span class toke
  • CentOS 7/8 预装的新型防火墙firewalld配置详解,

    前言 本文将会详细介绍CentOS 7 firewalld的来由 功能 常用命令 常用的案例及使用方法 希望能帮助读者全面了解firewalld xff0c 并能正确配置和使用它 centos7 firewalld firewalld与ip
  • webpack5常用配置

    该常用配置使用的npm包 xff1a span class token string property property 34 dependencies 34 span span class token operator span span
  • 【Linux】CentOS & Makefile

    目录 1 Ubuntu入门1 1 文件1 2 网络相关1 2 1 Linux网络相关概念和修改IP地址的方法IP信息临时修改ip地址NetworkManager修改主机名 1 2 2 关闭防火墙并设置开机开不启动firewalld临时和永久
  • HTTP请求报文(请求行、请求头、请求体)

    HTTP协议 1 简介 HTTP协议 xff08 Hyper Text Transfer Protocol xff0c 超文本传输协议 xff09 是用于从万维网 xff08 WWW World Wide Web xff09 服务器传输超文
  • Linux 下使用vscode调试C/C++程序记录

    Linux 下使用vscode调试C C 43 43 程序记录 本文主要介绍了 xff0c 在linux下使用vscode调试工程时的 xff0c 一些经验记录 基础配置 常用的配置方法网上的材料很多 xff0c 可以直接参照 链接 lin

随机推荐

  • 形状特征的提取

    物体和区域的形状是图像表达和图像检索中的另一重要的特征 但不同于颜色或纹理等底层特征 xff0c 形状特征的表达必须以对图像中物体或区域的划分为基础 由于当前的技术无法做到准确而鲁棒的自动图像分割 xff0c 图像检索中的形状特征只能用于某
  • c语言中全局变量在不同文件中的引用

    c语言中全局变量在不同文件中的引用 c语言中在某个文件中定义的全局变量可以在不同的文件中引用 xff0c 对数组和指针这两种全局变量在使用时必须要注意 xff0c 外部引用格式不正确时会出现编译或运行错误 下面通过不同的例子来说明数组和指针
  • Linux上MathGL的安装和使用

    Linux上MathGL的安装和使用 本人参考http mathgl sourceforge net doc en index html SEC Contents MathGL官网教程第一种方案在Ubuntu上对MathGL进行了编译安装
  • kvaser在linux下的二次开发

    kvaser在linux下的二次开发 linux下kvaser的驱动和SDK包安装 下载连接 http www kvaser cn software 7330130980754 V5 13 0 linuxcan tar gz 安装过程 解压
  • linux 交叉编译 C和C++

    linux 交叉编译 C和C 43 43 安装编译器Cmake中选择编译器编译运行注意 在ubuntu 中搭建arm交叉编译环境的过程记录 安装编译器 安装aarch64 linux gnu编译器 xff0c 可以参考 参考链接 安装完成后
  • vscode中git使用

    vscode中git使用 目的 xff1a 减少git的命令输出 xff0c 尽量使用vscode可视化完成日常代码提交管理 将该过程简单记录 创建文件 xff0c 并使用Vscode打开 vscode中打开终端 xff0c 并进行git的
  • 程序调试正常 运行错误排查

    调试正常 运行错误排查 检查是否生成core文件 输入ulimit a 第一行core file size 如果0 xff0c core文件不会生成 xff0c 需要设置 ulimit c unlimited 生成core文件 xff0c
  • linux 指定网卡发送UDP数据

    问题 xff1a 解决方法1 xff08 有权限要求 xff09 可以使用SO BINDTODEVICE绕过路由表查找 xff0c 解决该问题 注意 xff1a 该方法需要程序有cap net raw和cap net bind servic
  • TortoiseGit的安装与配置方法

    目录 1 为什么选择Git 效率 历史 TortoiseGit 简介 2 下载安装Git及Tortoisegit 3 Tortoisegit 配置 1 为什么选择Git 效率 很多人有一种习惯吧 xff0c 什么软件都要最新的 xff0c
  • Python isinstance() 函数

    描述 isinstance 函数来判断一个对象是否是一个已知的类型 xff0c 类似 type isinstance 与 type 区别 xff1a type 不会认为子类是一种父类类型 xff0c 不考虑继承关系 isinstance 会
  • uniapp开发微信小程序登录获取openid并解决code无效问题:invalid code

    场景 xff1a 实现微信支付的时候需要获取到openid openid需要在登录的时候用登录返回的code获取 1 登录获取code xff0c 用code获取openid uni login success function res l
  • CSS解决高度塌陷的方法

    一 什么是高度塌陷 当父元素不设置高度的时候靠子元素撑大 xff0c 也就是说子元素有多高 xff0c 父元素就有多高 xff0c 当子元素浮动后 xff0c 父元素就会高度塌陷 父元素高度塌陷后 xff0c 父元素下面的元素就会向上移动
  • mysql中如何查看sql语句是否用到索引,以及分析一条SQL的性能瓶颈

    mysql中如何查看sql语句是否用到索引 1 操作步骤 1 1 使用explain xff0c 放在sql前面 2 解释 我们只需要注意一个最重要的type 的信息很明显的提现是否用到索引 xff1a type结果值从好到坏依次是 xff
  • NoMachine配置

    NoMachine配置以及连接中遇到的问题 1 软件下载 软件官方下载网站 xff1a https www nomachine com xff08 软件下载缓慢 xff0c 请耐心等待下载完成 xff09 xff1b 本人上传了连个下载好的
  • 同星T1014在线回放设置

    同星T1014在线回放设置以及常见问题解决方法 1 同星T1014连接硬件进行在线数据回放 1 将同星T1014硬件连接到到电脑中 xff1b 2 打开TSMaster软件 xff0c 在通道选择选项中配置通道 xff0c 该硬件最大支持四
  • 虚拟串口VSPD和XCOM的下载+安装+使用

    虚拟串口VSPD和XCOM的下载 43 安装 43 使用 1 软件下载 对于上机位开发的伙伴来说 xff0c 上机位软件的调试尤为重要 xff0c 但是上机位软件的调试并不关心硬件 xff0c 只需要关注验证发送的数据的接收情况 xff0c
  • VCU功能控制

    VCU功能控制 VCU具有整车转矩管理 电池能量协调管理 电机功率协调管理 充电管理 故障诊断等功能 能够对上 下电时的高 低压控制逻辑进行管理 xff0c 能够根据驾驶员输入对需求转矩做出准确判断 xff0c 能够对车辆当前工况进行判断
  • 车速计算方法-附赠车速快速计算App

    车速计算的原理和方法 假设车辆配置为 xff1a 发动机WP10 310E40 xff0c 变速箱12JSD160TA 最高挡速比0 78 xff0c 车桥速比 xff1a 4 769 xff0c 轮胎11 00R20 滚动半径为0 527
  • 说说你对模块化的理解(CommonJS、AMD、CMD、ES Module)

    模块化的开发方式可以提高代码复用率 xff0c 方便进行代码的管理 通常一个文件就是一个模块 xff0c 有自己的作用域 xff0c 只向外暴露特定的变量和函数 目前流行的js模块规范有common js AMD CMD ES Module
  • python使用request+xpath爬取豆瓣电影数据

    python使用request 43 xpath爬取豆瓣电影 背景话不多说上代码 背景 由于毕设需要用到电影相关的数据 xff0c 在网上想查找一个可以爬电影的教程 xff0c 但是基本上所有的教程都是爬的豆瓣top250 xff0c 并没