python爬虫—selenium获取csdn质量分并用echarts可视化分析

news2024/10/6 8:28:07

文章目录

    • ⭐前言
    • ⭐selenium
    • 💖 获取所有的文章url
    • 💖 根据url查询分数
    • 💖 inscode结合echarts展示
    • 结束

⭐前言

大家好,我是yma16,本文分享关于python自动化获取个人博客质量分并可视化。
该系列文章:
python爬虫_基本数据类型
python爬虫_函数的使用
python爬虫_requests的使用

⭐selenium

Selenium 通过使用 WebDriver 支持市场上所有主流浏览器的自动化。 Webdriver 是一个 API 和协议,它定义了一个语言中立的接口,用于控制 web 浏览器的行为。 每个浏览器都有一个特定的 WebDriver 实现,称为驱动程序。 驱动程序是负责委派给浏览器的组件,并处理与 Selenium 和浏览器之间的通信。

python使用selenium调用WebDriver自动控制浏览器动作
在这里插入图片描述

💖 获取所有的文章url

思路分解

  • 获取article标签
  • 拿到a标签的属性链接
  • 拿到a标签内容的标题

html的元素分析
html-element
注意:需要完全滚动到底部加载所有的文章
代码块:

from selenium import webdriver
import time,re,json


dir_path='C:\\Users\MY\PycharmProjects\Spider_python\study2021\day07\dirver\msedgedriver.exe'
driver=webdriver.Edge(executable_path=dir_path)
url='https://blog.csdn.net/qq_38870145?type=blog'
driver.get(url)
now_url=driver.current_url


#定义一个初始值
temp_height=0
time.sleep(3)
while True:
    #循环将滚动条下拉
    driver.execute_script("window.scrollBy(0,1000)")
    #sleep一下让滚动条反应一下
    time.sleep(5)
    #获取当前滚动条距离顶部的距离
    check_height = driver.execute_script("return document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;")
    #如果两者相等说明到底了
    if check_height==temp_height:
        break
    temp_height=check_height

jsonData={
    'articleInfo':[
    #     {src,title,name,aId}
    ]
}
def next_list():
    article=driver.find_elements_by_xpath('//article[@class="blog-list-box"]')
    for item in article:
        link=item.find_element_by_tag_name('a').get_attribute('href')
        text=item.text
        title=text.split('\n')[0]


        print('link', link)
        print('title',title)
        compile1 = re.compile(r'https://(.*?).blog.csdn.net/article/details/(.*?)$', re.S)  # 匹配 name和用户id
        result = re.findall(compile1, link)
        print('result',result)
        uid=''
        aid=''
        for uid, aid in result:
            uid=uid
            aid=aid
        jsonData['articleInfo'].append({
            'title':title,
            'src':link,
            'article':aid,
            'username':uid
        })

next_list()
driver.close()

with open("./articleContent.json", 'w') as write_f:
	write_f.write(json.dumps(jsonData, indent=4, ensure_ascii=False))

写入json成功!
在这里插入图片描述

💖 根据url查询分数

思路分解:

  • 自动填充url
  • 获取分数
  • 记录分数

search-grade
注意:获取分数显示的渲染需要延迟一段时间
单个url读取代码块:

from selenium import webdriver
import time,re,json


dir_path='C:\\Users\MY\PycharmProjects\Spider_python\study2021\day07\dirver\msedgedriver.exe'
driver=webdriver.Edge(executable_path=dir_path)
url='https://www.csdn.net/qc'
driver.get(url)
now_url=driver.current_url

def autoWriteUrl(url):
    driver.find_element_by_xpath('//input[@type="text" and @popperclass="csdn-input-autocomplete"]') \
        .send_keys(url)  # 输入内容
    searchBtn()
    getGrade()

def searchBtn():
    driver.find_element_by_xpath('//div[@class="trends-input-box-btn"]') \
        .click()  # 点击

def getGrade():
    time.sleep(2)
    grade=driver.find_element_by_xpath('//p[@class="img"]')
    gradeNum=grade.text
    des=driver.find_element_by_xpath('//p[@class="desc text"]')
    desContent=des.text
    print(gradeNum)
    print(desContent)

time.sleep(1)
autoWriteUrl('https://yma16.blog.csdn.net/article/details/131407234')

