分享三个python爬虫案例

news2024/11/25 5:42:04

一、爬取豆瓣电影排行榜Top250存储到Excel文件


        近年来,Python在数据爬取和处理方面的应用越来越广泛。本文将介绍一个基于Python的爬虫程序,用于抓取豆瓣电影Top250的相关信息,并将其保存为Excel文件。

获取网页数据的函数,包括以下步骤:
1. 循环10次,依次爬取不同页面的信息;
2. 使用`urllib`获取html页面;
3. 使用`BeautifulSoup`解析页面;
4. 遍历每个div标签,即每一部电影;
5. 对每个电影信息进行匹配,使用正则表达式提取需要的信息并保存到一个列表中;
6. 将每个电影信息的列表保存到总列表中。

        效果展示:


        源代码:

from bs4 import BeautifulSoup
import  re  #正则表达式,进行文字匹配
import urllib.request,urllib.error #指定URL,获取网页数据
import xlwt  #进行excel操作
 
 
def main():
    baseurl = "https://movie.douban.com/top250?start="
    datalist= getdata(baseurl)
    savepath = ".\\豆瓣电影top250.xls"
    savedata(datalist,savepath)
 
#compile返回的是匹配到的模式对象
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>')  # 找到评价人数 #\d表示数字
findInq = re.compile(r'<span class="inq">(.*)</span>')  # 找到概况
findBd = re.compile(r'<p class="">(.*?)</p>', re.S)  # 找到影片的相关内容,如导演,演员等
 
 
 
##获取网页数据
def  getdata(baseurl):
    datalist=[]
    for i in range(0,10):
        url = baseurl+str(i*25)     ##豆瓣页面上一共有十页信息,一页爬取完成后继续下一页
        html = geturl(url)
        soup = BeautifulSoup(html,"html.parser") #构建了一个BeautifulSoup类型的对象soup,是解析html的
        for item in soup.find_all("div",class_='item'): ##find_all返回的是一个列表
            data=[]  #保存HTML中一部电影的所有信息
            item = str(item) ##需要先转换为字符串findall才能进行搜索
            link = re.findall(findLink,item)[0]  ##findall返回的是列表,索引只将值赋值
            data.append(link)
 
            imgSrc = re.findall(findImgSrc, item)[0]
            data.append(imgSrc)
 
            titles=re.findall(findTitle,item)  ##有的影片只有一个中文名,有的有中文和英文
            if(len(titles)==2):
                onetitle = titles[0]
                data.append(onetitle)
                twotitle = titles[1].replace("/","")#去掉无关的符号
                data.append(twotitle)
            else:
                data.append(titles)
                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)
            bd = re.sub('/', " ", bd)
            data.append(bd.strip())  # 去掉前后的空格
            datalist.append(data)
    return  datalist
 
##保存数据
def  savedata(datalist,savepath):
    workbook = xlwt.Workbook(encoding="utf-8",style_compression=0) ##style_compression=0不压缩
    worksheet = workbook.add_sheet("豆瓣电影top250",cell_overwrite_ok=True) #cell_overwrite_ok=True再次写入数据覆盖
    column = ("电影详情链接", "图片链接", "影片中文名", "影片外国名", "评分", "评价数", "概况", "相关信息")  ##execl项目栏
    for i in range(0,8):
        worksheet.write(0,i,column[i]) #将column[i]的内容保存在第0行,第i列
    for i in range(0,250):
        data = datalist[i]
        for j in range(0,8):
            worksheet.write(i+1,j,data[j])
    workbook.save(savepath)
 
 
##爬取网页
def geturl(url):
    head = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                      "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36"
    }
    req = urllib.request.Request(url,headers=head)
    try:   ##异常检测
     response = urllib.request.urlopen(req)
     html = response.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 html
 
if __name__ == '__main__':
    main()
    print("爬取成功!!!")


二、爬取百度热搜排行榜Top50+可视化


 2.1  代码思路:

导入所需的库:



import requests
from bs4 import BeautifulSoup
import openpyxl

BeautifulSoup 库用于解析HTML页面的内容。

openpyxl 库用于创建和操作Excel文件。

 2.发起HTTP请求获取百度热搜页面内容:

url = 'https://top.baidu.com/board?tab=realtime'
response = requests.get(url)
html = response.content


这里使用了 requests.get() 方法发送GET请求,并将响应的内容赋值给变量 html。

        3.使用BeautifulSoup解析页面内容:

