python实现简单爬虫和数据可视化-爬取豆瓣top250电影信息

2023-11-13

此内容全程跟着成都工业大学的李巍老师爬虫入门视频敲的代码,如有侵权删
观看的视频链接如下:李巍老师爬虫入门视频

整个爬虫可分为三个部分:

1. 爬取网页-“https://movie.douban.com/top250?start=0”

2.解析数据,打开自己要爬取的网站,进入开发者工具

3. 保存自己想要的数据到excel

4.具体代码如下,当出现403时,可以换一个"User-Agent"

#coding = utf-8
#version:python 3.6.0
#Tools:Pycharm 2018.11.27
_date_ = '2021/8/28 21:59'
_author_ = '小强'

from bs4 import BeautifulSoup #网页解析,获取数据
import re   #正则表达式,进行文字匹配
import  urllib.request, urllib.error  #制定URL,获取网页数据
import  xlwt    #进行Excel操作
import  sqlite3 #进行sqllite数据库操作

def main():
    baseurl = "https://movie.douban.com/top250?start=0"
    # #1.爬取数据
    datalist = getData(baseurl)
    savepath = ".//豆瓣电影Top250.xls"
    # print(datalist)

    #3.保存数据
    saveData(datalist,savepath)

    # askURL("https://movie.douban.com/top250")
findlink = re.compile(r'<a href="(.*?)">')#创建正则表达式对象,表示规则
#影片图片
findImgSrc = re.compile(r'<img.*src="(.*?)"',re.S) #re.S让换行符包含在字符中
#影片片名
findTitle = re.compile(r'span class="title">(.*?)</span>')
#找到评价人数
findJudge = re.compile(r'<span>(\d*)人评价</span>')
#找到概况
findInq = re.compile(r'<span class="inq">(.*)</span>')
#找到影片的相关内容
findBd = re.compile(r'<p class="">(.*)</p>',re.S)
findRating = re.compile(r'<span class="rating_num" property="v:average">.*</span>')

#爬取网页
def getData(baseurl):
    datalist = []
    for i in range(0,10):
        url = baseurl + str(i*25)
        html = askURL(url)

    #2.解析数据

        soup = BeautifulSoup(html,'html.parser')
        for item in soup.find_all('div',class_="item"):
            # print(item) #测试:
            data=[]
            item = str(item)

            link = re.findall(findlink,item)[0]
            data.append(link)
            imgSrc = re.findall(findImgSrc,item)[0]
            data.append(imgSrc)
            titles = re.findall(findTitle,item)  #片名可能只有一个中文名,没有外文名
            if(len(titles)==2):
                ctitle = titles[0]
                data.append(ctitle)
                otitle = titles[1].replace("/","")  #去掉无关的符号
                data.append(otitle)
            else:
                data.append(titles[0])
                data.append(' ')  #国外名字留空

            rating = re.findall(findRating,item)[0]#添加评分
            data.append(rating)

            judgeNum = re.findall(findJudge,item)[0]
            data.append(judgeNum)

            inq = re.findall(findInq,item)
            if len(inq) != 0:
                inq = inq[0].replace("。","") #去掉句号
                data.append(inq)
            else:
                data.append(" ")   #留空

            bd = re.findall(findBd,item)[0]
            bd = re.sub('<br(/s+)?/>(/s+)?'," ",bd)  #去掉<br/>
            bd = re.sub('/'," ",bd)
            data.append(bd.strip())  #去掉前后的空格

            datalist.append(data)

    print(datalist)
    return datalist




#得到指定一个URL的网页内容
def askURL(url):
    head = {
        "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36"
           # "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0",
           # "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/537.75.14",
           # "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)",
           # 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11',
           # 'Opera/9.25 (Windows NT 5.1; U; en)',
           # 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
           # 'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)',
           # 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12',
           # 'Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9',
           # "Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Ubuntu/11.04 Chromium/16.0.912.77 Chrome/16.0.912.77 Safari/535.7",
           # "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0 "
           # "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
    }
    #用户代理,表示告诉豆瓣服务器,我们是什么类型的机器,浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件)
    #当出现403时,可以换一个"User-Agent"
    request = urllib.request.Request(url, headers=head)
    html = ""
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
        print(html)
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reason"):
            print(e.reason)

    return html