运行结果:
get-grade
批量读取:

from selenium import webdriver
import time,json


dir_path='C:\\Users\MY\PycharmProjects\Spider_python\study2021\day07\dirver\msedgedriver.exe'
driver=webdriver.Edge(executable_path=dir_path)
url='https://www.csdn.net/qc'
driver.get(url)
now_url=driver.current_url

def autoWriteUrl(url):
    print(url)
    driver.find_element_by_xpath('//input[@type="text" and @popperclass="csdn-input-autocomplete"]') \
        .send_keys(url)  # 输入内容
    searchBtn()
    return getGrade()

def searchBtn():
    driver.find_element_by_xpath('//div[@class="trends-input-box-btn"]') \
        .click()  # 点击

def getGrade():
    time.sleep(1)
    grade=driver.find_element_by_xpath('//p[@class="img"]')
    gradeNum=grade.text
    des=driver.find_element_by_xpath('//p[@class="desc text"]')
    desContent=des.text
    print(gradeNum)
    print(desContent)
    return [gradeNum,desContent]

# autoWriteUrl('https://yma16.blog.csdn.net/article/details/131407234')
# 质量分数据
gradeJsonData={}
def mapJson(jsonVal):
    for key in jsonVal.keys():
        gradeJsonData[key]=[]
        for childItem in jsonVal[key]:
            print(childItem)
            grade = 0
            des = ''
            temp={}
            for childItemKey in childItem:
                temp[childItemKey]=childItem[childItemKey]
                if(childItemKey=='src'):
                    grade=autoWriteUrl(childItem[childItemKey])[0]
                    des=autoWriteUrl(childItem[childItemKey])[1]
            temp['grade']=grade
            temp['des']=des
            gradeJsonData[key].append(temp)

if __name__=='__main__':
    with open('articleContent.json', 'r') as f:
        jsonData = json.load(f)
        mapJson(jsonData)

    with open("./articleGrade.json", 'w', encoding='utf-8') as write_f:
        write_f.write(json.dumps(gradeJsonData, indent=4, ensure_ascii=False))

    driver.close()

运行结果如下:
run-json-end

💖 inscode结合echarts展示

echarts读取json显示柱状图

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>echarts 滚动事件</title>
    <!-- vue2 生产环境版本,优化了尺寸和速度 -->
    <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
    <script src="./echarts.js"></script>
    <script type="text/javascript" src="./csdnGrade.js"></script>
</head>
<style>
    #app {
        position: absolute;
        height: 100vh;
        width: 100vw;
    }
</style>

<body>
    <div id="app">
        <div>
            csdn 质量分柱状图
            <div id="first" style="width: 900px;height:1200px;"></div>
        </div>
    </div>

    <script type="text/javascript">
        csdnJson.articleInfo.sort((a,b)=> parseInt(a.grade)-parseInt(b.grade))
        const instanceVue = {
            el: '#app',
            name: 'ecahrts',
            data() {
                return {
                    firstChart: null,
                    secondChart: null,
                    thirdChart: null,
                    maxNum: 1000,
                };
            },
            mounted() {
                this.initFirstData()
            },
            methods: {
                initFirstData() {

                    // 基于准备好的dom,初始化echarts实例
                    var myChart = echarts.init(document.getElementById('first'));

                    // 指定图表的配置项和数据
                    let base = +new Date(1968, 9, 3);
                    let oneDay = 24 * 3600 * 500;
                    let date = [];
                    let data = [Math.random() * 300];
                    for (let i = 1; i < this.maxNum; i++) {
                        var now = new Date((base += oneDay));
                        date.push([now.getFullYear(), now.getMonth() + 1, now.getDate()].join('/'));
                        data.push(Math.round((Math.random() - 0.5) * 20 + data[i - 1]));
                    }
                    const option = {
                        tooltip: {
                            trigger: 'axis',
                            axisPointer: {
                                type: 'shadow'
                            }
                        },
                        legend: {},
                        xAxis: {
                            type: 'category',
                            data: csdnJson.articleInfo.map(item => item.username)
                        },
                        yAxis: {
                            type: 'value'
                        },
                        series: [
                            {
                                data: csdnJson.articleInfo.map(item => item.grade),
                                type: 'bar',
                                showBackground: true,
                                backgroundStyle: {
                                    color: 'rgba(180, 180, 180, 0.2)'
                                }
                            }
                        ]
                    };
                    // 使用刚指定的配置项和数据显示图表。
                    myChart.setOption(option);
                    // 监听
                    this.firstChart = myChart;
                },
            }
        }
        // 实例化
        new Vue(instanceVue);
    </script>
