Python---爬虫学习(详细注释/优化)

from bs4 import BeautifulSoup
import re  # 正则表表达式文字匹配
import urllib.request, urllib.error  # 指定url,获取网页数据
import xlwt
findlink = re.compile(r'a href="(.*?)">')  # 电影链接
findImageSrc = 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>')  # 人数
findInq = re.compile(r'<span class="inq">(.*)</span>')  # 概况
findBd = re.compile(r'<p class="">(.*?)</p>', re.S)  # 相关信息def main():# 定义基础URL,用于构造完整的URL来请求数据baseurl = "https://movie.douban.com/top250?start="# 调用getdata函数,传入基础URL,获取数据并返回datalist = getdata(baseurl)# 打印获取到的数据列表print(datalist)# 定义保存路径,将数据保存到movies.xls文件中savepath = ".\\movies.xls"  # 保存路径# 调用saveData函数,传入获取到的数据列表和保存路径,保存数据saveData(datalist, savepath)# 定义函数,用于发送HTTP请求并获取返回的HTML内容
def askURL(url):# 定义字典,作为HTTP请求的头部信息head = {"User-Agent": " Mozilla / 5.0(Linux;Android6.0;Nexus5 Build / MRA58N) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 99.0.4844.51Mobile Safari / 537.36"}# 根据给定的URL和头部信息,构造一个HTTP请求对象request = urllib.request.Request(url, headers=head)# 初始化一个空字符串,用于存储HTML内容html = ""try:# 使用urllib.request的urlopen函数,发送HTTP请求并获取响应对象response = urllib.request.urlopen(request)# 从响应对象中读取HTML内容,并解码为utf-8格式的字符串html = response.read().decode('utf-8')# 注释:打印HTML内容(实际代码被注释掉)# print(html)except urllib.error.URLError as e:# 如果发生URL相关的错误,处理异常if hasattr(e, "code"):# 打印异常中的错误代码print(e.code)if hasattr(e, "reason"):# 打印异常中的错误原因描述print(e.reason)return html  # 返回获取到的HTML内容# 爬取网页
def getdata(baseurl):# 初始化一个空的数据列表,用于存放解析出的数据datalist = []# 从基础URL开始,循环请求10次,每次请求偏移25for i in range(0, 10):url = baseurl + str(i * 25)  # 构造完整的URLhtml = askURL(url)  # 发送HTTP请求并获取HTML内容soup = BeautifulSoup(html, "html.parser")  # 使用BeautifulSoup解析HTML内容# 遍历解析出的每一个'div'标签,类名为"item"for item in soup.find_all('div', class_="item"):# 初始化一个空的数据列表,用于存放当前item的数据data = []item = str(item)  # 将item转换为字符串,以便进行正则表达式匹配# 寻找链接link = re.findall(findlink, item)[0]  # 使用正则表达式匹配链接data.append(link)  # 将链接添加到数据列表中# 寻找图片源地址image = re.findall(findImageSrc, item)[0]  # 使用正则表达式匹配图片源地址data.append(image)  # 将图片源地址添加到数据列表中# 寻找标题title = re.findall(findTitle, item)  # 使用正则表达式匹配标题if (len(title) == 2):  # 如果匹配到两个标题ctitle = title[0]  # 第一个标题data.append(ctitle)  # 将第一个标题添加到数据列表中otitle = title[1].replace("/", "")  # 第二个标题,移除其中的"/"字符data.append(otitle.strip())  # 将第二个标题添加到数据列表中,并移除首尾的空格else:  # 如果只匹配到一个标题data.append(title[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)  # 替换HTML中的换行标签为空格字符,这里可能需要考虑HTML转义字符的问题。# 并且这里只替换了一次,可能存在重复替换的问题。导演和主演的信息可能需要分别处理。bd = re.sub('/', " ", bd)  # 将"/"替换为空格字符,这里可能存在错误,因为"/ "在正则表达式中被错误地转义了
# 3 保存数据
# 定义saveData的函数,接收两个参数:datalist和savepath
def saveData(datalist, savepath):# 打印"save...",表示开始保存数据print("save...")# 创建一个Excel工作簿,设置编码为utf-8,样式压缩为0book = xlwt.Workbook(encoding="utf-8", style_compression=0)# 在工作簿中添加一个名为'movies'的工作表,设置cell_overwrite_ok为True,表示允许覆盖单元格内容sheet = book.add_sheet('movies', cell_overwrite_ok=True)# 定义一个包含列名的列表col = ("Movies_link", "Image_link", "Chinese_name", "Foreign_name", "Rating", "Reviews", "概况", "Summary")# 循环遍历col中的每一个元素,从0到7,将元素写入到工作表的第0行对应列中for i in range(0, 8):sheet.write(0, i, col[i])# 循环遍历datalist中的每一个元素,从0到249for i in range(0, 250):# 打印当前处理的条目序号print("第%d条" % (i + 1))# 从datalist中获取第i个元素,赋值给datadata = datalist[i]# 循环遍历data中的每一个元素,从0到7,将元素写入到工作表的第i+1行对应列中for j in range(0, 8):sheet.write(i + 1, j, data[j])# 将工作簿保存到指定的路径下,文件名为savepathbook.save(savepath)main()
print("爬取完毕!")

