利用BeautifulSoup爬取豆瓣高分电影排行榜

2023-10-30

写在前面

博主在学习爬虫之初,利用BeautifulSoup爬取了无锡美团美食数据,博客链接在这里,后来有童鞋指出代码不能运行,在一番讨论后发现是在使用get_text函数时返回的数据为空值,博主本来想弄明白到底是怎么回事的,于是用相同的代码爬了一遍豆瓣电影的数据,发现使用get_text函数没有出现任何问题,也就是说博主在写这篇博客时,也还没弄明白为啥get_text函数没法解析美团的网页代码。这个问题姑且放在一遍,在使用get_text函数时,我发现,豆瓣网页解析出来的数据是纯文本数据,而非json数据,也就是说,我用get_text函数解析出来数据除了用正则表达式外,很难把我想要的信息解析出来。
为了正确的解析这种数据,博主琢磨一番,弄明白了其中的一些细节,供大家参考。博主写博客的目的,主要是为了梳理自己当时遇到的问题,加深对代码的理解。

  • 编译环境:Python3.7
  • 编译器:Spyder

开始爬虫

请求头构造

请求头的构造在我之前的博客里已经提到,这里不再讲解,这个请求头在一段时间之前是无需加入的,但是现在爬豆瓣必须加入,否则状态码不等于200。

导入包

import requests
import time
import json
import csv
import pandas as pd
from bs4 import BeautifulSoup

爬虫主体

results = []
raw = 'https://movie.douban.com/top250'

for index in range(10): # 1
    url = raw + '?start=' + str(25*index) +'&filter='
    page = requests.get(url = url,headers = headers)
    time.sleep(2)
    print(index)
    print(page.status_code)
    if (page.status_code != 200): # 2
        print('error')
        continue
    page = requests.get(url = url, headers = headers)
    soup = BeautifulSoup(page.text,'lxml')
    div = soup.find_all('div', attrs={'class':'hd'}) # 3
    pageindex = []
    for i in div:
        name = i('span') # 4
        name1 = name[0].string.strip() # 5
        href = i('a') # 6
        lst = [] # 6
        lst.append(str(href)) # 6
        soup1 = BeautifulSoup(''.join(lst),'lxml') # 6
        href = soup1.a.attrs['href'] # 6
        name2 = name[1].string.strip('/\xa0') # 7
        pageindex.append([name1,name2,href])
        
    results.extend(pageindex)

对标注的地方进行解释:

  1. #1 总共有250部电影排名,每页上有25部电影,所以总共要访问10次网页,其中,初始页是’https://movie.douban.com/top250’,其他页(如第二页)在初始页网址后面加上’?start=25&filter='就行了,这里我并没有做初始页和其他页的区分,因为我试了一下,'https://movie.douban.com/top250’与’https://movie.douban.com/top250?start=0&filter='没有任何区别,都可以访问初始页;
  2. #2 判断网页状态是否正常,等于200则正常,如果不写请求头我这边的状态码是418,无法正常爬取;
  3. #3 用BeautifulSoup中的find_all函数找到div标签,但是div标签太多,总共有182个div标签,这样找出来肯定是不对的,仔细看网页代码,发现有用的信息都在’hd’里面,于是给find_all函数添加attrs参数attrs={‘class’:‘hd’},这样找出来的数据正好有25组;
    在这里插入图片描述
  4. #4 name = i(‘span’)是为了找出所有的span标签,看上面的截图,《肖生克的救赎》这部电影有4个span标签,第一个span标签是电影名,也是我们要找的第一个数据,第二个span标签是电影的外文名,我们也需要,第三个span标签是电影的别名,有的电影有,有的电影没有,我没有选取,第四个span标签是电影的播放状态,是否可播放;
  5. #5 把电影名标签取出来,并转化成字符,用strip函数删除字符串前面或后面的内容,这里未传递参数,表明作为整体取出。另外,也可以用split函数分割,split函数默认参数是按照空字符分割,包括空格、换行、制表符等;
  6. #6 找出所有的a标签,上图中我截出来的那部分,其实就一个a标签,里面有这部电影的豆瓣地址,但是这个标签的内容很长,除了豆瓣地址外,5中的span标签也在里面,所以我们这里不能像5一样直接索引获取我们想要的地址链接,做法有点复杂,具体步骤是:将a标签的所有内容转成字符串放入一个空列表,然后将这个列表用BeautifulSoup整理成网页代码的形式(看下面的图,s = str(soup1)),然后找出其中的href字段即可,这样就成功获取了想要的豆瓣地址链接;
    soup1 = BeautifulSoup(''.join(lst),'lxml')
  7. #7 在处理别名时,遇到一个问题,如果还用strip()函数不传参数,得到的结果是下面这样的,电影名前面多了/\xa0这几个字符,当然要处理掉。
    在这里插入图片描述

数据导出

output = pd.DataFrame(results,columns = ['电影名','别名','豆瓣链接'])
output.to_excel('豆瓣高分电影.xls')      

看结果:
在这里插入图片描述
至此完成所有爬取过程。

写在后面

