详细解读Python豆瓣电影Top250网页爬取(主要对re的运用&excel保存数据)//包括对库的简介

2023-05-16

  python里面有很多操作都类似于c语言,这里在爬取时主要需要注意用到的是for循环语句和各种库。
  个人认为python中主要还是对库的运用比较占大比例。
  (这里的软件版本是PyCharm 2020.3.2 x64)
  所以,在爬取前先把这里所需要用到的库展示出来:

from bs4 import BeautifulSoup   #网页解析,获取数据
import sys
import xlwt     #进行excel操作
import re       #正则表达式,进行文字匹配
import urllib   #制定url,获取网页数据
import urllib.request
import urllib.error
import sqlite3  #进行SQLite数据库操作	<---最后一个

  这里最后一个不在此次运用范围内,但是可以用其进行存储数据,本文选用的是用excel存储数据。

一. 整理架构

1,爬取网页
2,解析数据
3,保存数据

if _ _ name _ _ =="_ _ main _ _": 这个相当于int main()表示程序首先从这里进行,与此同时若是前面有顶格写的,则依旧是先从顶格写的开始写。
在这里插入图片描述
这里print()先执行,后面再执行if······语句里面的内容。


二.库的介绍

1. BeautSoup(bs4)

BeautifulSoup是将复杂HTML文档转换成一个复杂的树形结构,每个节点都是python对象,所有对象可以归纳为四种
–tag
–NavigableString
–BeautifulSoup
–Comment
原理:

from bs4 import BeautifulSoup
import re

file = open("./bs4使用.html","rb")#笔者已经事先在bs4使用.html文件夹里写入了指定网页的代码源
#file.write()
html = file.read().decode("utf-8")
bs = BeautifulSoup(html,"html.parser")#html.parser是解析器
print(bs.title)
print("****")
print(bs.title.string) #只打印里面的东西 即字符串

该代码显示:
在这里插入图片描述


提取指定内容:

print(bs.a)
print(bs.head)
print(type(bs.head)) #Tag 标签及其内容:只能拿到第一个

最终显示:
在这里插入图片描述


文档遍历,搜索,正则表达式搜索:
#文档遍历

print(bs.head.contents)
print(bs.head.contents[1])

#文档的搜索
#字符串过滤:会查找与字符串完全匹配的内容
t_list = bs.find_all("a") #标签必须为a,才输出

#正则表达式搜索:使用search()方法来匹配内容
t_list = bs.find_all(re.compile("a")) #只要包含a这个字母,就都输出


2.Urllib

制定URL,获取网页数据,访问url
内部原理:
(1).获得get请求(本文print用来查看该步骤是否进行或进行是否正确)

import urllib.request

#获取一个get请求

response = urllib.request.urlopen("http://www.baidu.com")#获取网页

print(response.read().decode('utf-8'))#decode('utf-8')解析代码,使中文也可以正常显示

其中这里urlopen,这个函数就是请求一个url的内容,这也是爬虫的第一步:网页请求,获取内容
(2).获取post请求

import urllib.parse#解析器
data = bytes(urllib.parse.urlencode({"hello":"world"}),encoding="utf-8") #转化成二进制,封装

response = urllib.request.urlopen("http://httpbin.org/post",data=data)
print(response.read().decode('utf-8'))

这里加了data参数就是以POST形式发送请求,否则就是GET方式了。


3.RE正则表达

用正则表达来获取想要的信息,提取数据。
这里用代码来展示:

import re

#No.1
pat=re.compile("AA")#AA是匹配对象,是正则表达式
flag=pat.search("454adaAAAAA") #此处是被校验的字符串
print(flag)

#No.2
m = re.search("ads","sdsjhiadsj")
print(m)

print(re.findall("a","dfuahhfuuafa"))
#校验所有的符合字符串,并形成列表['a','a','a']
print(re.findall("[a-z]","ahu54QFG5ds"))
#a到z符合的都可以
#如果是【a-z】   ['a', 'h', 'u', 'd', 's']
#如果是【a-z】+  ['ahu','ds']

print(re.sub("a","A","AFfsdfsAAaaff"))
#把字符串里的a用A替换

a=r"\aabd-\'"#这里r可以免去转义字符的符号
print(a)
#在正则表达式中,被比较的字符串在前面加r,不用担心转义字符的问题