项目结构:

  1. 导入库
  2. 正则表达式:用于匹配网页中电影信息中的链接、图片标题等
  3. 主程序:调用get_data和save_data
  4. HTTP请求函数:ask_URL
  5. 获取电影数据函数:get_data à 把信息保存data_list中
  6. 保存数据函数:save_data

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

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

相关文章

Flutter组件GridView使用介绍

介绍 GridView 是 Flutter 中用于创建网格布局的滚动小部件。它可以创建多列布局&#xff0c;并且每个网格单元可以包含一个小部件。 GridView 提供了几种构造函数来创建不同类型的网格布局&#xff1a; GridView&#xff1a;最通用的构造函数&#xff0c;完全自定义网格布局…

C++系列十六:类与对象

一、引言 在C编程中&#xff0c;类&#xff08;Class&#xff09;和对象&#xff08;Object&#xff09;是核心概念&#xff0c;它们为程序员提供了一种组织和封装数据及操作的方法。类作为对象的模板或蓝图&#xff0c;定义了对象的属性和行为。对象则是类的实例&#xff0c;…

怎么在unity3D工程中导入Newtonsoft.Json

打开 Unity 编辑器。 转到菜单栏的 “Window”&#xff08;窗口&#xff09;选项&#xff0c;然后选择 “Package Manager”&#xff08;包管理器&#xff09; 在搜索框中输入 “Newtonsoft Json” 进行搜索。 注意&#xff1a;要选择Unity Registry 在搜索结果中&#xf…

triton教程1:前言、安装、跑官方例子与推荐视频

一、为啥用triton&#xff1f; 之前部署使用过tensorrt视频流硬解码前后处理硬件&#xff08;cuda&#xff09;加速&#xff0c;已经是工业化、商业化的一套标准流程了&#xff0c;现在面临的挑战是&#xff1a; 多模型管理&#xff08;一个小公司所有算法工程师的模型推理都…

GC6109——双通道5V低电压步进电机驱动芯片,低噪声、低振动,应用摄像机,机器人等产品中

GC6109是双通道5V低电压步进电机驱动器&#xff0c;具有低噪声、低振动的特点&#xff0c;特别适用于相机的变焦和对焦系统&#xff0c;万向节和其他精密、低噪声的STM控制系统。该芯片为每个通道集成了256微步驱动器。带SPl接口&#xff0c;用户可以方便地调整驱动器的参数。内…

SpringCloudAlibaba微服务架构实战派上下册技术交流!

另外我的新书RocketMQ消息中间件实战派上下册&#xff0c;在京东已经上架啦&#xff0c;目前都是5折&#xff0c;非常的实惠。 https://item.jd.com/14337086.html​编辑https://item.jd.com/14337086.html “RocketMQ消息中间件实战派上下册”是我既“Spring Cloud Alibaba微…

Nginx介绍与安装

目录 nginx服务 1、Nginx 介绍 2、为什么选择 nginx 3、IO多路复用 1、I/O multiplexing【多并发】 2、一个请求到来了&#xff0c;nginx使用epoll接收请求的过程是怎样的? 3、异步&#xff0c;非阻塞 4、nginx 的内部技术架构 5、yum安装部署nginx和配置管理 1.获取…

【Leetcode】242. 有效的字母异位词