博主也是爬虫初学,因为工作的原因,最早接触爬虫是要爬取gxb的网站获取相关数据,他们的网站其实没有这么复杂,但有个问题,很多情况下,数据都是贴成图片的形式展示的,所以爬取反而更费劲一点。但其实思路都是一样,首先是对网页发起请求,如果请求正常,则会给你返回一大串你想要的不想要的数据,那么接下来就是你从返回的数据中提取你想要的数据,如果返回的是json数据,那么很好,json.load()就行了,如果返回的是网页代码,那么通过beautifulsoup解析各种标签获取数据,基本是这个套路。
由于这些互联网企业都会不定期更新网页代码,所以爬虫代码不知道啥时候就不能用了,有空再来更新。

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

利用BeautifulSoup爬取豆瓣高分电影排行榜 的相关文章

  • 无法“安装”plpython3u - postgresql

    我正在尝试在 postgresql 中使用 python 语言 像这样的事情 create or replace function test a integer returns integer as if a 2 0 return even
  • 使用 pythonbrew 编译 Python 3.2 和 2.7 时出现问题

    我正在尝试使用构建多个版本的 python蟒蛇酿造 http pypi python org pypi pythonbrew 0 7 3 但我遇到了一些测试失败 这是在运行的虚拟机上 Ubuntu 8 04 32 位 当我使用时会发生这种情
  • 将 saxon 与 python 结合使用

    我需要使用 python 处理 XSLT 目前我正在使用仅支持 XSLT 1 的 lxml 现在我需要处理 XSLT 2 有没有办法将 saxon XSLT 处理器与 python 一起使用 有两种可能的方法 设置一个 HTTP 服务 接受
  • 将 Matplotlib 误差线放置在不位于条形中心的位置

    我正在 Matplotlib 中生成带有错误栏的堆积条形图 不幸的是 某些层相对较小且数据多样 因此多个层的错误条可能重叠 从而使它们难以或无法读取 Example 有没有办法设置每个误差条的位置 即沿 x 轴移动它 以便重叠的线显示在彼此
  • 使 django 服务器可以在 LAN 中访问

    我已经安装了Django服务器 可以如下访问 http localhost 8000 get sms http 127 0 0 1 8000 get sms 假设我的IP是x x x x 当我这样做时 从同一网络下的另一台电脑 my ip
  • 使用 matplotlib 绘制时间序列数据并仅在年初显示年份

    rcParams date autoformatter month b n Y 我正在使用 matpltolib 来绘制时间序列 如果我按上述方式设置 rcParams 则生成的图会在每个刻度处标记月份名称和年份 我怎样才能将其设置为仅在每
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 如何使用 Ansible playbook 中的 service_facts 模块检查服务是否存在且未安装在服务器中?

    我用过service facts检查服务是否正在运行并启用 在某些服务器中 未安装特定的软件包 现在 我如何知道这个特定的软件包没有安装在该特定的服务器上service facts module 在 Ansible 剧本中 它显示以下错误
  • 使用 on_bad_lines 将 pandas.read_csv 中的无效行写入文件

    我有一个 CSV 文件 我正在使用 Python 来解析该文件 我发现文件中的某些行具有不同的列数 001 Snow Jon 19801201 002 Crom Jake 19920103 003 Wise Frank 19880303 l
  • 根据列值突出显示数据框中的行?

    假设我有这样的数据框 col1 col2 col3 col4 0 A A 1 pass 2 1 A A 2 pass 4 2 A A 1 fail 4 3 A A 1 fail 5 4 A A 1 pass 3 5 A A 2 fail 2
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • 如何使用Python创建历史时间线

    So I ve seen a few answers on here that helped a bit but my dataset is larger than the ones that have been answered prev
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • 使用 Python 的 matplotlib 选择在屏幕上显示哪些图形以及将哪些图形保存到文件中

    我想用Python创建不同的图形matplotlib pyplot 然后 我想将其中一些保存到文件中 而另一些则应使用show 命令 然而 show 显示all创建的数字 我可以通过调用来避免这种情况close 创建我不想在屏幕上显示的绘图
  • 如何使用 Pycharm 安装 tkinter? [复制]

    这个问题在这里已经有答案了 I used sudo apt get install python3 6 tk而且效果很好 如果我在终端中打开 python Tkinter 就可以工作 但我无法将其安装在我的 Pycharm 项目上 pip