soup = BeautifulSoup(html, 'html.parser')


创建一个 BeautifulSoup 对象,并传入要解析的HTML内容和解析器类型。

   4.提取热搜数据:

hot_searches = []
for item in soup.find_all('div', {'class': 'c-single-text-ellipsis'}):
    hot_searches.append(item.text)


这段代码通过调用 soup.find_all() 方法找到所有 <div> 标签,并且指定 class 属性为 'c-single-text-ellipsis' 的元素。

然后,将每个元素的文本内容添加到 hot_searches 列表中。
 

  5.保存热搜数据到Excel:

workbook = openpyxl.Workbook()
sheet = workbook.active
sheet.title = 'Baidu Hot Searches'


使用 openpyxl.Workbook() 创建一个新的工作簿对象。

调用 active 属性获取当前活动的工作表对象,并将其赋值给变量 sheet。

使用 title 属性给工作表命名为 'Baidu Hot Searches'。

        6.设置标题:

sheet.cell(row=1, column=1, value='百度热搜排行榜—博主:郭wes代码')


使用 cell() 方法选择要操作的单元格,其中 row 和 column 参数分别表示行和列的索引。

将标题字符串 '百度热搜排行榜—博主:郭wes代码' 写入选定的单元格。

        7.写入热搜数据:

for i in range(len(hot_searches)):
    sheet.cell(row=i+2, column=1, value=hot_searches[i])


使用 range() 函数生成一个包含索引的范围,循环遍历 hot_searches 列表。

对于每个索引 i,使用 cell() 方法将对应的热搜词写入Excel文件中。

        8.保存Excel文件:

workbook.save('百度热搜.xlsx')


使用 save() 方法将工作簿保存到指定的文件名 '百度热搜.xlsx'。

        9.输出提示信息:

print('热搜数据已保存到 百度热搜.xlsx')


在控制台输出保存成功的提示信息。

源代码

 
import requests
from bs4 import BeautifulSoup
import openpyxl
 
# 发起HTTP请求获取百度热搜页面内容
url = 'https://top.baidu.com/board?tab=realtime'
response = requests.get(url)
html = response.content
 
# 使用BeautifulSoup解析页面内容
soup = BeautifulSoup(html, 'html.parser')
 
# 提取热搜数据
hot_searches = []
for item in soup.find_all('div', {'class': 'c-single-text-ellipsis'}):
    hot_searches.append(item.text)
 
# 保存热搜数据到Excel
workbook = openpyxl.Workbook()
sheet = workbook.active
sheet.title = 'Baidu Hot Searches'
 
# 设置标题
sheet.cell(row=1, column=1, value='百度热搜排行榜—博主:郭wes代码')
 
# 写入热搜数据
for i in range(len(hot_searches)):
    sheet.cell(row=i+2, column=1, value=hot_searches[i])
 
workbook.save('百度热搜.xlsx')
print('热搜数据已保存到 百度热搜.xlsx')

 

 

 可视化代码:

        

import requests
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
 
# 发起HTTP请求获取百度热搜页面内容
url = 'https://top.baidu.com/board?tab=realtime'
response = requests.get(url)
html = response.content
 
# 使用BeautifulSoup解析页面内容
soup = BeautifulSoup(html, 'html.parser')
 
# 提取热搜数据
hot_searches = []
for item in soup.find_all('div', {'class': 'c-single-text-ellipsis'}):
    hot_searches.append(item.text)
 
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
 
# 绘制条形图
plt.figure(figsize=(15, 10))
x = range(len(hot_searches))
y = list(reversed(range(1, len(hot_searches)+1)))
plt.barh(x, y, tick_label=hot_searches, height=0.8)  # 调整条形图的高度
 
# 添加标题和标签
plt.title('百度热搜排行榜')
plt.xlabel('排名')
plt.ylabel('关键词')
 
# 调整坐标轴刻度
plt.xticks(range(1, len(hot_searches)+1))
 
# 调整条形图之间的间隔
plt.subplots_adjust(hspace=0.8, wspace=0.5)
 
# 显示图形
plt.tight_layout()
plt.show()

 三、爬取酷狗音乐Top500排行榜

          从酷狗音乐排行榜中提取歌曲的排名、歌名、歌手和时长等信息

总体思路:

import requests  # 发送网络请求,获取 HTML 等信息
from bs4 import BeautifulSoup  # 解析 HTML 信息,提取需要的信息
import time  # 控制爬虫速度,防止过快被封IP
 
 
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36"
    # 添加浏览器头部信息,模拟请求
}
 