4.xwlt存储数据

简单介绍

workbook  = xlwt.Workbook(encoding="utf-8") #创建workbook对象
worksheet = workbook.add_sheet('sheet1') #创建工作表
worksheet.write(0,0,'hello')    #写入数据,第一个是行,第二个表示列,第三个参数内容
workbook.save('student.xls')

这里举个例子,把99乘法表放入excel表格里:

import xlwt

workbook  = xlwt.Workbook(encoding="utf-8") #创建workbook对象
worksheet = workbook.add_sheet('sheet1') #创建工作表

for i in range(0,9):
    for j in range(0,i+1):
        worksheet.write(i,j,"%d * %d = %d"%(i+1,j+1,(i+1)*(j+1)))

workbook.save('99乘法表.xls')

可以在旁边的列表栏里找到建立的文档,打开后如下:

在这里插入图片描述

三.分步拆解

Ⅰ,主函数,囊括所有步骤

def main():
    baseurl = "https://movie.douban.com/top250?start="
    #1,爬取网页 & 2,解析数据
    datalist = getdata(baseurl)
    savepath = ".\\豆瓣电影Top250.xls"
    #3,保存数据
    savedata(datalist,savepath)

Ⅱ,爬取网页

def getdata(baseurl):
    datalist = []
    for i in range(0,10): #调用获取页面信息的网页·25页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)   #测试查看item的全部信息
            data = []  #保持一部电影的所有信息
            item = str(item) #把item变成字符串

            #获取影片详情链接
            link = re.findall(findlink,item)[0]     #re用来查找指定字符串”正则表达式“
            data.append(link)           #添加链接

            imgsrc=re.findall(findimgsrc,item)[0]       #添加图片
            data.append(imgsrc)

            titles=re.findall(findtitile,item)       #片名可能只有一个或中文名英文名都有
            if(len(titles) == 2):
                ctitle = titles[0]
                data.append(ctitle)
                etitile = titles[1].replace("/","") #去掉无关的符号
                data.append(etitile)
            else:
                data.append(titles[0])
                data.append(' ')     #外国名留空

            rating = re.findall(findrating,item)[0]
            data.append(rating)

            judge = re.findall(findjudge,item)[0]
            data.append(judge)

            inq = re.findall(findinq,item)           #inq可能不存在
            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) #把处理好的一部电影信息放入datalist

   # print(datalist)
    return datalist

Ⅲ,获取网页全部数据&判断是否进入网页是否成功

def askURL(url):        #列表
    #head 模拟浏览器的头部信息,向豆瓣服务器发送消息
    # 用户代理 表示告诉豆瓣服务器 我们是什么类型的机器·浏览器,防止被发现爬虫导致418

    head = {
        "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Mobile Safari/537.36"
    }

    request = urllib.request.Request(url,headers=head) #携带头部信息header去访问url
    html = ""
    #try查看访问响应,有部分网页有防爬虫措施
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode('utf-8')
        #print(html)
    except urllib.error.URLError as e:
        if hasattr(e,"b"):
            print(e.b)
        if hasattr(e,"n"):
            print(e.n)

    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('豆瓣电影top250.xls')

Ⅴ,分类获取数据(re)

