Python:爬虫获取微信公众号里面的表格内容+整理数据导出表格

前言

需求:统计深圳市各大剧场的钢琴表演节目的信息数据

有位朋友,他兼职了某个研究院;给他了一个任务就是统计深圳市内各大剧场的钢琴表演节目信息的数据。这件事情让他头疼,哈哈哈哈 跟我说了以后,我立刻想到用python来解决一下;

我记得,深圳艺文惠公众号 把每周的各大剧场的演出表演总结,并且放到他们的公众号推文里面的。 我平时比较喜欢文艺的东西,没有去过几次,但是常常关注 哈哈哈哈; 现在用上了,这个是我们幸运的点,我们很顺利的找到了数据源(从哪里获取这些数据); 而且这些都是整理好的,直接获取即可。 这里不得不表扬深圳艺文惠公众号,哈哈哈哈;

于是,我打开推文的URL地址,在浏览器中按F12键,打开HTML结构,分析了一波后就有了思路;

思路:

第一步:模拟浏览器请求URL地址
第二步:获取HTML文档结构
第三步:根据HTML结构,定位找到想要的内容
第四步:获取到的内容根据“关键字”筛选数据
第五步:收集每周推文的链接,整理汇总到表格中
第六步:读取推文链接,重复运行上面的五个步骤
第七步:筛选的数据写入到表格中,并且导出


实现

第一步:模拟浏览器请求URL地址
第二步:获取HTML文档结构


import requests # 导入请求库def getHtml(url):# 请求头headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'}# 发送GET请求获取网页内容response = requests.get(url, headers=headers)response.encoding = 'utf-8'return response.text # 返回HTML内容

第三步:根据HTML结构,定位找到想要的内容

我们首先分析HMTL结构内容:

image.png

从图中可以看到,我们想要获取的数据,在 <table> 面的 <tody>下面的每一个 <tr>里面 因此在 items = doc.xpath('//table//tbody//tr')中用xpath语法来定位到了我们的所说的每个<tr> 内容,并且把他们存储到items
然后我们循环items,获取到每个<tr> ,我们再从每个<tr> 中定位到我们获取到的内容 image.png

我们看图片可以得出,我们想要的内容在<tr> 下面的每一项<td>
<td> 下面<p> 下面<span> 中有我们想要的那个内容,终于我们获取到了。 因此 text = item.xpath('.//td//p//span//text()')中定位每个<td><span> 标签; 每个<td> 里面的结构都一样的~
获取到的内容保存text变量中,然后再做一些处理: 有时候获取的内容是空的,因此我们做了判断,有值再添加resData数组中,否则不处理; 循环结束后返回resData数组

但是获取数据后发现了一个问题,获取的数据中大部分情况下:
['深圳音乐厅', '匠心韶华•', '2023', '深圳“一带一路”国际音乐季•永恒的经典', '2023.10.12']

有这种情况,就是数组的第二,三,四项本来是结合为一项的,但是分成了三个部分,因此我们需要纠正这里;

情况紧急因此,我偷懒直接用了巧妙但不恰当的方法来解决了

text[1] += ' '.join(text[2:]) del text[2:]
就是把第二项开始,全部加到一块去;因为日期对本次的需求来说不重要,因此把时间也合集到第二个项里面去,然后删除第二项后的所有项;


from lxml import etree # 导入etree库 用于解析HTMLdef getContent(url):html = getHtml(url) # HTML内容doc = etree.HTML(html) # 解析HTML内容items = doc.xpath('//table//tbody//tr')resData = []for item in items:text = item.xpath('.//td//p//span//text()')if len(text) & len(text) >1:text[1] += ' '.join(text[2:])# 删除第二项之后的项del text[2:]resData.append(text)return resData

第四步:获取到的内容根据关键字筛选数据

遍历数据,查看数据里面是否包含"钢琴"两个字,若包含存入到newData里面,循环完后返回筛选过的数据

