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

news/2024/7/19 11:23:08 标签: python, 爬虫, selenium

文章目录

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

⭐前言

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

selenium_7">⭐selenium

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

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

💖 获取所有的文章url

思路分解

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

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

python">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读取代码块:

python">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
批量读取:

python">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.niftyadmin.cn/n/475755.html

相关文章

Java安全——策略文件说明

java 安全策略文件说明 Java安全策略文件是Java中的一种安全设置&#xff0c;用于限制Java代码所能访问的资源和执行的操作。这些资源包括文件系统、网络和系统配置等。通过使用Java安全策略文件&#xff0c;可以提高Java应用程序的安全性&#xff0c;防止恶意代码的执行和数据…

JsonData.fromJson(“now”)出现问题

JsonData.fromJson(String.valueOf(System.currentTimeMillis())) 出现问题 JsonData.fromJson(“now”)出现问题 今天在做时间衰减函数的时候发现一个问题&#xff0c;搞了我好久没有解决&#xff0c;后面查看了官网文档才发现&#xff0c;这部分代码目前仅支持半手动挡或者…

Selenium 网络元素的信息

目录 浏览器导航 打开网站 后退 前进 刷新 关于网络元素的信息 是否显示 是否启用 是否被选定 获取元素标签名 位置和大小 获取元素CSS值 文本内容 获取特性或属性 浏览器交互 获取浏览器信息 获取标题 获取当前 URL 浏览器导航 打开网站 启动浏览器后你要做…

【Visual Studio】Qt 接收串口发送过来的数据,使用按位或运算,将两个 8 位数据,合并成一个 16 位的整数

文章目录 问题办法将 byte 数组&#xff0c;按合适位置合并补充按位或运算举例说明 总结 问题 书接上回&#xff0c;之前我将数据拆解成 8 位&#xff0c;保存到字节数组中传输过去了。这次&#xff0c;我基于 Visual Studio 开发 Qt 环境&#xff0c;使用 C 语言进行接收&…

python【爬虫】【批量下载】年报抓取

python年报爬取更新 本人测试发现&#xff0c;ju chao网的年报爬取距离我上一篇博客并没有啥变化&#xff0c;逻辑没变&#xff0c;应好多朋友的需要&#xff0c;这里补充代码 import json import osimport requestsweb_url 改成网站的域名&#xff0c;因为csdn屏蔽 def load…

css基础知识十一:CSS3新增了哪些新特性?

一、是什么 css&#xff0c;即层叠样式表&#xff08;Cascading Style Sheets&#xff09;的简称&#xff0c;是一种标记语言&#xff0c;由浏览器解释执行用来使页面变得更为美观 css3是css的最新标准&#xff0c;是向后兼容的&#xff0c;CSS1/2的特性在CSS3 里都是可以使用…

C语言time(NULL)学习

根据资料&#xff1b;如下一段代码&#xff1b; clock_t a,b; float cputime; atime(NULL);for (intz0;z<10000000;z){ float f0; for (int i 0; i<n; i)f h_idata[i]; }btime(NULL); cputime(float)(b-a); printf("cuptime%fmseconds\n",cputime); 前后2个…

MySQL 高可用配置及故障切换

MySQL 高可用配置及故障切换 一、MHA1.1 什么是 MHA1.2 MHA 的组成1.3 MHA 的特点1.4 MHA工作原理 二、搭建 MySQL MHA2.1 实验思路2.2 部署过程2.3 环境准备2.4 搭建MHA 一、MHA 1.1 什么是 MHA 1、MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可…