def get_info(url):
    # 参数 url :要爬取的网页地址
    web_data = requests.get(url, headers=headers)  # 发送网络请求,获取 HTML 等信息
    soup = BeautifulSoup(web_data.text, 'lxml')  # 解析 HTML 信息,提取需要的信息
 
    # 通过 CSS 选择器定位到需要的信息
    ranks = soup.select('span.pc_temp_num')
    titles = soup.select('div.pc_temp_songlist > ul > li > a')
    times = soup.select('span.pc_temp_tips_r > span')
    
    # for 循环遍历每个信息,并将其存储到字典中
    for rank, title, time in zip(ranks, titles, times):
        data = {
            "rank": rank.get_text().strip(),  # 歌曲排名
            "singer": title.get_text().replace("\n", "").replace("\t", "").split('-')[1],  # 歌手名
            "song": title.get_text().replace("\n", "").replace("\t", "").split('-')[0],  # 歌曲名
            "time": time.get_text().strip()  # 歌曲时长
        }
        print(data)  # 打印获取到的信息
 
if __name__ == '__main__':
    urls = ["https://www.kugou.com/yy/rank/home/{}-8888.html".format(str(i)) for i in range(1, 24)]
    # 构造要爬取的页面地址列表
    for url in urls:
        get_info(url)  # 调用函数,获取页面信息
        time.sleep(1)  # 控制爬虫速度,防止过快被封IP

 

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

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

相关文章

【计网】数据链路层笔记

【计网】数据链路层 数据链路层概述 数据链路层在网络体系结构中所处的地位 链路、数据链路和帧 链路(Link)是指从一个节点到相邻节点的一段物理线路(有线或无线)&#xff0c;而中间没有任何其他的交换节点。 数据链路(Data Link)是基于链路的。当在一条链路上传送数据时&a…

docker 拉取MySQL8.0镜像以及安装

目录 一、docker安装MySQL镜像 搜索images 拉取MySQL镜像 二、数据挂载 在/root/mysql/conf中创建 *.cnf 文件 创建容器,将数据,日志,配置文件映射到本机 检查MySQL是否启动成功&#xff1a; 三、DBeaver数据库连接 问题一、Public Key Retrieval is not allowed 问题…

【c++篇】:栈、队列、优先队列:容器世界里的秩序魔法 - stack,queue与priority_queue探秘

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;c篇–CSDN博客 文章目录 前言一.容器stack1.介绍2.成员函数3.模拟实现4.注意事项 二.容器qu…

实现uniapp-微信小程序 搜索框+上拉加载+下拉刷新

pages.json 中的配置 { "path": "pages/message", "style": { "navigationBarTitleText": "消息", "enablePullDownRefresh": true, "onReachBottomDistance": 50 } }, <template><view class…

无人机培训机型有哪些?CAAC考证选3类还是4类

无人机培训是一个涵盖多个方面的综合性过程&#xff0c;旨在培养具备无人机操作技能和相关知识的人才。 无人机培训机型 无人机培训通常涵盖多种机型&#xff0c;以满足不同领域和应用场景的需求。常见的无人机培训机型包括&#xff1a; 1. 多旋翼无人机&#xff1a;也称为多…

95.【C语言】数据结构之双向链表的头插,头删,查找,中间插入,中间删除和销毁函数

目录 1.双向链表的头插 方法一 方法二 2.双向链表的头删 3.双向链表的销毁 4.双向链表的某个节点的数据查找 5.双向链表的中间插入 5.双向链表的中间删除 6.对比顺序表和链表 承接94.【C语言】数据结构之双向链表的初始化,尾插,打印和尾删文章 1.双向链表的头插 方法…

[极客大挑战 2019]PHP 1

[极客大挑战 2019]PHP 1 审题 猜测备份在www.zip中&#xff0c;输入下载文件。 知识点 反序列化 解题 查看代码 看到index.php中包含了class.php,直接看class.php中的代码 查看条件 当usernameadmin&#xff0c;password100时输出flag 构造反序列化 输入select中&#…

C++面试基础知识:排序算法 C++实现

上周实习面试&#xff0c;手撕代码快排没写出来&#xff0c;非常丢人&#xff0c;把面试官都给逗笑了。 基础不牢&#xff0c;地动山摇&#xff0c;基础的算法还是要牢记于心的。 插入排序 分为有序区和无序区&#xff0c;每次从无序区中选出一个&#xff0c;放到有序区域中。…