def filterData(data):targetKeywords = '钢琴'newData = []for item in data:if targetKeywords in item[1]:newData.append(item)return newData

第五步:收集每周推文的链接,整理汇总到表格中

Snipaste_2023-11-10_21-34-56.png

第六步:读取推文链接,重复运行上面的五个步骤
第七步:筛选的数据写入到表格中,并且导出

# 启动
def run():# 读取有链接的文件df = pd.read_excel('11122233.xlsx')url = df.iloc[:, 1] # 获取表格中的链接DATA = []for item in url:data = getContent(item) # 获取数据res = filterData(data) #筛选数据if len(res):  # 判断筛选后的数据组,是否有值DATA= DATA + res # 筛选的数据加起来if len(DATA):fileName = str(time.time()) # 时间戳为表格名称,为了避免冲突df.to_csv(fileName + '.csv', index=False) # 创建表格# 打开表格并且写入数据with open(fileName + '.csv', 'w', newline='', encoding='utf-8') as file:writer = csv.writer(file)writer.writerows(DATA[1:])# 调用启动函数
run()print('--完成--')

这样就完成需求了~ 获取数据->筛选数据->筛选的数据写入到表格中

完整代码片段

import requests
from lxml import etree
import pandas as pd
import csv
import time
# 请求网页获取内容并且返回网页HTML内容
def getHtml(url):# 请求头headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE'}# 发送GET请求获取网页内容response = requests.get(url, headers=headers)response.encoding = 'utf-8'return response.text # 返回HTML内容# 定为查找内容,并且返回数据
def getContent(url):html = getHtml(url) # HTML内容doc = etree.HTML(html) # 解析HTML内容items = doc.xpath('//table//tbody//tr')resData = []for item in items:text = item.xpath('.//td//p//span//text()')if len(text) & len(text) >1:text[1] += ' '.join(text[2:])# 删除第二项之后的项del text[2:]resData.append(text)return resData# 根据关键字筛选数据,并且返回筛选后的数据
def filterData(data):targetKeywords = '钢琴'newData = []for item in data:if targetKeywords in item[1]:newData.append(item)return newData# 启动函数 : 请求->获取数据->筛选数据->写入表格
def run():# 读取有链接的文件df = pd.read_excel('11122233.xlsx')url = df.iloc[:, 1]  # 获取表格中的链接DATA = []for item in url:data = getContent(item)  # 获取数据res = filterData(data)  # 筛选数据if len(res):  # 判断筛选后的数据组,是否有值DATA = DATA + res  # 筛选的数据加起来if len(DATA):fileName = str(time.time())  # 时间戳为表格名称,为了避免冲突df.to_csv(fileName + '.csv', index=False)  # 创建表格# 打开表格并且写入数据with open(fileName + '.csv', 'w', newline='', encoding='utf-8') as file:writer = csv.writer(file)writer.writerows(DATA[1:])# 调用启动函数
run()print('--完成--')

如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
Python全套学习资料

在这里插入图片描述

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓
在这里插入图片描述

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

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

相关文章

MYSQL数据库安全性练习题

Mysql数据库实验及练习题相关 MySQL 数据库和表的管理-数据库实验一 MySQL连接查询、索引、视图-数据库实验二、实验三 MySQL约束、触发器-数据库实验四 MYSQL存储过程和存储函数-数据库实验五 MySQL批量随机生成name、TEL、idNumber MYSQL数据库的安全管理-数据库实验六 MYSQ…

JavaEE - 网络编程之回显服务器

目录 一.什么是回显服务器&#xff1f; 二.UDP是什么&#xff1f; 1.TCP 是有链接的&#xff0c; UDP 是无连接的 2.TCP是可靠传输的,UDP是不可靠传输的 3.TCP是面向字节流的&#xff0c;UDP是面向数据报 4.TCP和UDP是全双工的 三.UDP的 socket api 四. 具体代码实现 …

JavaScript:正则表达式

