【Python爬虫实战篇】--爬取豆瓣电影信息(静态网页)

网站,:豆瓣电影 Top 250

爬取豆瓣前250电影的信息, 

F12打开网页控制台,查看网页元素,

 发现网页数据直接可以查看到,为静态网页数据,较为简单

目录

1.第一步使用urllib库获取网页

2.第二步使用BeautifulSoup和re库解析数据

2.1.定位数据块

​2.2.正则化匹配

3.第三步数据导出excel

完整代码:


1.第一步使用urllib库获取网页

观察网页url结构:

 首先,我们分析一下这个网页的结构,是一个还算比较规则的网页,每页25条,一共10页。

    我们点击第一页:url = https://movie.douban.com/top250?start=0&filter=

    我们点击第二页:url = 豆瓣电影 Top 250

    我们点击第三页:url = 豆瓣电影 Top 250

import urllib.request, urllib.error# 定义基础url,发现规律,每页最后变动的是start=后面的数字
baseurl = "https://movie.douban.com/top250?start="# 定义一个函数getHtmlByURL,得到指定url网页的内容
def geturl(url):# 自定义headers(伪装,告诉豆瓣服务器,我们是什么类型的机器,以免被反爬虫)headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}# 利用Request类来构造自定义头的请求req = urllib.request.Request(url, headers=headers)# 定义一个接收变量,用于接收html = ""try:# urlopen()方法的参数,发送给服务器并接收响应resp = urllib.request.urlopen(req)# urlopen()获取页面内容,返回的数据格式为bytes类型,需要decode()解码,转换成str类型html = resp.read().decode("utf-8")except urllib.error.URLError as e:if hasattr(e, "code"):print(e.code)if hasattr(e, "reason"):print(e.reason)return htmlprint(geturl(baseurl + "0"))

2.第二步使用BeautifulSoup和re库解析数据

2.1.定位数据块

 需要找到我们需要的信息在对应数据中的那个位置里面,可以在控制台定位,

我们需要获取的数据标签是 ‘div’,类名是‘item’,

from bs4 import BeautifulSoup# 定义一个函数,并解析这个网页
def analysisData(url):# 获取指定网页html = geturl(url)# 指定解析器解析html,得到BeautifulSoup对象soup = BeautifulSoup(html, "html5lib")# 定位我们的数据块在哪for item in soup.find_all('div', class_="item"):print(item)return ""analysisData(baseurl)

2.2.正则化匹配

现在获取到的块还是原始的css代码,创建正则化匹配筛选出我们需要的数据,

  • 提取详细链接:

 findLink = re.compile(r'<a href="(.*?)">')

  •  图片

 findImgSrc = re.compile(r'<img.*src="(.*?)"', re.S)

  •  片名

findTitle = re.compile(r'<span class="title">(.*)</span>')

import re# 定义正则对象获取指定的内容
# 提取链接(链接的格式都是<a href="开头的)
findLink = re.compile(r'<a href="(.*?)">')
# 提取图片
findImgSrc = re.compile(r'<img.*src="(.*?)"', re.S)  # re.S让 '.' 特殊字符匹配任何字符,包括换行符;
# 提取影片名称
findTitle = 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>')
# 提取简介
inq= re.compile(r'<p\s+class="quote">.*?<span>(.*?)</span>.*?</p>', re.S)
# 提取相关内容
findBd = re.compile(r'<div class="bd">\s*<p>\s*'r'导演: (.*?)\s*主演: (.*?)<br/>\s*'r'(\d{4}).*?/\s*(.*?)\s*/\s*(.*?)\s*</p>',re.S
)# 定义一个函数,并解析这个网页
def analysisData(baseurl):# 获取指定网页html = geturl(baseurl)# 指定解析器解析html,得到BeautifulSoup对象soup = BeautifulSoup(html, "html5lib")dataList = []# 定位我们的数据块在哪for item in soup.find_all('div', class_="item"):# item 是 bs4.element.Tag 对象,这里将其转换成字符串来处理item = str(item)# 定义一个列表 来存储每一个电影解析的内容data = []# findall返回的是一个列表,这里提取链接link = re.findall(findLink, item)[0]data.append(link)  # 添加链接img = re.findall(findImgSrc, item)[0]data.append(img)  # 添加图片链接title = re.findall(findTitle, item)# 一般都有一个中文名 一个外文名if len(title) == 2:# ['肖申克的救赎', '\xa0/\xa0The Shawshank Redemption']titlename = title[0] + title[1].replace(u'\xa0', '')else:titlename = title[0] + ""data.append(titlename)  # 添加标题pf = re.findall(findRating, item)[0]data.append(pf)pjrs = re.findall(findJudge, item)[0]data.append(pjrs)# 有的可能没有inqInfo = re.findall(inq, item)if len(inqInfo) == 0:data.append(" ")else:data.append(inqInfo[0])matches = re.findall(findBd,  item)if matches:  # 确保列表非空bd = matches[0]else:bd = None  # 或设定默认值/抛出异常# [('\n                            导演: 弗兰克·德拉邦特 Frank Darabont\xa0\xa0\xa0主演: 蒂姆·罗宾斯 Tim Robbins /...<br/>\n                            1994\xa0/\xa0美国\xa0/\xa0犯罪 剧情\n                        ', '\n\n                        \n                        ')]# bd[0].replace(u'\xa0', '').replace('<br/>', '')# bd = re.sub('<\\s*b\\s*r\\s*/\\s*>', "", bd[0])# bd = re.sub('(\\s+)?', '', bd)data.append(bd)dataList.append(data)return dataListprint(analysisData(baseurl))