</body>

</html>

运行结果:
echarts-grade
inscode:

结束

本文分享python的自动化获取质量分到此结束!
scene

👍 点赞,是我创作的动力!
⭐️ 收藏,是我努力的方向!
✏️ 评论,是我进步的财富!
💖 感谢你的阅读!

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

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

相关文章

MATLAB App Designer基础教程 Matlab GUI入门(一)

MATLAB GUI入门 第一天 学习传送门&#xff1a; 【MATLAB App Designer基础教程Matlab GUI界面设计&#xff08;全集更新完毕-用户界面设计appdesigner&#xff08;中文&#xff09;Matlab Gui教程】 https://www.bilibili.com/video/BV16f4y147x9/?p2&share_sourcecopy_…

音视频解码流程解析

文章目录 1.音视频解码过程2.FFmpeg解音视频流程3.关键函数说明 1.音视频解码过程 2.FFmpeg解音视频流程 3.关键函数说明 avcodec_find_decoder:根据指定AVCodecID查找注册的解码器av_parser_init:初始化AVCodecParserContextavcodec_alloc_context3:创建AVCodecContext上下文…

同行共建,引领潮流,我来说说亚马逊云科技的中国新举措

亚马逊云科技全面阐述生成式AI新机遇&#xff0c;宣布多项举措助力企业加速创新、可持续发展。 【全球云观察 &#xff5c; 热点关注】当前&#xff0c;全球公有云整体规模已经发展到足够大了&#xff0c;来自专业分析机构的数据统计显示&#xff0c;包括了laaS、PaaS、SaaS在内…

gitlab集成kubernetes

gitlab集成kubernetes 1. 管理员通过服务模板添加Kubernetes集群&#xff0c;是生效所有项目 2. 群组中也可以添加Kubernetes集群&#xff0c;优先于管理员添加的全局集群 3. 链接现有集群 4. 配置集群信息 http://178.119.31.180/help/user/project/clusters/add_existing_cl…

uniapp中环状进度条

调用插件&#xff1a; <circle-progress-bar :pro"84/100" :border_back_color"#297DFE" :border_color"#FB8F23">{{84}}%</circle-progress-bar>添加插件引用&#xff1a; <script>import CircleProgressBar from ../../com…

QT桌面挂件动画

目录 参考功能实现05DesktopPattern.promain.cppdesktoppattern.hdesktoppattern.cppwallpaper.hwallpaper.cpp 效果模糊知识点 参考 图片资源 功能 桌面挂件动画置顶切换挂件动画图片选择更换桌面壁纸显示时改变桌面壁纸&#xff0c;隐藏/退出时还原桌面壁纸系统托盘菜单&a…

R语言复现一篇6分的孟德尔随机化文章

上一期我们对孟德尔随机化做了一个简单的介绍&#xff0c;今天我们来复现一篇6分左右的使用了孟德尔随机化方法的文章&#xff0c;文章的题目是&#xff1a;Mendelian randomization analysis does not reveal a causal influence of mental diseases on osteoporosis&#xff…

Angular 与 PDF之五 实现方式的选择与扩展

在纯web的前提下&#xff08;不考虑移动端native&#xff09;&#xff0c;PDF的功能基本包括&#xff1a; 客户端PDF&#xff1a;最简单的场景&#xff0c;实现方式也很多&#xff0c;基本不需要有什么顾虑的地方&#xff0c;简单的实现可以参考系列第一篇文章。客户端PDF预览&…

【NM 2019】综述:基于机器学习引导的定向进化蛋白质工程

Machine-learning-guided directed evolution for protein engineering | Nature Methods Machine-learning-guided directed evolution for protein engineering 机器学习引导的定向进化蛋白质工程 图1 | 带和不带机器学习的定向进化。 a&#xff09;定向进化利用迭代循环的…

MySQL数据库---笔记5