JavaScript&#xff1a;正则表达式 什么是正则表达式正则表达式语法定义正则表达式判断是否有匹配的字符串查找匹配的字符串 正则表达式匹配法则元字符边界符量词字符类 什么是正则表达式 正则表达式用于匹配字符串中字符的组合模式。 正则表达式会依据其自身语法&#xff0c;…

山西电力市场日前价格预测【2023-12-28】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-12-28&#xff09;山西电力市场全天平均日前电价为814.30元/MWh。其中&#xff0c;最高日前电价为1500.00元/MWh&#xff0c;预计出现在08:00~08:45,17:00~20:15。最低日前电价为394.61元/…

C语言中灵活多变的动态内存管理,malloc函数 free函数 calloc函数 realloc函数

文章目录 &#x1f680;前言&#x1f680;管理动态内存的函数✈️malloc函数✈️free函数✈️calloc函数✈️realloc函数 &#x1f680;在使用动态内存函数时的常见错误✈️对NULL指针的解引用✈️ 对动态开辟空间的越界访问✈️对非动态开辟内存使用free释放✈️使用free释放一…

实现区域地图散点图效果,vue+echart地图+散点图

1.效果图 2.准备工作,在main.js和index.js文件中添加以下内容 main.js app.use(BaiduMap, {// ak 是在百度地图开发者平台申请的密钥 详见 http://lbsyun.baidu.com/apiconsole/key */ak: sRDDfAKpCSG5iF1rvwph4Q95M6tDCApL,// v:3.0, // 默认使用3.0// type: WebGL // ||API…

python+django大自然环境保护宣传网站62r9b

本课题使用Python语言进行开发。基于web,代码层面的操作主要在PyCharm中进行&#xff0c;将系统所使用到的表以及数据存储到MySQL数据库中 本系统由后台管理子系统&#xff0c;登录子系统&#xff0c;按登陆角色及权限划分为管理员:个人中心&#xff0c;用户管理&#xff0c;文…

Python三级 每周练习题32

如果你感觉有收获&#xff0c;欢迎给我微信扫打赏码 ———— 以激励我输出更多优质内容 练习一: 作业1 (1)用 python 新建一个文件名为jscj.csv 文件&#xff0c;将上述的数据写入表格 (2)计算输出每个班的平均分(结果保留两位小数) 答案: with open(cjm.csv,w,encodingu…

英语打卡分析12

[爱心]长难句分享第十二天解析 [玫瑰]【词汇】&#xff1a; • appropriate [əˈproʊpriət] adj. 恰当的 • in place 准备妥当 • caregiver [ˈkerɡɪvər] n. 看护人 • no more … than… 和……一样不 • newsworthy [ˈnuːzwɜːri] adj. 值得报道的 • capable […

golang第一卷---go入门

go入门 对于使用go的好处环境变量配置开发工具 参考网站 &#xff1a;go入门 对于使用go的好处 简单好记的关键词和语法。轻松上手&#xff0c;简单易学。更高的效率。比Java&#xff0c;C等拥有更高的编译速度&#xff0c;同时运行效率媲美C&#xff0c;同时开发效率非常高。…

tcpdump出现permission denied

在使用tcpdump -i eth0 src host 192.168.0.184 and ip and port 22 -nn -w ping.pacp命令抓包并把抓到的数据保存到ping.pacp时&#xff0c;出现了权限错误的报错。但实际上我这里用的是root用户执行的命令。 查阅man手册发现: 在tcpdump中&#xff0c;-Z选项用于在启动数据…

C练习——判断三角形并求面积

题目&#xff1a;从健盘任意输入三角形的三边长为a,b,c,编程判断a,b,c的值能否构成一个三角形&#xff0c;若能构成三角形&#xff0c;则计算并输出三角形的面积&#xff0c;否则提示不能构成三角形。 已知构成三角形的条件是&#xff1a;任意两边之和大于第三边。 解析&#…