3.第三步数据导出excel

因为处理的是一个页面的,所以需要写一个循环,


import xlwtdef main():allData = []for i in range(0, 250, 25):url = baseurl + str(i)dataList = analysisData(url)allData.extend(dataList)savepath = "C:\pythonProject\python爬虫\爬取豆瓣电影\豆瓣250.xls"book = xlwt.Workbook(encoding="utf-8", style_compression=0)  # 创建Workbook对象sheet = book.add_sheet("豆瓣电影Top250", cell_overwrite_ok=True)  # 创建工作表col = ("电影详情链接", "图片链接", "电影中/外文名", "评分", "评论人数", "概况", "相关信息")print(len(allData))for i in range(0, 7):sheet.write(0, i, col[i])for i in range(0, 250):print('正在保存第'+str((i+1))+'条')data = allData[i]for j in range(len(data)):sheet.write(i + 1, j, data[j])book.save(savepath)if __name__ == '__main__':main()

完整代码:

import urllib.request, urllib.error# 定义基础url,发现规律,每页最后变动的是start=后面的数字
baseurl = "https://movie.douban.com/top250?start="# 定义一个函数getHtmlByURL,得到指定url网页的内容
def geturl(url):# 自定义headers(伪装,告诉豆瓣服务器,我们是什么类型的机器,以免被反爬虫)headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'}# 利用Request类来构造自定义头的请求req = urllib.request.Request(url, headers=headers)# 定义一个接收变量,用于接收html = ""try:# urlopen()方法的参数,发送给服务器并接收响应resp = urllib.request.urlopen(req)# urlopen()获取页面内容,返回的数据格式为bytes类型,需要decode()解码,转换成str类型html = resp.read().decode("utf-8")except urllib.error.URLError as e:if hasattr(e, "code"):print(e.code)if hasattr(e, "reason"):print(e.reason)return htmlfrom bs4 import BeautifulSoup# 定义一个函数,并解析这个网页
def analysisData(url):# 获取指定网页html = geturl(url)# 指定解析器解析html,得到BeautifulSoup对象soup = BeautifulSoup(html, "html5lib")# 定位我们的数据块在哪for item in soup.find_all('div', class_="item"):print(item)return ""analysisData(baseurl)
import re# 定义正则对象获取指定的内容
# 提取链接(链接的格式都是<a href="开头的)
findLink = re.compile(r'<a href="(.*?)">')
# 提取图片
findImgSrc = re.compile(r'<img.*src="(.*?)"', re.S)  # re.S让 '.' 特殊字符匹配任何字符,包括换行符;
# 提取影片名称
findTitle = 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>')
# 提取简介
inq= re.compile(r'<p\s+class="quote">.*?<span>(.*?)</span>.*?</p>', re.S)
# 提取相关内容
findBd = re.compile(r'<div class="bd">\s*<p>\s*'r'导演: (.*?)\s*主演: (.*?)<br/>\s*'r'(\d{4}).*?/\s*(.*?)\s*/\s*(.*?)\s*</p>',re.S
)# 定义一个函数,并解析这个网页
def analysisData(baseurl):# 获取指定网页html = geturl(baseurl)# 指定解析器解析html,得到BeautifulSoup对象soup = BeautifulSoup(html, "html5lib")dataList = []# 定位我们的数据块在哪for item in soup.find_all('div', class_="item"):# item 是 bs4.element.Tag 对象,这里将其转换成字符串来处理item = str(item)# 定义一个列表 来存储每一个电影解析的内容data = []# findall返回的是一个列表,这里提取链接link = re.findall(findLink, item)[0]data.append(link)  # 添加链接img = re.findall(findImgSrc, item)[0]data.append(img)  # 添加图片链接title = re.findall(findTitle, item)# 一般都有一个中文名 一个外文名if len(title) == 2:# ['肖申克的救赎', '\xa0/\xa0The Shawshank Redemption']titlename = title[0] + title[1].replace(u'\xa0', '')else:titlename = title[0] + ""data.append(titlename)  # 添加标题pf = re.findall(findRating, item)[0]data.append(pf)pjrs = re.findall(findJudge, item)[0]data.append(pjrs)# 有的可能没有inqInfo = re.findall(inq, item)if len(inqInfo) == 0:data.append(" ")else:data.append(inqInfo[0])matches = re.findall(findBd,  item)if matches:  # 确保列表非空bd = matches[0]else:bd = None  # 或设定默认值/抛出异常# [('\n                            导演: 弗兰克·德拉邦特 Frank Darabont\xa0\xa0\xa0主演: 蒂姆·罗宾斯 Tim Robbins /...<br/>\n                            1994\xa0/\xa0美国\xa0/\xa0犯罪 剧情\n                        ', '\n\n                        \n                        ')]# bd[0].replace(u'\xa0', '').replace('<br/>', '')# bd = re.sub('<\\s*b\\s*r\\s*/\\s*>', "", bd[0])# bd = re.sub('(\\s+)?', '', bd)data.append(bd)dataList.append(data)return dataListimport xlwtdef main():allData = []for i in range(0, 250, 25):url = baseurl + str(i)dataList = analysisData(url)allData.extend(dataList)savepath = "C:\pythonProject\python爬虫\爬取豆瓣电影\豆瓣250.xls"book = xlwt.Workbook(encoding="utf-8", style_compression=0)  # 创建Workbook对象sheet = book.add_sheet("豆瓣电影Top250", cell_overwrite_ok=True)  # 创建工作表col = ("电影详情链接", "图片链接", "电影中/外文名", "评分", "评论人数", "概况", "相关信息")print(len(allData))for i in range(0, 7):sheet.write(0, i, col[i])for i in range(0, 250):print('正在保存第'+str((i+1))+'条')data = allData[i]for j in range(len(data)):sheet.write(i + 1, j, data[j])book.save(savepath)if __name__ == '__main__':main()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/79901.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Unity知识点详解】Unity中泛型单例的使用,兼容WebGL