MySQL数据库---笔记5 一、锁1.1、介绍1.2、全局锁1.2.1、全局锁介绍1.2.2、一致性数据备份 1.3、表级锁1.3.1、表锁1.3.2、元数据锁&#xff08;meta data lock , MDL&#xff09;1.3.3、意向锁 1.4、行级锁1.4.1、介绍1.4.2、行锁1.4.3、间隙锁/临建锁 二、InnoDB引擎2.1、逻辑…

vue和node使用websocket实现数据推送,实时聊天

需求&#xff1a;node做后端根据websocket&#xff0c;连接数据库&#xff0c;数据库的字段改变后&#xff0c;前端不用刷新页面也能更新到数据&#xff0c;前端也可以发送消息给后端&#xff0c;后端接受后把前端消息做处理再推送给前端展示 1.初始化node&#xff0c;生成pac…

STM32杂记之单片机复位状态

参考源码 概况 复位后&#xff0c;器件从内部高速振荡器 &#xff08;HSI 8MHz&#xff09; 运行&#xff0c;FLASH 0 等待状态&#xff0c;FLASH预取缓冲区使能&#xff0c;除内部 SRAM、FLASH和 JTAG 外&#xff0c;所有外设均关闭。高速 &#xff08;AHB&#xff09; 和低…

LLaMA模型微调版本:斯坦福 Alpaca 详解

项目代码&#xff1a;https://github.com/tatsu-lab/stanford_alpaca 博客介绍&#xff1a;https://crfm.stanford.edu/2023/03/13/alpaca.html Alpaca 总览 Alpaca 是 LLaMA-7B 的微调版本&#xff0c;使用Self-instruct[2]方式借用text-davinct-003构建了52K的数据&#x…

三相一次重合闸程序逻辑原理(二)

在手动合闸至故障线路或手动分闸及保护或自动装置要求不允许重合闸&#xff08;如母线、变压器保护及低频减载动作&#xff09;等情况下&#xff0c;闭锁重合闸的输入开关量触点接通&#xff0c;H4输出“1”&#xff0c;非门Z4输出“0”&#xff0c;计数器清零&#xff08;CD0&…

健身戴哪种耳机好、适合健身运动的耳机推荐

随着越来越多的人加入运动健身的行列&#xff0c;市场上涌现出越来越多适用于跑步的运动耳机。对于喜欢运动的朋友们来说&#xff0c;一副优秀的运动耳机成为了必不可少的装备。当进行力量训练时&#xff0c;佩戴耳机可以帮助提升训练的专注度&#xff1b;而在进行有氧运动时&a…

部署 kubeadm 1.20

目录 一、环境准备二、所有节点安装docker三、所有节点安装kubeadm&#xff0c;kubelet和kubectl四、部署K8S集群 硬件准备 master&#xff08;2C/4G&#xff0c;cpu核心数要求大于2&#xff09; 192.168.154.10 docker、kubeadm、kubelet、kubectl、flannel node01&#xff08…

oracle dblink mysql查询text无法显示问题

帮客户做了一个oracle到mysql的dblink之后&#xff0c;客户反馈发现有的表查询字段不全&#xff0c;通过select * 查询&#xff0c;mysql中有个字段INTERVENTION字段没有显示&#xff0c;首先想到的就是可能不支持查询&#xff0c;检查这个字段类型为text&#xff0c;猜测可能是…

LeetCode刷题 | 139. 单词拆分

139. 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入: s "leetcode"…

直播预约|湘江公益直播大讲堂:以低代码助力中小企业数字化转型

在当今数字时代&#xff0c;中小企业面临着前所未有的机遇和挑战。在激烈的商业竞争环境中&#xff0c;如何快速、高效地实现数字化转型并提升企业的竞争力成为中小企业亟需解决的关键问题。 低代码平台的兴起&#xff0c;为中小企业的数字化转型带来了全新的解决方案。 6月29日…

企业级ChatGPT开发的三大核心内幕及案例实战(二)

2.2 企业级ChatGPT开发的三大核心剖析 Gavin老师:NLP_Matrix_Space 本节讲解LangChain官方提供的一个项目,跟大家展示企业级开发的核心元素,如图2-1所示,是项目的架构示意图。 图2- 1 LangChain项目架构示意图 一个基本原则是你的提示词和模型进行交互,作为和模型交互的…