#保存数据
def saveData(datalist,savepath):
    print('save...')
    book = xlwt.Workbook(encoding="utf-8",style_compression=0)  #创建workbook对象
    sheet = book.add_sheet('豆瓣电影Top250',cell_overwrite_ok=True)  #创建工作表
    col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息")
    for i in range(0,8):
        sheet.write(0,i,col[i])    #列名
    for i in range(0,250):
        print("第%d条"%i)
        data = datalist[i]
        for j in range(0,8):
            sheet.write(i+1,j,data[j])

    book.save(savepath)


if __name__ == "__main__":
    main()

5.得到的结果如下

在这里插入图片描述

6…爬虫有风险,用时需谨慎,之后发现自己再进去豆瓣top250出现异常,要我登录才可以访问,不过问题不大,之后自己也会注意这方面

在这里插入图片描述

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

python实现简单爬虫和数据可视化-爬取豆瓣top250电影信息 的相关文章

  • Lighttpd 和 cgi python

    我正在尝试通过 lighttpd 执行一些 python 脚本 但是当我尝试运行它时 我只得到一个要求我下载的空白文件 lighttpd conf server modules mod access mod alias mod access
  • 为什么从 Pandas 1.0 中删除了日期时间?

    我在 pandas 中处理大量数据分析并每天使用 pandas datetime 最近我收到警告 FutureWarning pandas datetime 类已弃用 并将在未来版本中从 pandas 中删除 改为从 datetime 模块
  • 元组有什么用?

    我现在正在学习 Python 课程 我们刚刚介绍了元组作为数据类型之一 我阅读了它的维基百科页面 但是 我无法弄清楚这种数据类型在实践中会有什么用处 我可以提供一些需要一组不可变数字的示例吗 也许是在 Python 中 这与列表有何不同 每
  • 将html数据解析成python列表进行操作

    我正在尝试读取 html 网站并提取其数据 例如 我想查看公司过去 5 年的 EPS 每股收益 基本上 我可以读入它 并且可以使用 BeautifulSoup 或 html2text 创建一个巨大的文本块 然后我想搜索该文件 我一直在使用
  • 使用 Python 从文本中删除非英语单词

    我正在 python 上进行数据清理练习 我正在清理的文本包含我想删除的意大利语单词 我一直在网上搜索是否可以使用像 nltk 这样的工具包在 Python 上执行此操作 例如给出一些文本 Io andiamo to the beach w
  • 跟踪 pypi 依赖项 - 谁在使用我的包

    无论如何 是否可以通过 pip 或 PyPi 来识别哪些项目 在 Pypi 上发布 可能正在使用我的包 也在 PyPi 上发布 我想确定每个包的用户群以及可能尝试积极与他们互动 预先感谢您的任何答案 即使我想做的事情是不可能的 这实际上是不
  • Pandas 日期时间格式

    是否可以用零后缀表示 pd to datetime 似乎零被删除了 print pd to datetime 2000 07 26 14 21 00 00000 format Y m d H M S f 结果是 2000 07 26 14
  • 立体太阳图 matplotlib 极坐标图 python

    我正在尝试创建一个与以下类似的简单的立体太阳路径图 http wiki naturalfrequent com wiki Sun Path Diagram http wiki naturalfrequency com wiki Sun Pa
  • 如何使用 Pandas、Numpy 加速 Python 中的嵌套 for 循环逻辑?

    我想检查一下表的字段是否TestProject包含了Client端传入的参数 嵌套for循环很丑陋 有什么高效简单的方法来实现吗 非常感谢您的任何建议 def test parameter a list parameter b list g
  • 在Python中连接反斜杠

    我是 python 新手 所以如果这听起来很简单 请原谅我 我想加入一些变量来生成一条路径 像这样 AAAABBBBCCCC 2 2014 04 2014 04 01 csv Id TypeOfMachine year month year
  • Python beautifulsoup 仅限 1 级文本

    我看过其他 beautifulsoup 得到相同级别类型的问题 看来我的有点不同 这是网站 我正试图拿到右边那张桌子 请注意表的第一行如何展开为该数据的详细细分 我不想要那个数据 我只想要最顶层的数据 您还可以看到其他行也可以展开 但在本例
  • Python,将函数的输出重定向到文件中

    我正在尝试将函数的输出存储到Python中的文件中 我想做的是这样的 def test print This is a Test file open Log a file write test file close 但是当我这样做时 我收到
  • 在 Sphinx 文档中*仅*显示文档字符串?

    Sphinx有一个功能叫做automethod从方法的文档字符串中提取文档并将其嵌入到文档中 但它不仅嵌入了文档字符串 还嵌入了方法签名 名称 参数 我如何嵌入only文档字符串 不包括方法签名 ref http www sphinx do
  • pyspark 将 twitter json 流式传输到 DF

    我正在从事集成工作spark streaming with twitter using pythonAPI 我看到的大多数示例或代码片段和博客是他们从Twitter JSON文件进行最终处理 但根据我的用例 我需要所有字段twitter J
  • Numpy - 根据表示一维的坐标向量的条件替换数组中的值

    我有一个data多维数组 最后一个是距离 另一方面 我有距离向量r 例如 Data np ones 20 30 100 r np linspace 10 50 100 最后 我还有一个临界距离值列表 称为r0 使得 r0 shape Dat
  • 如何在 Windows 命令行中使用参数运行 Python 脚本

    这是我的蟒蛇hello py script def hello a b print hello and that s your sum sum a b print sum import sys if name main hello sys
  • 如何在 pygtk 中创建新信号

    我创建了一个 python 对象 但我想在它上面发送信号 我让它继承自 gobject GObject 但似乎没有任何方法可以在我的对象上创建新信号 您还可以在类定义中定义信号 class MyGObjectClass gobject GO
  • python import inside函数隐藏现有变量

    我在我正在处理的多子模块项目中遇到了一个奇怪的 UnboundLocalError 分配之前引用的局部变量 问题 并将其精简为这个片段 使用标准库中的日志记录模块 import logging def foo logging info fo
  • 使用for循环时如何获取前一个元素? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 循环内的上一个和下一个值 https stackoverflow com questions 1011938 python previous and next values inside
  • cv2.VideoWriter:请求一个元组作为 Size 参数,然后拒绝它

    我正在使用 OpenCV 4 0 和 Python 3 7 创建延时视频 构造 VideoWriter 对象时 文档表示 Size 参数应该是一个元组 当我给它一个元组时 它拒绝它 当我尝试用其他东西替换它时 它不会接受它 因为它说参数不是