今天来讲下Unity中泛型单例的使用&#xff0c;包含普通单例和继承MonoBehaviour的单例。重点是需要两种泛型单例兼容WebGL平台&#xff0c;话不多说直接开始。 泛型单例的设计目标 作为泛型单例&#xff0c;需要实现以下几个目标&#xff1a; 全局唯一&#xff0c;在程序的整个…

Python进程与线程的深度对比

一、核心概念对比 1. 进程&#xff08;Process&#xff09; 操作系统级独立单元&#xff1a;每个进程拥有独立的内存空间&#xff08;堆、栈、代码段&#xff09; 资源隔离性&#xff1a;崩溃不影响其他进程 多核并行&#xff1a;可充分利用多核CPU资源 2. 线程&#xff0…

Django 入门指南:构建强大的 Web 应用程序

什么是 Django&#xff1f; Django 是一个开源的高层次 Python Web 框架&#xff0c;旨在快速开发安全且可维护的网站。它通过简化常见的 Web 开发任务&#xff0c;帮助开发者专注于开发应用的核心功能。Django 实现了“快速开发”和“尽量少的重复”的理念&#xff0c;提供了…

ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(显示输出类外设之IS31FL3216)

目录 ESP-ADF外设子系统深度解析&#xff1a;esp_peripherals组件架构与核心设计&#xff08;显示输出类外设之IS31FL3216&#xff09;简介模块概述功能定义架构位置核心特性 IS31FL3216外设分析IS31FL3216外设概述IS31FL3216外设层次架构图 IS31FL3216外设API和数据结构外设层…

【计算机网络 | 第三篇】常见的网络协议(二)

没有看过我写的关于网络协议的第一篇博客可以看【计算机网络 | 第二篇】常见的通信协议&#xff08;一&#xff09;-CSDN博客 TCP的三次握手和四次挥手 TCP三次握手 三次握手是TCP协议建立可靠连接的过程&#xff0c;目的是确保客户端和服务端双方的双向通信能力正常&#x…

HAL库(STM32CubeMX)——高级ADC学习、HRTIM(STM32G474RBT6)

系列文章目录 文章目录 系列文章目录前言存在的问题HRTIMcubemx配置前言 对cubemx的ADC的设置进行补充 ADCs_Common_Settings Mode:ADC 模式 Independent mod 独立 ADC 模式,当使用一个 ADC 时是独立模式,使用两个 ADC 时是双模式,在双模式下还有很多细分模式可选 ADC_Se…

Unity接入安卓SDK(3)厘清Gradle的版本

接入过程中&#xff0c;很多人遇到gradle的各种错误&#xff0c;由于对各种gradle版本的概念不甚了了&#xff0c;模模糊糊一顿操作猛如虎&#xff0c;糊弄的能编译通过就万事大吉&#xff0c;下次再遇到又是一脸懵逼。所以我们还是一起先厘清gradle的版本概念。 1 明晰概念 …