【Leetcode】242. 有效的字母异位词 题目链接代码 题目链接 【Leetcode】242. 有效的字母异位词 代码 func isAnagram(s string, t string) bool {// 如果s串跟t串的长度不等&#xff0c;则一定为falseif len(s) ! len(t) {return false}// 创建map统计s串每个字符出现的个数…

spark相关

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;…

MySQL运维实战(3.3) 管理数据库(database)

作者&#xff1a;俊达 引言 数据库的创建和管理是构建可靠数据的关键&#xff0c;关系到所存储数据的安全与稳定。在 MySQL 这个强大的关系型数据库系统中&#xff0c;数据库的创建与管理需要精准的步骤和妥善的配置。下面&#xff0c;将深入探讨如何使用MySQL 来管理数据库&…

PHP企业物资管理系统源码带文字安装教程

PHP企业物资管理系统源码带文字安装教程 技术架构 主要框架 : PHP7.0 laravel5.4  mysql5.5.36 composer1.3.2(依赖管理) 前端 : jquery bootstrap jstree&#xff08;树形结构&#xff09; echart&#xff08;图表&#xff09; layer&#xff08;弹出层&#xff09; 企…

JavaScript递归技巧的前世今生:深入解析递归及其与堆栈的关系

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》 ​ ​ ✨ 前言 递归作为一种能够用简洁的方式定义复杂对象的编程技巧,在计算机科学中被广泛应用。它借助系…

OpenHarmony南向之LCD显示屏

OpenHarmony南向之LCD显示屏 概述 LCD&#xff08;Liquid Crystal Display&#xff09;驱动&#xff0c;通过对显示器上下电、初始化显示器驱动IC&#xff08;Integrated Circuit&#xff09;内部寄存器等操作&#xff0c;使其可以正常工作。 HDF Display驱动模型 LCD器件驱…

示例说明 Makefile 中的 $(@F),及其用法示例$$dir $@ $< $^ %.c

备忘一个不错的开源编辑器CudaText 下载网址&#xff1a; CudaText - Browse /release at SourceForge.net CudaText 主页&#xff1a; CudaText - Home 1&#xff0c;含义及验证 在 Makefile 中&#xff0c;$(F) 表示当前规则的目标文件名&#xff08;不包括路径部分&…

都2024年了,FP卖家还不知道AB站怎么玩?

自从开始写FP独立站各种运营技巧和黑科技的文章&#xff0c;经常都会有朋友来私V&#xff0c;询问怎么进行AB站跳转。 可能是现在平台对于FP商家的限制越来越多&#xff0c;再加上如今到处都是“内卷”的电商环境&#xff0c;让FP商家生存越来越艰难&#xff0c;今天就着重讲一…

【踩坑】JDK1.8 AudioSystem 无法关闭流的问题

文章目录 一、前言二、开始狼人杀嫌疑人1&#xff1a;嫌疑人2&#xff1a; 三、复盘Jdk8原生bug解决方法和原理解析 一、前言 做了一个基于文字转语言的小接口&#xff0c;想删除本地wav文件来着&#xff0c;结果发现删除不了。 很明显被占用了&#xff0c;还是被Java占用了……

Linux内核源码分析(强烈推荐收藏!)

前言&#xff1a;Linux内核是由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在1991年开始开发的。当时他为了得到一个可以运行UNIX操作系统的个人计算机&#xff0c;开始编写一个操作系统内核&#xff0c;并将其命名为Linux。随后&#xff0c;越来越多的开发者加入到项…

【论文】:ALOHA双手远程操作手臂

对于机器人来说&#xff0c;诸如穿扎带或插入电池等精细操作任务是众所周知的困难&#xff0c;因为它们需要精确度、接触力的仔细协调以及闭环视觉反馈。执行这些任务通常需要高端机器人、精确的传感器或仔细的校准&#xff0c;这些可能既昂贵又难以设置。学习能否使用低成本且…

计算机组成原理之计算机硬件发展和计算机系统的组成

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

算法第4版 第2章排序

综述&#xff1a;5个小节&#xff0c;四种排序应用&#xff0c;初级排序、归并排序、快速排序、优先队列 2.1.初级排序 排序算法模板&#xff0c;less(), exch(), 排序代码在sort()方法中&#xff1b; 选择排序&#xff1a;如升序排列&#xff0c;1.找到数组中最小的元素&am…