随机推荐

  • 二叉树的基本概念(定义,特性,存储结构等)

    一 二叉树的定义 二叉树 Binary Tree 是n n gt 0 个数据元素的有限集合 该集合可以为空 空二叉树 也可以由一个称为根 root 的元素及两个不相交的 被分别称为左子树和右子树的二叉树组成 如上图中含有7个结点 其中A是根
  • Python安装MySQL库详解(解决Microsoft Visual C++ 9.0 is required )

    前面我们介绍的Python网络爬虫通常将抓取的数据存储至TXT或CSV文件 而当数据量增加之时 就需要将其存储至本地数据库了 Python访问数据库需要对应的接口程序 我们可以把接口程序理解为Python的一个模块 它提供了数据库客户端的接
  • css3选择器如何选择同一个父级下的相同class的第一个元素 nth-child nth-of-type

    1 2 3 4 5 选择第一个类名 demo item nth of type 1 demo item nth child 1 选择最后一个类名 demo item last child 选择其中一个指定的类名 demo item nth
  • Window.open()方法参数详解

    1 最基本的弹出窗口代码 window open page html 2 经过设置后的弹出窗口 window open page html newwindow height 100 width 400 top 0 left 0 toolba
  • 这三个 Go 水平自测题,手写不出来还是先老实上班吧

    现在技术文章特别卷 啥啥底层都能给你分析的头头是道 但是分析的对不对要看作者水平 很有可能一个错 抄他的那些人也跟着错 因为我以前看源码的时候就经常感觉自己在两种状态下切换 懂了 娘咧漏看了 这个函数干啥的 八股文这个事儿 其实也特别考验面
  • JS 将一维数组转化为二维数组

    1 需求 遇到一个送礼物的需求 礼物有很多个数据 这里是61个 这里用到的是轮播图进行切换 但是后端返回的是一个礼物list 前端需要对数据进行处理 要求每8个为一个数组 组成二维数组 2 js 代码 let list giftList l
  • Vue +Vant 实现顶部搜索栏

    搜索栏组件源码 SearchBar vue
  • 2023 年 Pycharm 安装教程

    简介 PyCharm是一款Python IDE 其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具 比如 调试 语法高亮 Project管理 代码跳转 智能提示 自动完成 单元测试 版本控制等等 此外 该IDE提供了一些高
  • 基于ssm超市管理系统(程序+数据库+文档)046

    大家好 我是CZ淡陌 一名专注以理论为基础实战为主的技术博主 将再这里为大家分享优质的实战项目 本人在Java毕业设计领域有多年的经验 陆续会更新更多优质的Java实战项目 希望你能有所收获 少走一些弯路 向着优秀程序员前行 更多优质项目
  • VSCode连接远程服务器

    一 安装插件 安装remote ssh remote WSL remote Development这三个插件 二 配置路径ssh config文件的路径 点击remote ssh的小齿轮 gt extension settings 将本地的
  • PCB原理图导入的2种方法,小白也能看懂!

    PCB原理图导入的2种方法 小白也能看懂 原创 凡亿教育 凡亿PCB 凡亿PCB Altium Designer的原理图设计导入PCB 存在两种方法 一种是直接导入法 类似于Allegro的第一方导入 另一种是间接法 即网表对比导入法 一
  • Java代码规范检查插件

    代码规范工具是什么 大家应该都有过写完代码后review的情况 用于提高编码质量 尽早的发现问题 节约开发时间和成本 但review 这个过程往往要消耗 更多的开发资源 所以就出现 自动检测可能代码中存在的问题的工具 我们一般把这类工具称为
  • 服务器配置https协议,三种免费的方法

    一 Linux自签 OPENSSL生成SSL自签证书 第1步 生成私钥 执行如下命令生成一个RSA私钥 生成rsa私钥 des3算法 1024位强度 ssl key是秘钥文件名 openssl genrsa des3 out ssl key
  • Linux学习笔记(二)之权限的管理

    权限 1 Linux权限的概念 2 Linux权限管理 1 文件访问者的分类 2 文件的类型和访问的权限 设置权限 3 文件的默认权限 默认权限的计算 chown chgrp 4 Linux 授予普通用户root权限方法 5 粘滞位 完 1
  • 开发板免费申请 嵌入式开发板测评-电子工程世界

    开发板免费申请 嵌入式开发板测评 电子工程世界 http bbs eeworld com cn elecplay html
  • 在c++中为甚麽只有拷贝构造函数为何能直接引用其私有成员赋值

    因为拷贝构造函数是放在本身这个类里的 而类中的函数可以访问这个类的对象的所有成员 当然包括私有成员了 String const String other m data other x x是String类的私有成员 引用参数对象也是Strin
  • 访问网站出现Directory Listing Denied 是什么原因? http://www.west999.com/faq/list.asp?Unid=258

    如果访问网站出现提示 Directory Listing Denied This Virtual Directory does not allow contents to be listed 出现这个提示是指没有在您指定的目录找到默认首页
  • 关于Transformer中的位置编码

    位置编码 Positional Encoding 位置编码是在自然语言处理中 特别是在 Transformer 架构中使用的一个重要概念 Transformer 架构由于其自注意力机制 Self Attention Mechanism 的特
  • 解决有关Tensorflow1.15.0安装过程中出现的问题

    问题描述 在Anaconda中安装CPU版本的Tensorflow1 15 0 base C Users Queena gt conda create n TF1 15 python 3 7 TF1 15 C Users Queena gt
  • 利用BeautifulSoup爬取豆瓣高分电影排行榜

    写在前面 博主在学习爬虫之初 利用BeautifulSoup爬取了无锡美团美食数据 博客链接在这里 后来有童鞋指出代码不能运行 在一番讨论后发现是在使用get text函数时返回的数据为空值 博主本来想弄明白到底是怎么回事的 于是用相同的代