网络爬虫爬取数据并制作词云全过程【内附可执行代码注释完整】

news2024/11/23 2:13:44

文章目录

  • 前言
  • 网络爬取数据部分
    • 小知识点
      • 利用正则表达式在字符串中提取到url(https以及http)
      • 仅仅只保存字符串中的中文字符
    • 爬取数据
  • 生成词云
    • jieba分词
    • 生成词云
    • 生成词云最终版代码
  • 总结

前言

快期末了,有个数据挖掘的大作业需要用到python的相关知识(这太难为我这个以前主学C++的人了,不过没办法还是得学😂🚀🚀),下面是我在学习制作词云知识时总结的一些东西(本篇文章主要包含数据爬取以及词云制作),我对于python不是很熟悉,如果下面的一些知识点有哪里出问题或者有不同理解的,请一定一定要在评论区提出来,让我这个菜鸡学习学习~~/(ㄒoㄒ)/~~

网络爬取数据部分

这次期末的大作业主要是要分析俄乌冲突的内容,所以需要爬取相关网站的内容,以下是我爬取某华网的整个过程(我对于数据爬虫并不是特别熟悉,请大家多多包含)

在正式开始爬取之前,我们先来学习一些字符串的处理操作吧👇


小知识点

利用正则表达式在字符串中提取到url(https以及http)

为什么我要提取url呢,那是因为我提取的网站源代码,他就会包含很多子窗口的url,我把这些子窗口的url进行保存,最终目的就是为了读取子窗口的正文信息。

直接看运行效果吧👇

import re

def findUrl(string):
    # findall() 查找匹配正则表达式的字符串

    url = re.findall('https?://[a-zA-Z0-9\.\?/%-_]*', string)

    return url


if __name__ == '__main__':
    strTest = "url1=https://cn.bing.com sda" \
              "url2 = https://baidu.com sd" \
              "asdjaslkdjaskld http://taobao.com"

    print(strTest)

    listUrl = findUrl(strTest)

    print(listUrl)

运行效果:
在这里插入图片描述


仅仅只保存字符串中的中文字符

核心思想:通过比对字符串中字符的unicode编码看是不是中文字符

def is_chinese(uchar):
    """判断一个unicode是否是汉字"""
    if uchar >= u'\u4e00' and uchar <= u'\u9fa5':
        return True
    else:
        return False

def format_str(content):
    content.encode("UTF-8")
    content_str = ''
    for i in content:
        if is_chinese(i):
            content_str = content_str+i
    return content_str

if __name__ == '__main__':
    contentStr = "1231231231我在北京邮电大学西土城10十号!!!!!"
    formatStr = format_str(contentStr)

    print(formatStr)

运行效果:
在这里插入图片描述


爬取数据

在这里插入图片描述

通过f12我们可以发现网页的请求方式是Ajax请求
如何判断是否是Ajax请求👇

  • 当我们将滚动条往下拉后,看到滚动条越来越短(整个网页的数据增多了,观察f12的Network慢慢的它会添加一些东西),但是整体的页面没有刷新
  • f12的element存在的一些"元素"(比如我们的图片名字),而当我们去f12的source中是找不到该"元素"的

在这里插入图片描述

我们拿到Ajax的url,观察其规律
在这里插入图片描述