yarn报错`warning ..\..\package.json: No license field`:已解决

出现这个报错有两个原因 1、项目中没有配置许可证 在项目根目录package.json添加 {"name": "next-starter","version": "1.0.0",# 添加这一行"license": "MIT", }或者配置私有防止发布到外部仓库 {"priv…

批量缓存模版

批量缓存模版 缓存通常有两种使用方式&#xff0c;一种是Cache-Aside&#xff0c;一种是cache-through。也就是旁路缓存和缓存即数据源。 一般一种用于读&#xff0c;另一种用于读写。参考后台服务架构高性能设计之道。 最典型的Cache-Aside的样例&#xff1a; //读操作 da…

亚信安全并购亚信科技交易正式完成

亚信安全与亚信科技联合宣布&#xff0c;亚信安全正式完成对亚信科技的控股权收购&#xff0c;由此&#xff0c;规模近百亿的中国最大的软件企业之一诞生&#xff01;双方将全面实现公司发展战略&#xff0c;以及优势能力与资源的深度融合&#xff0c;形成业界独有的“懂网、懂…

MybatisPlus入门(十)MybatisPlus-逻辑删除和多记录操作

一、Mybatis-Plus 多记录操作 按照主键删除多条记录 List<Long> ids Arrays.asList(new Long[]{2,3}) userDao.deleteBatchIds(ids); 示例代码如下: Testvoid testDelete(){//删除指定多条数据List<Long> list new ArrayList<>();list.add(14025513424818…

【css】overflow: hidden效果

1. 不添加overflow: hidden 1.1 效果 上面无圆角 1.2 代码 <template><view class"parent"><view class"child1">child1</view><view class"child2">child2</view></view></template><…

「QT」几何数据类 之 QPolygonF 浮点型多边形类

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「QT」QT5程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid…

架构篇(04理解架构的演进)

目录 学习前言 一、架构演进 1. 初始阶段的网站架构 2. 应用服务和数据服务分离 3. 使用缓存改善网站性能 4. 使用应用服务器集群改善网站的并发处理能力 5. 数据库读写分离 6. 使用反向代理和CDN加上网站相应 7. 使用分布式文件系统和分布式数据库系统 8. 使用NoSQL和…

OpenCV基础05_GUI和PyMsql

目录 一、PySimpleGUI 1、布局和窗口 2、文本框组件 3、视频处理 4、图片处理 二、pymsql 1、数据库操作 2、数据采集 3、人脸识别 一、PySimpleGUI PySimpleGUI 是一个用于简化 GUI 编程的 Python 包&#xff0c;它封装了多种底层 GUI 框架&#xff08;如 tkinter、…

ModuleNotFoundError: No module named ‘_ssl‘ centos7中的Python报错

报错 ModuleNotFoundError: No module named ‘_ssl’ 解决步骤&#xff1a; 1.下载openssl wget https://www.openssl.org/source/openssl-3.0.7.tar.gz tar -zxvf openssl-3.0.7.tar.gz cd openssl-3.0.72.编译安装 ./config --prefix/usr/local/openssl make make install3…

外呼系统只需这 3 种功能,电销效率快速提升

在当今竞争激烈的商业环境中&#xff0c;电销团队面临着诸多挑战。如何提高电销效率&#xff0c;成为了企业关注的焦点。今天&#xff0c;小编就给大家介绍&#xff0c;沃创云三种外呼系统功能&#xff0c;让你的电销效率快速提升。 一、智能拨号功能 传统的电销方式中&#x…

18. Mouse 鼠标、KeyBoard 键盘和 Action 消息事件处理

在本节的例子中&#xff0c;会自定义很多UI控件实现不同的事件响应&#xff0c;如下图所示&#xff1a; IOKit 事件框架 事件流程 OS X的事件依赖 IOKit 框架&#xff0c;事件发生后首先会传递到IOKit框架中处理&#xff0c;然后通知Window Server服务层处理&#xff0c;由…

C# 实现对指定句柄的窗口进行键盘输入的实现

在C#中实现对指定句柄的窗口进行键盘操作&#xff0c;可以通过多种方式来实现。以下是一篇详细的指南&#xff0c;介绍如何在C#中实现这一功能。 1. 使用Windows API函数 在C#中&#xff0c;我们可以通过P/Invoke调用Windows API来实现对指定窗口的键盘操作。以下是一些关键的…