#影片详情链接规则
findlink = re.compile(r'<a href="(.*?)">')     #创建正则表达式对象,表示规则(字符串模式)   ()表示组
#影片图片的链接
findimgsrc = re.compile(r'<img.*src="(.*?)"',re.S)#.*?表示出现一连串字符0或1次 re.S忽略里面出现换行的情况
#影片片名
findtitile = re.compile(r'<span class="title">(.*)</span>')
#影片评分
findrating=re.compile(r'<span class="rating_num" property="v:average">(.*)</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)



效果显示&待补充:

1,这里获取标题的地方有两个,因为部分作品既有中文名也有英文名;
2,在我们查看数据时发现有的作品有概述,有点没有,所以我们需要判断,因此插入了if语句。

最后的效果

在这里插入图片描述

若有不足,欢迎指出。

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

详细解读Python豆瓣电影Top250网页爬取(主要对re的运用&excel保存数据)//包括对库的简介 的相关文章

  • 更新 O-ComTool V2.1.0 串口调试助手

    FBI再次WARNING 测试时间较短 xff0c 有问题留言反馈哟 xff01 本次更新如下 实现更加人性化的暂停显示 上一版本中 xff0c 点击暂停显示时间过久 xff0c 就会出现卡顿的现象 xff0c 现在舍弃原来的方法 xff0
  • 什么是PN结

    FBI WARNING xff1a 本文是个人对PN结的理解 xff0c 若有错误 xff0c 望不吝赐教 xff0c 谢谢 xff01 二极管 三极管作为电路中的常见元件 xff0c 了解其工作原理是非常必要的 xff0c 但是在此之前
  • struct termios结构体详解

    一 数据成员 termios 函数族提供了一个常规的终端接口 xff0c 用于控制非同步通信端口 这个结构包含了至少下列成员 xff1a tcflag t c iflag 输入模式 tcflag t c oflag 输出模式 tcflag
  • PISSTV 树莓派慢扫描电视

    连接硬件 硬件 xff1a 树莓派 有驱动的摄像头 调试时需要usb wifi 配置树莓派 配置树莓派时要开启树莓派摄像头的支持 因为需要安装软件 xff0c 将树莓派连接到外网 测试摄像头拍照 使用raspistill命令进行拍照 ras
  • PID控制参数整定(调节方法)原理+图示+MATLAB调试

    序 首先最重要的是了解每个参数调节了系统响应的那些属性 xff0c 通过观察响应从而调节参数改变属性 PID的作用概述 xff1a 1 P产生响应速度和力度 xff0c 过小响应慢 xff0c 过大会产生振荡 xff0c 是I和D的基础 2
  • 关于VSCODE的插件 一

    官方API文档 1 要学好TypeScript 官方教程 1 1TypeScript是一门弱类型语言 强类型和弱类型主要是站在变量类型处理的角度进行分类的 这些概念未经过严格定义 xff0c 它们并不是属于语言本身固有的属性 xff0c 而
  • Pixhawk学习1——CMakeList.txt的解析

    在PX4的工程文件中 xff0c src modules下是具体的飞控代码 里面主要包含了传感器采集 姿态结算 姿态控制 xff0c 位置结算 位置控制等程序模块 在进行二次开发时 xff0c 需要添加的模块也是在这个文件夹里 每个文件夹里
  • Pixhawk学习2——uORB微对象请求代理及规则

    在Pixhawk中 xff0c 所有的功能被独立以进程模块为单位进行实现并工作 而每个进程模块都有一个 xff08 或多个 xff1f xff09 主题信息topic xff08 topic可以在Firmware msg里查看到所有的可使用
  • Pixhawk学习4——Commander相关分析

    Commander文件夹中的内容的作用主要为Pixhawk飞行模式的切换 该段程序会根据遥控器上的开关状态以及飞机飞行状态和各传感器性能状态进行判断 xff0c 最终实现飞行模式的切换 飞行模式切换主要涉及到以下几个文件 xff1a src
  • Pixhawk学习7——位置解算

    Pixhawk的位置解算分为两部分 xff0c 第一部分主要为传感器的数据获取 xff0c 而该部分最主要的就是GPS数据的提取 第二部分为与惯性器件之间的组合导航 组合导航的好处我就不用多说了 Pixhawk代码中目前主要有两处组合导航的
  • Pixhawk学习9——固定翼位置控制(L1控制+TECS总能量控制)

    本篇博客本来没有在之前的计划中 但由于最近项目上遇到了固定翼轨迹控制的一些问题 xff0c 所以就结合pix的程序学习总结了一下 不同于旋翼 xff0c 固定翼要实现位置变化必须得有一个轨迹变化过程 xff0c 因为它不像旋翼那样可以直接调
  • Pixhawk学习10.2——多旋翼位置控制

    10 1中介绍了目标位置点的计算逻辑 xff0c 知道下一时刻的目标位置后 xff0c 飞控需要根据当前位置进行计算 xff0c 依次得到期望速度 xff0c 期望拉力矢量 xff0c 期望姿态 至此就完成了多旋翼的位置控制 1 期望速度计
  • Http权威指南笔记(三)——HTTP报文

    前面介绍了URL是用于定位服务器上的资源 但是定位到资源后 xff0c 通过什么样的方式 规定来让客户端和服务端进行交流呢 xff1f 这就是本篇要介绍的HTTP报文 1 报文流 HTTP 报文是在 HTTP 应用程序之间发送的数据块 这些
  • 卡尔曼滤波算法详细推导

    一 预备知识 1 协方差矩阵 是一个维列向量 xff0c 是的期望 xff0c 协方差矩阵为 可以看出 协方差矩阵都是对称矩阵且是半正定的 协方差矩阵的迹是的均方误差 2 用到的两个矩阵微分公式 公式一 xff1a 公式二 xff1a 若是
  • 超声波测距实验

    超声波测距实验 超声波发射器向某一方向发射超声波 xff0c 在发射的同时开始计时 xff0c 超声波在空气中传播 xff0c 途中碰到障碍物就立即返回来 xff0c 超声波接收器收到反射波就立即停止计时 声波在空气中的传播速度为340m
  • Win7+Ubuntu双系统安装教程

    一 安装Win7 xff08 采用WinPE 43 gho xff09 1 设置笔记本电脑的BIOS xff0c 因为是安装win7 xff0c 最好采用Legacy模式 xff0c UEFI模式和win8 win10等以后的操作系统适配的
  • C语言——switch....case函数用法

    switch case函数用法 include lt stdio h gt int main int data char cdata printf 34 请输入一个数字 n 34 scanf 34 d 34 amp data switch
  • 计算机组成原理4(程序查询方式、程序中断方式、DMA方式及其I/O接口电路)

    文章目录 一 程序查询方式二 程序中断方式三 DMA方式 一 程序查询方式 1 程序查询方式的接口电路 2 符号说明 amp 与非门B工作触发器D完成触发器 3 程序查询工作过程 xff08 输入 xff09 xff08 1 xff09 当
  • FreeRTOS队列创建、发送和接收(备忘)

    目录 一 简介 1 1 开发环境 1 2 功能说明 二 动态创建队列 2 1 头文件声明 2 2 工程文件定义 2 3 创建队列 三 静态创建队列 3 1 头文件声明 3 2 工程文件定义 3 3 创建队列 四 写入消息 4 1 定义缓存变
  • 自动化面试题2

    一 画出 集电极开路 电压输出 互补输出 线性驱动输出 原理图 二 二进制 八进制 十进制以及十六进制之间的转化 三 PLC是什么 xff0c 并简述其优点和缺点 可编程控制器 xff08 Programmable Logic Contro

随机推荐

  • 【教程】win10 固态硬盘卡机卡死卡顿的真正原因!

    本人自从换了win10以后从来没卡过的电脑反正就是频繁的卡顿 xff0c 卡死 我试过以下方法 xff0c 有人说是微软拼音输入法的问题 xff0c 我直接更换了输入法 xff0c 这个效果是有 xff0c 卡机的频率降低了 xff0c 但
  • SizeChanged事件

    SizeChanged事件有的人不成功 xff0c 我也不知道什么原因不成功 xff0c 贴一下我成功的样子 xff01 xff01 xff01 Designer cs文件Form最下面放这个 this SizeChanged 43 61
  • centos7 安装docker

    sudo yum config manager add repo http mirrors aliyun com docker ce linux centos docker ce repo 出现以下内容则表示docker仓库配置成功 xff
  • 项目管理之启动:识别项目中的四类干系人

    干系人分析 指对项目干系人进行分析和归类 xff0c 有针对性地规划管理其核心诉求和期望 xff0c 让干系人可以更好地参与项目 xff0c 对项目产生积极影响 xff0c 从而更好地保障项目目标的成功达成 干系人分析的目的是什么呢 xff
  • 公平锁和非公平锁介绍,为什么要“非公平”?

    什么是公平和非公平 公平锁指的是按照线程请求的顺序 xff0c 来分配锁 xff1b 而非公平锁指的是不完全按照请求的顺序 xff0c 在一定情况下 xff0c 可以允许插队 但需要注意这里的非公平并不是指完全的随机 xff0c 不是说线程
  • 什么是自旋锁?自旋的好处和后果是什么呢?

    什么是自旋 自旋 可以理解为 自我旋转 xff0c 这里的 旋转 指 循环 xff0c 比如 while 循环或者 for 循环 自旋 就是自己在这里不停地循环 xff0c 直到目标达成 而不像普通的锁那样 xff0c 如果获取不到锁就进入
  • Bluez去掉绝对音量支持

    修改bluez 5 37中 profiles audio avrcp c 去掉改支持AVRCP EVENT VOLUME CHANGED 3816 session gt supported events 61 3817 1 lt lt AV
  • 为何每次用完 ThreadLocal 都要调用 remove()?——内存泄漏

    什么是内存泄漏 内存泄漏指的是 xff0c 当某一个对象不再有用的时候 xff0c 占用的内存却不能被回收 xff0c 这就叫作内存泄漏 因为通常情况下 xff0c 如果一个对象不再有用 xff0c 那么我们的垃圾回收器 GC xff0c
  • CountDownLatch 是如何安排线程执行顺序的?

    CountDownLatch xff0c 它是 JDK 提供的并发流程控制的工具类 xff0c 它是在 java util concurrent 包下 xff0c 在 JDK1 5 以后加入的 比如我们去游乐园坐激流勇进 xff0c 有的时
  • 发生死锁必须满足哪 4 个条件?

    要想发生死锁有 4 个缺一不可的必要条件 第 1 个叫互斥条件 xff0c 它的意思是每个资源每次只能被一个线程 xff08 或进程 xff0c 下同 xff09 使用 xff0c 为什么资源不能同时被多个线程或进程使用呢 xff1f 这是
  • 红黑树和二叉树有什么区别?

    红黑树和二叉树有什么区别 xff1f 什么是二叉树 xff1f 什么是红黑树 xff1f 二叉树 xff08 Binary Tree xff09 是指每个节点最多只有两个分支的树结构 xff0c 即不存在分支大于 2 的节点 xff0c 二
  • 什么是TCC?

    假设现在有一个电商系统 xff0c 里面有一个支付订单的场景 xff0c 那对一个订单支付之后 xff0c 我们需要做下面的步骤 更改订单的状态为 已支付 扣减商品库存 给会员增加积分 创建销售出库单通知仓库发货 业务场景有了 xff0c
  • Java 泛型机制介绍

    Java泛型这个特性是从JDK 1 5才开始加入的 xff0c 因此为了兼容之前的版本 xff0c Java泛型的实现采取了 伪泛型 的策略 xff0c 即Java在语法上支持泛型 xff0c 但是在编译阶段会进行所谓的 类型擦除 xff0
  • 云计算服务三层架构-IaaS-PaaS-SaaS解析

    IaaS 基础设施即服务 Infrastructure as a service 通即虚拟的硬件资源 xff0c 如虚拟的主机 存储 网络 安全等资源 用户无需购买服务器 网络设备和存储设备 xff0c 只需要通过网络租赁即可搭建自己的应用
  • Spring事务的传播属性和隔离级别

    事务传播行为 如果在开始当前事务之前 xff0c 一个事务上下文已经存在 xff0c 此时有若干选项可以指定一个事务性方法的执行行为 64 Transactional propagation 61 Propagation REQUIRED
  • MySQL有多少种常用的日志,有什么作用

    redo 重做日志 作用 xff1a 确保事务的持久性 xff0c 防止在发生故障 xff0c 脏读未写回磁盘 重启数据库会进入 redo log 执行 重做 xff0c 到达事务一致性 undo 回滚日志 作用 xff1a 保证数据的原子
  • 自动控制算法的学习笔记

    1 PID调试步骤 没有一种控制算法比PID调节规律更有效 更方便的了 现在一些时髦点的调节器基本源自PID 甚至可以这样说 xff1a PID调节器是其它控制调节算法的基础 为什么PID应用如此广泛 又长久不衰 xff1f 因为PID解决
  • stm32 应用实例—— USART 串口通讯

    stm32 应用实例 USART 串口通讯 1 基于寄存器 固件库编程的差异性2 完成STM32的USART窗口通讯程序4 重温C语言程序里全局变量 局部变量 堆 栈等概念 xff0c 并验证3 归纳出stm32的堆 栈 全局变量的分配地址
  • windows BDA driver (abstract)

    AVStream is a Microsoft provided multimedia class driver that supports video only streaming and integrated audio video s
  • 详细解读Python豆瓣电影Top250网页爬取(主要对re的运用&excel保存数据)//包括对库的简介

    python里面有很多操作都类似于c语言 xff0c 这里在爬取时主要需要注意用到的是for循环语句和各种库 个人认为python中主要还是对库的运用比较占大比例 xff08 这里的软件版本是PyCharm 2020 3 2 x64 xff