python-67-基于plotly的绘图可视化和智能推荐图表

文章目录 1 各种图表的适用场景1.1 面积图1.2 饼图1.3 散点图1.3.1 散点1.3.2 散点加线1.4 折线图1.5 箱线图1.5.1 不同类别的箱线图1.5.2 一个变量的箱线图1.5.3 多个变量的箱线图1.6 小提琴图1.6.1 不同类别的小提琴图1.6.2 一个变量的小提琴图1.7 直方图1.7.1 直方图1.7.2 分…

Spring AI MCP

MCP是什么 MCP是模型上下文协议&#xff08;Model Context Protocol&#xff09;的简称&#xff0c;是一个开源协议&#xff0c;由Anthropic&#xff08;Claude开发公司&#xff09;开发&#xff0c;旨在让大型语言模型&#xff08;LLM&#xff09;能够以标准化的方式连接到外…

c++_csp-j算法 (3)

弗洛伊德算法&#xff08;Floyd&#xff09; Floyd算法又称为插点法&#xff0c;是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法&#xff0c;与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特弗洛伊…

QT常见输入类控件及其属性

Line Edit QLineEdit用来表示单行输入框&#xff0c;可以输入一段文本&#xff0c;但是不能换行 核心属性&#xff1a; 核心信号 信号 说明 void cursorPositionChanged(int old,int new) 当鼠标移动时发出此型号&#xff0c;old为先前位置&#xff0c;new为新位置 void …

【k8s系列1】一主两从结构的环境准备

环境准备 虚拟机软件准备及安装&#xff0c;这里就不详细展开了&#xff0c;可以看文章:【一、虚拟机vmware安装】 linux环境准备及下载&#xff0c;下载镜像centOS7.9&#xff0c;以前也有写过这个步骤的文章&#xff0c;可以看&#xff1a;【二、安装centOS】 开始进入正题…

【C++类和数据抽象】类的作用域

目录 一、类的作用域基本概念 1.1 什么是类的作用域 1.2 作用域层次体系 1.3 类作用域的特点 1.4 基本访问规则 二、访问控制三剑客 2.1 public&#xff1a;开放接口 2.2 private&#xff1a;数据封装 2.3 protected&#xff1a;继承通道 2.4 跨作用域访问示例 三…

opencv图片颜色识别,颜色的替换

图片颜色识别 1. RGB颜色空间2. 颜色加法2.1使用numpy对图像进行加法2.2使用opencv加法&#xff08;cv2.add&#xff09; 3 颜色加权加法&#xff08;cv2.addWeighted()&#xff09;4. HSV颜色空间5. 制作掩膜4. 与运算&#xff08;cv2.bitwise_and&#xff09;5.颜色的替换7 R…

ADC数据不稳定的解决方案

问题如图&#xff1a; 解决方案&#xff1a;上图第一个通道后来接入GND&#xff0c;就稳定了 上图第一个通道后来接入VCC&#xff0c;就稳定了

Spark(18)Yarn-概述

Hadoop三大核心组件&#xff1a;HDFS、MapReduce和YARN 一&#xff09;Yarn的概念 YARN(Yet Another Resource Negotiator,另一种资源协调者)是一个通用资源管理系统和调度平台&#xff0c;可为上层应用提供统一的资源管理和调度。它的引入为集群在利用率&#xff0c;资源统一管…

Flowith AI,解锁下一代「知识交易市场」

前言 最近几周自媒体号都在疯狂推Manus&#xff0c;看了几篇测评后&#xff0c;突然在某个时间节点&#xff0c;在特工的文章下&#xff0c;发现了很小众的Flowith。 被这段评论给心动到&#xff0c;于是先去注册了下账号。一翻探索过后&#xff0c;发现比我想象中要有趣的多&…

Maxscript调用Newtonsoft.Json解析Json

Maxscript调用Newtonsoft.Json解析Json_newtonsoft.json maxscript-CSDN博客

搭建用友U9Cloud ERP及UAP IDE环境

应用环境 Microsoft Windows 10.0.19045.5487 x64 专业工作站版 22H2Internet Information Services - 10.0.19041.4522Microsoft SQL Server 2019 - 15.0.2130.3 (X64)Microsoft SQL Server Reporing Services 2019 - 15.0.9218.715SQL Server Management Studio -18.6 laster…

github新建一个远程仓库并添加了README.md,本地git仓库无法push

1.本地git仓库与远程仓库绑定 2.push时报错&#xff0c;本地的 main 分支落后于远程仓库的 main 分支&#xff08;即远程有更新&#xff0c;但你本地没有&#xff09;&#xff0c;需要拉取远程的仓库--->在merge合并&#xff08;解决冲突&#xff09;--->push 3.但是git …