随机推荐

  • Servlet的会话管理机制

    一 Servlet的会话管理机制 根据设计 HTTP是一种无状态的协议 它意味着Web应用并不了解有关同一用户以前请求的信息 维持会话状态信息的方法之一是使用Servlet 或者JSP容器提供的会话跟踪功能 Servlet API规范定义了
  • angular 使用jwt token验证

    Created by 何欣澄 on 2017 5 28 0028 import Observable from rxjs Observable import Injectable from angular core import Http
  • Springboot项目中如何使用线程池

    目录 1 基于 ExecutorService 自定义线程池 Java 5中引入的 2 基于 ThreadPoolTaskExecutor 线程池的使用 Spring提供 以及监听线程池 3 自定义 ThreadPoolTaskExecut
  • Qt源码在32位arm上编译

    本文参考了 https blog csdn net console log article details 122855717 spm 1001 2014 3001 5506 1 下载qt everywhere src 5 12 11 ta
  • 【百度飞浆AI Studio】2、感性快速体验深度学习的线性归回预测房价

    百度学习原文地址 https www paddlepaddle org cn documentation docs zh 1 5 beginners guide basics fit a line README cn html import
  • 传输速率单位:比特Byte与字节Bit(不跳动)

    BIT Bit是英文中的单数 指1Bit 从2Bits开始后面就加s了 也就是Bit和Bits实际是同一个数量单位 一个是单数 一个是复数 Bit常用缩写是b 那么bps就是Bit per second 也就是指每秒传输多少个字节 也可写为
  • JAVA开发(Redis的主从与集群)

    现在web项目无处不在使用缓存技术 redis的身影可谓无处不在 但是又有多少项目使用到的是redis的集群 大概很多项目只是用到单机版的redis吧 作为缓存的一块 set get数据 用的不亦乐乎 但是对于高可用系统来说 数据集群是很有
  • Golang切片 slice类型

    因为在Golang中 数组的长度是固定的 一旦定义 在后续的操作中就不能更改长度 在某些实际使用场景中就不是那么的的方便 这个时候我们就可以使用切片 slice 类型 1 slice基本定义 Golang 的 slice 是一个引用类型 内
  • 西门子冗余服务器 系统拷贝,西门子(SIEMENS)冗余系统指南.pdf

    西门子冗余系统指南 Siemens redundancy system introduction 使用入门 Edition 2008 年 1 月 摘 要 本文主要介绍了 SIMATIC H 系统的基本组成 S7 400H 硬件冗余原理 S7
  • IDEA中设置网络代理

    需求 在IDEA中使用Database插件连接数据库时提示我需要安装插件依赖的数据库驱动 大家注意不要把这个数据库驱动和你的项目pom文件中导入的数据库驱动搞混了 不是一回事 选择下载后会自动去maven中央仓库下载 下载很慢很慢 而且好几
  • 使用GSM和Arduino作为GPS的替代品

    在本篇文章中 您将学习到如何通过GSM模块和Arduino而不是使用GPS创建导航系统 在本篇文章结束时 您将可以 解有关GSM模块以及如何将其与Arduino一起使用的更多信息 通过GSM模块制作导航系统 关于导航 在导航系统中 无线站定
  • ios mysql管理_App版本管理-iOS版本 - 数据库设计 - 数据库表结构 - 果创云

    数据库大全 App版本管理 iOS版本 来源 YesApi cn CREATE TABLE yesapi appver ios version id bigint 20 unsigned NOT NULL AUTO INCREMENT ap
  • 必看![文心一言] 中国版ChatGPT“狂飙,傲视诛仙

    最近 有一个叫作ChatGPT的技术产品在社交媒体上引起了热议 这是一种基于人工智能的聊天机器人 能够像人类一样进行对话 目前 它在国外的应用已经非常广泛 而中国地区也在迅速跟进 现在 中国版的文心一言来了 这是一款由百度开发的AI 采用了
  • Flutter 图片加载

    奇技指南 本篇文章你将获得 1 Flutter 图片加载方式 2 Flutter 图片加载源码实现流程 3 Flutter 图片加载优化点有什么 本文转载自奇舞移动技术 Flutter Image 在 Flutter 中 Image 是展示
  • 【PTA】整除光棍

    一 题目 光棍 说的是全部由1组成的数字 比如1 11 111 1111等 传说任何一个光棍都能被一个不以5结尾的奇数整除 比如 111111就可以被13整除 现在 你的程序要读入一个整数x 这个整数一定是奇数并且不以5结尾 然后 经过计算
  • linux中/etc/inittab文件分析

    一 什么是init init是Linux系统操作中不可缺少的程序之一 是一个由内核启动的用户级进程 内核启动 已经被载入内存 开始运行 并已初始化所有的设备驱动程序和数据结构等 之后 就通过启动一个用户级程序init的方式来启动其他用户级的
  • Java中float、double、long类型变量赋值添加f、d、L尾缀问题

    1 添加尾缀说明 我们知道Java在变量赋值的时候 其中float double long数据类型变量 需要在赋值直接量后面分别添加f或F d或D l或L尾缀来说明 其中 long类型最好以大写L来添加尾缀 因为小写l容易和数字1混淆 例如
  • 三分钟了解APS系统中生产计划排程模块的基本原理

    版权声明 本文为CSDN博主 weixin 45414340 的原创文章 遵循CC 4 0 BY SA版权协议 转载请附上原文出处链接及本声明 原文链接 https blog csdn net weixin 45414340 article
  • 【吴恩达-AIGC/ChatGPT提示工程课程】第九章 - 总结

    吴恩达 AIGC ChatGPT提示工程课程 第九章 总结 恭喜你完成了这门短期课程 总的来说 在这门课程中 我们学习了关于prompt的两个关键原则 编写清晰具体的指令 如果适当的话 给模型一些思考时间 你还学习了迭代式prompt开发的
  • python实现简单爬虫和数据可视化-爬取豆瓣top250电影信息

    此内容全程跟着成都工业大学的李巍老师爬虫入门视频敲的代码 如有侵权删 观看的视频链接如下 李巍老师爬虫入门视频 整个爬虫可分为三个部分 1 爬取网页 https movie douban com top250 start 0 2 解析数据