所以我这决定爬取数据的步骤是:

  • 爬取10个页面的信息,将其中子窗口(单独的新闻)的网址进行记录保存
  • 对子窗口网址进行爬取,将新闻的正文部分进行爬取(采用BeautifulSoup进行数据解析)
  • 将爬取到的正文部分进行处理(去除’ ',“\r”,“\n”…),然后将字符串全部保存到一个文件中

代码:

import requests
from lxml import etree
import re
from bs4 import BeautifulSoup
import jieba
from wordcloud import WordCloud

def is_chinese(uchar):
    """判断一个unicode是否是汉字"""
    if uchar >= u'\u4e00' and uchar <= u'\u9fa5':
        return True
    else:
        return False

def format_str(content):
    content.encode("UTF-8")
    content_str = ''
    for i in content:
        if is_chinese(i):
            content_str = content_str+i
    return content_str

def Find(string):
    # findall() 查找匹配正则表达式的字符串
    url = re.findall('https?://[a-zA-Z0-9\.\?/%-_]*', string)

    return url

def getUrl(string):
    resp2 = requests.get(string)
    return Find(resp2.text)

def getData(string):
    data = set()
    resp = requests.get(string)
    resp.encoding = "utf-8"
    # 使用lxml解析器解析html
    bs = BeautifulSoup(resp.text, "lxml")
    # 将换行符,空格以及回车进行去除
    stringTitle = bs.title.text.replace(" ","").replace("\n","").replace("\r","")
    stringTitle = format_str(stringTitle)
    data.add(stringTitle)
    
    for item in bs.select("#DH-PLAYERID"):
        stringTitle1 = item.text.replace(" ","").replace("\n", "").replace("\r","")
        stringTitle1 = format_str(stringTitle1)
        data.add(stringTitle1)
        
    for item in bs.select("#detail"):
        stringTitle2 = item.text.replace(" ","").replace("\n", "").replace("\r","")
        stringTitle2 = format_str(stringTitle2)
        data.add(stringTitle2)
    # for item in data:
    #     print(item)
    return data

if __name__ == '__main__':
    news_data = set()
    m_urlList = []
    strNews = ""

    # 获取新华网疫情模块的前20页疫情新闻
    for i in range(20):
        url = "http://so.news.cn/getNews?keyword=" \
              "%E4%BF%84%E4%B9%8C%E5%86%B2%E7%AA%81&curPage="+str(i+1)+"&sortField=0&searchFields=1&lang=cn"
        m_urlList = m_urlList+getUrl(url)

    for url in m_urlList:
        news_data=news_data|getData(url)

    # 将列表中的字符串合并到一个字符串中
    for item in news_data:
        #print(item)
        strNews = strNews+item

	# 爬取到的数据进行保存
    with open('新华网爬到的数据.txt', 'w', encoding='utf-8') as f:
        f.write(strNews)
        f.close()

运行结果:
在这里插入图片描述



生成词云

生成词云部分步骤分为:

  • 将刚刚爬取下来的文本文件进行分词(在这使用jieba分词)
  • 生成词云

jieba分词

import jieba

text = "您好呀我是来自北京邮电大学的一名学生"
#print(text)
# 1.结巴中文分词,生成字符串,默认精确模式
cut_text = jieba.cut(text)
# 2.必须给个符号分隔开分词结果来形成字符串,才可以打印和分词
result = " ".join(cut_text)
print(result)

运行结果:
在这里插入图片描述


生成词云

生成词云的步骤:

  • 读取之前网络爬虫爬取的数据文件,并将其分词生成分词结果result
  • 将本地的字体文件拷贝到代码的同级目录(需要有字体文件要不然后面生成的词云可能会是"框框")
  • 生成词云

1.将本地的字体文件拷贝到代码同级目录

在这里插入图片描述
拷贝到代码同级目录下会有这三个文件,用第一个就行(看后面操作)
在这里插入图片描述

2.生成词云
直接看代码吧,注释都在代码里面了👇

代码

import matplotlib.pyplot as plt
import jieba
from wordcloud import WordCloud

text = "您好您好您好呀我是来自北京邮电大学的一名学生"
#print(text)
# 1.结巴中文分词,生成字符串,默认精确模式
cut_text = jieba.cut(text)
# 2.必须给个符号分隔开分词结果来形成字符串,才可以打印和分词
result = " ".join(cut_text)
print(result)
wc = WordCloud(
        # 设置字体,不指定就会出现乱码
        # 设置背景色
        background_color='white',
        # 设置背景宽
        width=500,
        # 设置背景高
        height=350,
        # 最大字体
        max_font_size=50,
        # 最小字体
        min_font_size=10,
        mode='RGBA',
        font_path =  "msyh.ttc" # 字体信息
        #colormap='pink'
        )
# 产生词云
wc.generate(result)

# 3.显示图片
# 指定所绘图名称
plt.figure("jay")
# 以图片的形式显示词云
plt.imshow(wc)
# 关闭图像坐标系
plt.axis("off")
plt.show()

运行效果:
在这里插入图片描述

生成词云最终版代码

这里也没啥好说的,该说的知识点前面都已经说完了,下面直接看代码吧

import matplotlib.pyplot as plt
import jieba
from wordcloud import WordCloud


# 1.读入txt文本数据
f = open('新华网爬到的数据.txt','r',encoding = 'utf-8')    
text = f.read()
f.close
# 2.结巴中文分词,生成字符串,默认精确模式,如果不通过分词,无法直接生成正确的中文词云
cut_text = jieba.cut(text)
# 必须给个符号分隔开分词结果来形成字符串,否则不能绘制词云
result = " ".join(cut_text)
# 3.生成词云图,这里需要注意的是WordCloud默认不支持中文,所以这里需已下载好的中文字库
# 无自定义背景图:需要指定生成词云图的像素大小,默认背景颜色为黑色,统一文字颜色:mode='RGBA'和colormap='pink'
wc = WordCloud(
        # 设置字体,不指定就会出现乱码
        # 设置背景色
        background_color='white',
        # 设置背景宽
        width=500,
        # 设置背景高
        height=350,
        # 最大字体
        max_font_size=50,
        # 最小字体
        min_font_size=10,
        mode='RGBA',
        font_path =  "msyh.ttc" # 我们刚刚copy来的字体文件
        #colormap='pink'
        )
# 产生词云
wc.generate(result)
# 4.显示图片
# 指定所绘图名称
plt.figure("jay")
# 以图片的形式显示词云
plt.imshow(wc)
# 关闭图像坐标系
plt.axis("off")
plt.show()

运行结果(我还是打码吧):
在这里插入图片描述



总结

谢谢大家能够看到这,真心希望对您有所帮助,我学python的时间也不长,如果同学们对于本文的一些知识点或者一些概念存在疑问或者是不同理解欢迎在评论区中提出来,让我也可以学习学习,谢谢大家🚀🚀
在这里插入图片描述

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

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

相关文章

Json字符串转成对象

Json字符串转成对象 Hello吖&#x1f60a;&#xff0c;我是孤音&#xff08;一个你理解不了的程序猿&#xff09;&#xff0c;今天来分享一个小技巧&#xff0c;能够大大滴提高效率额 问题&#x1f635; 接收到一串JSON格式的字符串&#xff0c;需要获取其中某些字段的值 思路…

一天梳理完React所有面试考察知识点

性能优化 性能优化&#xff0c;永远是面试的重点&#xff0c;性能优化对于 React 更加重要 在页面中使用了setTimout()、addEventListener()等&#xff0c;要及时在componentWillUnmount()中销毁使用异步组件使用 React-loadable 动态加载组件shouldComponentUpdate(简称SCU …

更高效、更精确的预测性维护方案是如何实现的?

一、预测性维护的必要性 设备维护一般有三种模式&#xff1a;事后维护、预防性维护和预测性维护。事后维护通常是在设备产生故障后采取措施进行维护&#xff0c;是一种成本较大的维护方式。预防性维护属于事先维护&#xff0c;是一种基于时间、性能等条件&#xff0c;对设备进…

A_A05_003 STC-ISP串口调试助手使用

目录 一、软件获取 二、软件基本功能介绍 1、接收缓冲区 2、串口通信参数配置区串口打开关闭其他设置区域 3、发送缓冲区 4、多字符发送区 三、注意事项 一、软件获取 网盘链接 直戳跳转 二、软件基本功能介绍 1、接收缓冲区 注&#xff1a;先选中串口助手切换到上图界…

OneNav Extend网址导航书签系统源码魔改版

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 OneNav Extend 是一款功能强大的书签&#xff08;导航&#xff09;管理程序&#xff0c;使用PHP SQLite 3开发&#xff0c;界面简洁&#xff0c;安装简单&#xff0c;使用方便。 OneNa…

通达信下单接口如何执行量化策略?

在量化市场上&#xff0c;有很多交易系统就是通过执行量化策略来进行盈利&#xff0c;比如像通达信下单接口系统&#xff0c;其中就包括开仓、买入、止盈、止损方法与策略执行主函数等&#xff0c;那么执行这些策略呢&#xff1f; 想要了解清楚这个问题也很简单&#xff0c;通…

ssm+Vue计算机毕业设计校园疫情信息管理系统(程序+LW文档)

ssmVue计算机毕业设计校园疫情信息管理系统&#xff08;程序LW文档&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项…

linux下gcc编程12-window下clion编译调试redis7.0

redis介绍 Redis 通常被称为数据结构服务器。这意味着 Redis 通过一组命令提供对可变数据结构的访问&#xff0c;这些命令使用具有 TCP 套接字和简单协议的服务器-客户机模型发送。因此&#xff0c;不同的进程可以以共享的方式查询和修改相同的数据结构。 在 Redis 中实现的数…

WebDAV之葫芦儿·派盘 + Enpass

Enpass 支持WebDAV方式连接葫芦儿派盘。 想找一款加密软件把原来本地存储的明文密码,经过加密后存储到自己的电脑上。同时要具备云同步功能,有些安全级别没那么高的内容,可以同步到各端,以供快速查看、编辑。那您选择Enpass准没错了,还可以同步备份到个人私有派盘,跨平…

【vue】插槽,Provided/inject和vue3生命周期

&#xff08;1&#xff09;第一部分&#xff0c;关于插槽 插槽的作用是再子组件模板里面预留出位置&#xff0c;可以插入父组件的东西例如 <template> 下面是插槽展示的内容和&#xff1a;<slot/> </template>//父组件调用子组件布局的时候 <content>…

电竞蓝牙耳机什么牌子好?2022游戏蓝牙耳机推荐

随着玩游戏的人越来越多&#xff0c;随之而来的是越来越多的电竞蓝牙耳机的出现。在游戏中能够精准获取人物周围的声音变化&#xff0c;音效的同步汇入&#xff0c;这是喜欢戴蓝牙耳机玩游戏的用户所追求的听声辨位。那么&#xff0c;在众多的电竞蓝牙耳机当中&#xff0c;什么…

【复习笔记】计算机组成原理复习重点——篇五

计算机组成原理复习重点笔记 第&#xff15;章 输入输出系统 5.1 概述 外部设备&#xff1a;包括输入/输出设备及通过输入/输出接口才能访问的外存储设备。接口&#xff1a;外设与主机之间数据传输时完成速度匹配、格式转换等工作的逻辑部件。输入设备&#xff1a;键盘鼠标输出…

制造业ERP管理系统如何帮助企业解决委外加工管理难题?

当制造企业自身的生产能力不足或者缺乏某种技术的话&#xff0c;就需要把某个工艺甚至整个产品交给外面的制造厂商去进行生产&#xff0c;这就会触发委外加工作业。 委外加工是制造企业管理流程中&#xff0c;非常常见的一个环节&#xff0c;可以有效地减少因公司产能不足&…

qcustomplot单游标在多个坐标系中切换

1. 多坐标系—单个游标—游标在多个坐标系切换 在某些场景下&#xff0c;需要动态的添加多个坐标系&#xff0c;而游标只能在一个坐标系中显示&#xff0c;这时就需要将游标从默认的坐标系切换到指定坐标系&#xff0c;实现很简单&#xff0c;就不贴图了。代码如下&#xff1a…

docker中的c++ ROS节点中使用Matplotlib-cpp

背景 有时debug算法问题&#xff0c;想把算法&#xff0c;代码的中间量快速可视化出来&#xff0c;目前采用rviz或者qt_ros可以实现&#xff0c;但都不是很方便&#xff0c;代码开发量较大&#xff0c;常常会想要是能在ros c中也能像Matlab一样直接plot绘图就好了&#xff0c;…

英飞凌-AURIX-TC3XX 片上总线通信架构

目录1、英飞凌-AURIX-TC3XX 片上总线通信架构1.1、SRI-系统资源互连结构1.1.1、SRI简介1.1.2、SRI 的特征&#xff1a;1.1.3、SRI 结构相比于前一代产品主要的区别&#xff1a;1.1.4、SRI Crossbar 点对点连接机制1.1.5、SRI主机和SRI从机的连接情况1.2、系统外设总线1.3、BBB-…

Windows Qt连接达梦数据库

下载达梦数据库 首先可以在达梦数据库的官网下载达梦数据库&#xff1a;https://www.dameng.com/list_103.html 如果你的QT程序是64位的&#xff0c;那么就下载win64 的达梦数据库&#xff0c;相应的32位的QT程序要下载win32的达梦数据库。否则&#xff0c;程序在连接数据库时…

【图像分割】各向异性热扩散方程SAR图像分割【含Matlab源码 1879期】

⛄一、各向异性热扩散方程简介&#xff08;具体理论见参考文献&#xff09; 1 前言 图像分割是 图像解译的一个关键步骥。 图像分割属于图像解译的早期处理 &#xff0c; 目的是为更高水平的后续处理提供输人。 因此图像分割的好坏对后续 解译性能有较大的影响。 相对于光学图…

3、metasploit渗透测试初识

一、Metasploitable2靶机安装 参考(1条消息) Metasploitable-linux-2.0.0靶机下载配置教程_draper-crypto的博客-CSDN博客_metasploitable2-linux用户密码&#xff1a;msfadmin/msfadmin二、模块介绍 exploits&#xff08;渗透攻击/漏洞利用模块&#xff09;渗透攻击模块&#…

SuperMap GIS 倾斜摄影数据优化 QA

一、为什么要优化 倾斜摄影数据自身存在文件碎、体量大等特点。未经优化的倾斜摄影在目前市面上主流的三维平台上加载均会出现加载慢&#xff0c;浏览效率低等问题。特别是在浏览器端受文件请求量、网络带宽、硬件性能等方面的影响&#xff0c;倾斜摄影的显示效果往往不尽人意…