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库 用于解析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

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

遍历数据,查看数据里面是否包含"钢琴"两个字,若包含存入到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扫描下方二维码免费领取🆓

1️⃣零基础入门

① 学习路线

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

② 路线对应学习视频

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

③练习题

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

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

① 文档和书籍资料

在这里插入图片描述

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

①Python工具包

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

②Python实战案例

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

③Python小游戏源码

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

4️⃣Python面试题

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

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值