Scrapy+Selenium自动化获取个人CSDN文章质量分
前言
本文将介绍如何使用Scrapy和Selenium这两个强大的Python工具来自动获取个人CSDN文章的质量分数。我们将详细讨论Scrapy爬虫框架的使用,以及如何结合Selenium浏览器自动化工具来实现这一目标。无需手动浏览每篇文章,我们可以轻松地获取并记录文章的质量分数,从而更好地了解我们的博客表现。
CSDN文章质量分查询链接
Scrapy相关基础知识:
爬虫框架Scrapy学习笔记-1
爬虫框架Scrapy学习笔记-2
文章目录
- 前言
- 1. Scrapy的安装
- 2. Scrapy的工作流程
- 2.1 创建项目
- 2.2 进入项目目录
- 2.3 生成Spider
- 2.4 调整Spider
- 2.5 调整Settings配置
- 2.6 运行Scrapy程序
- 2.7 找URL
- 2.8 查看处理 response,交给管道
- 3. 使用Selenium获取质量分数
- 总结
1. Scrapy的安装
首先,我们需要安装Scrapy。建议在单独的虚拟环境中进行安装,你可以使用Virtualenv环境或Conda环境。执行以下命令来安装Scrapy:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scrapy==2.5.1
pip install pyopenssl==22.0.0
pip install cryptography==36.0.2
scrapy version
scrapy version --verbose
2. Scrapy的工作流程
Scrapy是一个强大的Python爬虫框架,我们可以按照以下步骤来使用它:
2.1 创建项目
使用以下命令创建一个Scrapy项目:
scrapy startproject csdn
2.2 进入项目目录
cd csdn
2.3 生成Spider
生成一个Spider来定义爬取规则:
scrapy genspider cs csdn.net
这将会生成一个Spider文件,你可以在其中定义你的爬取规则。
2.4 调整Spider
在生成的Spider文件中,你需要定义起始URL(start_urls)和如何解析数据的方法(通常是parse函数)。
例如:
import scrapyclass ExampleSpider(scrapy.Spider):name = 'cs'allowed_domains = ['csdn.net']start_urls = ['http://csdn.net/']def parse(self, response):pass
2.5 调整Settings配置
在项目目录中的settings.py
文件中,你可以调整各种配置选项。
以下是一些需要调整的配置选项:
- LOG_LEVEL:设置日志级别,你可以将其设置为"WARNING"以减少日志输出。
LOG_LEVEL = "WARNING"
- ROBOTSTXT_OBEY:设置是否遵守Robots协议,如果你不希望爬虫遵守Robots协议,可以将其设置为False。
ROBOTSTXT_OBEY = False
- ITEM_PIPELINES:打开管道以处理爬取的数据,你可以配置不同的管道来处理不同类型的数据。
ITEM_PIPELINES = {'csdn.pipelines.CsdnPipeline': 300,
}
2.6 运行Scrapy程序
使用以下命令来运行Scrapy程序:
scrapy crawl csdn
2.7 找URL
在这一步,我们需要找到用于获取文章数据的URL。可以通过以下步骤来找到URL:
我们可以先点开搜索按钮预设一个搜索值
然后在Fetch/XHR或JS中逐个点,加载出来就会在左侧被搜索到
这里我们最终在header中找到这个连接,我们会发现其实链接是通用的,你可以跳过上一步直接使用这个连接,只需要替换你的username
https://blog.csdn.net/community/home-api/v1/get-business-list?page=1&size=20&businessType=blog&orderby=&noMore=false&year=&month=&username=qq_42531954
另外,这里page=1&size=20,当你的文章大于20篇,你可以调整size,这里我刚好有50篇,于是我调整size=50
2.8 查看处理 response,交给管道
import scrapyclass CsSpider(scrapy.Spider):name = 'cs'allowed_domains = ['csdn.net']start_urls = ['https://blog.csdn.net/community/home-api/v1/get-business-list?page=1&size=50&businessType=blog&orderby=&noMore=false&year=&month=&username=qq_42531954']def parse(self, response):print(response.text)
分析response.text,发现返回值为字典
稍作处理后传递给管道
import scrapyclass CsSpider(scrapy.Spider):name = 'cs'allowed_domains = ['csdn.net']start_urls = ['https://blog.csdn.net/community/home-api/v1/get-business-list?page=1&size=50&businessType=blog&orderby=&noMore=false&year=&month=&username=qq_42531954']def parse(self, response):# print(response.text)data_list = response.json()["data"]["list"]for data in data_list:url = data["url"]title = data["title"]yield { # 宁典可以充当item -> dict"url": url,"title": title}
csdn/csdn/pipelines.py
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interface
from itemadapter import ItemAdapterclass CsdnPipeline:def process_item(self, item, spider):print("我是管道,我看到的东西是", item)with open("data.csv", mode="a", encoding="utf-8") as f:f.write(f"{item['url']},{item['title']}\n")return item
3. 使用Selenium获取质量分数
如果你的chromedriver出现问题,你可以从这里找到解决方案
自动化管理chromedriver-完美解决版本不匹配问题
以下是使用Selenium的代码示例:
import csv
import time
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.options import Optionsoption = Options()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
option.add_argument('--disable-blink-features=AutomationControlled')
option.add_argument('--headless') # 启用无头模式driver = webdriver.Chrome(options=option)
# 用于存储CSV数据的列表
data = []
#
# 打开CSV文件并读取内容
with open('data.csv','r', encoding='utf-8') as csvfile:reader = csv.reader(csvfile)for row in reader:# 每行包括两个字段:链接和标题link, title = row# 将链接和标题作为元组添加到数据列表中data.append((link, title))# 使用浏览器访问网页
driver.get("https://www.csdn.net/qc")
for link,title in data:driver.find_element(By.CSS_SELECTOR, ".el-input__inner").send_keys(f"{link}",link)driver.find_element(By.CSS_SELECTOR, ".trends-input-box-btn").click()time.sleep(0.5)soc = driver.find_element(By.XPATH, '//*[@id="floor-csdn-index_850"]/div/div[1]/div/div[2]/p[1]').textprint(title,soc)time.sleep(1)
driver.quit()
这段代码是一个Python脚本,使用了CSV模块和Selenium库来自动化获取CSDN文章的质量分数。下面我将逐行详细解释这段代码的功能和作用:
- 导入必要的库:
import csv
import time
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
这里导入了CSV模块(用于读取CSV文件)、time模块(用于添加延迟等待)、以及Selenium相关的模块和类。
- 配置Selenium选项:
option = Options()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
option.add_argument('--disable-blink-features=AutomationControlled')
option.add_argument('--headless') # 启用无头模式
这部分代码配置了Selenium的选项。其中,Options
是用于配置Chrome浏览器的选项,add_experimental_option
用于设置Chrome的实验性选项,以避免被检测为自动化程序。--disable-blink-features=AutomationControlled
用于禁用某些自动化特性,而--headless
则启用了无头模式,使得浏览器在后台运行,不会显示界面。
- 创建Chrome WebDriver实例:
driver = webdriver.Chrome(options=option)
这里创建了一个Chrome WebDriver实例,使用了上述配置选项。WebDriver将用于模拟浏览器操作。
- 创建一个空列表用于存储数据:
data = []
这个列表将用于存储从CSV文件中读取的数据。
- 打开CSV文件并读取内容:
with open('data.csv', 'r', encoding='utf-8') as csvfile:reader = csv.reader(csvfile)for row in reader:link, title = rowdata.append((link, title))
这部分代码使用open
函数打开名为"data.csv"的CSV文件,并使用csv.reader
来读取文件的内容。每一行都包括两个字段:链接和标题,这些数据被添加到之前创建的data
列表中。
- 使用浏览器访问网页:
driver.get("https://www.csdn.net/qc")
这行代码使用WebDriver打开了CSDN网站的首页,准备开始搜索文章的质量分数。
- 迭代处理CSV文件中的每一行数据:
for link, title in data:driver.find_element(By.CSS_SELECTOR, ".el-input__inner").send_keys(f"{link}", link)driver.find_element(By.CSS_SELECTOR, ".trends-input-box-btn").click()time.sleep(0.5)soc = driver.find_element(By.XPATH, '//*[@id="floor-csdn-index_850"]/div/div[1]/div/div[2]/p[1]').textprint(title, soc)time.sleep(1)
在这个循环中,我们对CSV文件中的每一行数据执行以下操作:
- 使用
driver.find_element
通过CSS选择器定位搜索框,并在搜索框中输入文章链接。 - 使用
driver.find_element
定位搜索按钮,并模拟点击搜索按钮。 - 延迟0.5秒以等待页面加载完毕。
- 使用XPath表达式定位质量分数元素,并提取其文本内容。
- 打印文章标题和质量分数。
- 延迟1秒以确保不会频繁访问网站。
- 最后,使用
driver.quit()
关闭浏览器窗口,释放资源。
这段代码的主要作用是自动化地访问CSDN网站,搜索文章链接,提取文章的质量分数,并将结果打印出来。这对于批量获取文章质量分数非常有用,而无需手动一个个查看。
当然,我将为你添加前言、摘要和总结来完善这篇文章。
总结
通过本文的学习,你将掌握使用Scrapy和Selenium自动获取个人CSDN文章质量分数的技能。这将帮助你更好地了解你的博客表现,以及哪些文章受到了更多的关注和评价。
同时,你也学到了如何设置Scrapy爬虫项目,配置爬虫规则,以及如何处理数据。这些技能对于进行各种网络数据采集任务都是非常有用的。
希望本文对你的网络数据采集和分析工作有所帮助,让你能够更好地理解你的读者和观众。如果你有任何问题或疑问,欢迎提出,我们将竭诚为你提供帮助。
相关文章:
Scrapy+Selenium自动化获取个人CSDN文章质量分
前言 本文将介绍如何使用Scrapy和Selenium这两个强大的Python工具来自动获取个人CSDN文章的质量分数。我们将详细讨论Scrapy爬虫框架的使用,以及如何结合Selenium浏览器自动化工具来实现这一目标。无需手动浏览每篇文章,我们可以轻松地获取并记录文章的…...
【Android Framework系列】第15章 Fragment+ViewPager与Viewpager2相关原理
1 前言 上一章节【Android Framework系列】第14章 Fragment核心原理(AndroidX版本)我们学习了Fragment的核心原理,本章节学习常用的FragmentViewPager以及FragmentViewPager2的相关使用和一些基本的源码分析。 2 FragmentViewPager 我们常用的两个Page…...
typeof的作用
typeof 是 JavaScript 中的一种运算符,用于获取给定值的数据类型。 它的作用是返回一个字符串,表示目标值的数据类型。通过使用 typeof 运算符,我们可以在运行时确定一个值的类型,从而进行相应的处理或逻辑判断。 常见的数据类型…...
性能测试 —— Tomcat监控与调优:status页监控
Tomcat服务器是一个免费的开放源代码的Web 应用服务器,Tomcat是Apache 软件基金会(Apache Software Foundation)Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。 Tomcat是一个轻量级应用服务器,在中小型系统…...
Ubuntu 安装 CUDA 与 CUDNN GPU加速引擎
一、NVIDIA(英伟达)显卡驱动安装 NVIDIA显卡驱动可以通过指令sudo apt purge nvidia*删除以前安装的NVIDIA驱动版本,重新安装。 1.1. 关闭系统自带驱动nouveau 注意!在安装NVIDIA驱动以前需要禁止系统自带显卡驱动nouveau…...
pdf文件太大如何处理?教你pdf压缩简单方法
PDF文件过大,是很多人在使用PDF文件时都遇到过的一个常见问题,过大的PDF文件不仅会占用大量的存储空间,还会影响文件传输和处理效率,下面给大家总结了几个方法,帮助大家解决PDF文件过大的问题。 方法一:嗨格…...
Nacos使用教程(二)——nacos注册中心(1)
文章目录 Nacos vs Eureka介绍架构设计Nacos架构Eureka架构 功能特性服务注册与发现配置管理健康检查 生态系统支持可用性与稳定性总结 Nacos中的CAP原则介绍CAP原则一致性(Consistency)可用性(Availability)分区容错性࿰…...
蓝桥杯2023年第十四届省赛真题-买瓜--C语言题解
目录 蓝桥杯2023年第十四届省赛真题-买瓜 题目描述 输入格式 输出格式 样例输入 样例输出 提示 【思路解析】 【代码实现】 蓝桥杯2023年第十四届省赛真题-买瓜 时间限制: 3s 内存限制: 320MB 提交: 796 解决: 69 题目描述 小蓝正在一个瓜摊上买瓜。瓜摊上共有 n 个…...
R语言进行孟德尔随机化+meta分析(1)---meta分析基础
目前不少文章用到了孟德尔随机化meta分析,今天咱们也来介绍一下,孟德尔随机化meta其实主要就是meta分析的过程,提取了孟德尔随机化文章的结果,实质上就是个meta分析,不过多个孟德尔随机化随机化的结果合并更加加强了结…...
网络安全第一次作业
1、什么是防火墙 防火墙是一种网络安全系统,它根据预先确定的安全规则监视和控制传入和传出的网络流量。其主要目的是阻止对计算机或网络的未经授权的访问,同时允许合法通信通过。 防火墙可以在硬件、软件或两者的组合中实现,并且可以配置为根…...
idea设置gradle
1、不选中 2、下面选specified location 指定gradle目录...
基于Elasticsearch的多文档检索 比如 商品(goods)、案例(cases)
概述 Elasticsearch多文档聚合检索 详细 记得把这几点描述好咯:需求(要做什么) 代码实现过程 项目文件结构截图 演示效果 应用场景 我们需要在五种不同的文档中检索数据。 比如 商品(goods)、案例(ca…...
9月18日,每日信息差
今天是2023年09月19日,以下是为您准备的11条信息差 第一、江苏无锡首次获得6000年前古人类DNA 第二、全球天然钻石价格暴跌。数据显示,国际钻石交易所钻石价格指数在2022年3月达到158的历史峰值,之后一路下跌到目前的110左右,创…...
基于FPGA实现FPDLINK III
功能概述 本模块主要包含FPDLINKIII/CML收发信号与HDMI/SDI/USB信号、千兆网络信号,支持客户按照按照指定功能定制 当前默认功能为FPD LINK III/CML转为HDMI/SDI/UVC信号 性能参数 名称 描述 供电接口 DC12V FPD LINK RX GM8914 FPD LINK TX GM8913 千兆网…...
[补题记录] Atcoder Beginner Contest 309(E)
URL:https://atcoder.jp/contests/abc309 目录 E Problem/题意 Thought/思路 解法一: 解法二: Code/代码 E Problem/题意 一个家庭有 N 个人,根节点为 1,给出 2 ~ N 的父节点。一共购买 M 次保险,每…...
【HarmonyOS】解决API6 WebView跳转外部浏览器问题、本地模拟器启动黑屏
【问题描述1】 HarmonyOS API6 Java开发中使用WebView组件,如果网页中有跳转链接,点击会跳转到手机系统浏览器。 【解决方案】 解决这个问题的方法就是给WebView这种自定义的WebAgent对象。具体代码如下: WebConfig webConfigthis.webView…...
给出三个整数,判断大小
7-2 比较大小 给出三个整数,判断大小。 输入格式: 给出三个整数a,b,c 输出格式: 在一行中依次从小到大的顺序输出,两数之间有一个空格,无多余空格。 输入样例: 在这里给出一组输入。例如: 2 1 5 输出样例: 在这里给出相应的输…...
优化软件系统,解决死锁问题,提升稳定性与性能 redis排队下单
项目背景: 随着用户数量的不断增加,我们的速卖通小管家软件系统面临了一个日益严重的问题:在从存储区提供程序的数据读取器中进行读取时,频繁出现错误。系统报告了一个内部异常: 异常信息如下: 从存储区提供程序的数…...
MyBatisPlus 底层用 json 存储,Java 仍然使用 对象操作
PO 类的字段定义为一个对象,然后使用以下注解修饰 TableField(typeHandler JacksonTypeHandler.class) 当然 jsonTypeHandler 有多种可以选择...
发送验证码倒计时 防刷新重置!!!
需求:发送验证码,每60s可点击发送一次,倒计时中按钮不可点击,且刷新页面倒计时不会重置 可用以下方式避免刷新页面时,倒计时重置 localStorage本地缓存方式 思路: 1.记录倒计时的时间 2.页面加载时&…...
OpenCV项目开发实战--forEach的并行像素访问与其它方法的性能比较
在本教程中,我们将比较Mat 类的forEach方法与 OpenCV 中访问和转换像素值的其他方法的性能。我们将展示forEach如何比简单地使用at方法甚至有效地使用指针算术快得多。 OpenCV 内部有一些隐藏的宝石,有时并不为人所知。这些隐藏的宝石之一是Mat 类的forEach方法,它利用计算…...
cv::Mat 的常见操作方法
cv::Mat是OpenCV库中用于处理图像和矩阵的主要数据结构。以下是一些常见的cv::Mat操作方法: 创建和初始化 cv::Mat::Mat(): 创建一个空的cv::Mat对象。cv::Mat::Mat(int rows, int cols, int type): 创建一个指定行数、列数和数据类型的cv::Mat对象。cv::Mat::Mat(i…...
JVM——11.JVM小结
这篇文章我们来小结一下JVM JVM,即java虚拟机,是java代码运行时的环境。我们从底层往上层来说,分别是硬件部分,操作系统,JVM,jre,JDK,java代码。JVM是直接与操作系统打交道的。JVM也…...
月木学途开发 2.前台用户模块
概述 效果展 数据库设计 会员表 DROP TABLE IF EXISTS user_type; CREATE TABLE user_type (userTypeId int(11) NOT NULL AUTO_INCREMENT,userTypeName varchar(255) DEFAULT NULL,userTypeDesc varchar(255) DEFAULT NULL,PRIMARY KEY (userTypeId) ) ENGINEInnoDB AUTO_I…...
buuctf-ciscn_s_3
一、srop 参考文章-博客园-wudiiv11(作者)-BUUCTF-ciscn_2019_s_3 参考文章-博客园-z2yh(作者)-Srop 原理与利用方法 vlun函数中没有分配栈帧(指rsp没有增长,也没有压入父函数的rbp,这也导致…...
3D模型格式转换工具HOOPS Exchange协助Epic Games实现CAD数据轻松导入虚幻引擎
一、面临的挑战 Epic Games最为人所知的身份可能是广受欢迎的在线视频游戏Fortnite的开发商,但它也是虚幻引擎背后的团队,虚幻引擎是一种实时3D创作工具,为世界领先的游戏提供动力,并且也被电影电视、建筑、汽车、制造、模拟等领…...
Linux- inode vnode
什么是inode inode 是 UNIX 和 UNIX-like 操作系统中的一个关键概念。它代表了文件系统中文件或目录的元数据。每个文件和目录在文件系统中都有一个与之关联的 inode。这个数据结构存储了关于文件的所有信息,除了其名称和实际数据之外。 以下是 inode 中通常包含的…...
不来看看?通过Python实现贪吃蛇小游戏
🏅我是默,一个在CSDN分享笔记的博主。📚📚 🌟在这里,我要推荐给大家我的专栏《Python》。🎯🎯 🚀无论你是编程小白,还是有一定基础的程序员,这个专…...
C# linq初探 使用linq查询数组中元素
使用linq进行数组查询 输出数组中全部的偶数并升序输出结果 写法1: int[] numbers { 5, 10, 8, 3, 6, 12 }; //查询的数组var numqurey from num in numberswhere num % 2 0 //按照条件过滤orderby numselect num;foreach (var num in numqurey){Console.Writ…...
使用线程池进行任务处理
线程池 线程池:一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分…...
网站关键词可以做几个/企业邮箱哪个好
点击上方“蓝色字”可关注我们!暴走时评:日本交易所集团最近发布超级账本研究报告,对比目前主要的几种DLT方案,阐述该技术如何提高交易效率,以及该技术在金融服务中的可行性。作者提到秘密资产交易可能带来中心化和交易…...
北京网站优化seo/百度关键词热度查询
电脑组装、维护及使用过程中小软件下载转载于:https://blog.51cto.com/johnemoney/32482...
wordpress文章调用插件/求职seo服务
简单面试题,但是容易忘记 1.为什么等待和通知是在 Object 类而不是 Thread 中声明的? **1) wait 和 notify 不仅仅是普通方法或同步工具,更重要的是它们是 Java 中两个线程之间的通信机制。**对语言设计者而言, 如果不能通过 Java 关键字(例…...
php网站开发做什么/下载一个百度时事新闻
第一道整体二分,因为只需要知道每个询问区间中比mid大的数有多少个,就可以直接用线段树区间加,区间求和了。 1 #include<iostream>2 #include<cstdio>3 #include<cstring>4 #include<algorithm>5 #define int long l…...
用python做网页/北京seo公司wyhseo
小白学Linux之gcc的一些常见用法 1.gcc编译器对程序的编译,分为四个阶段: 1>预编译(pre-processing):在预处理阶段,输入的是C语言的源文件,通常为*.c。它们一般带有*.h之类的头文件。这个阶段主要处理源文件中的#if…...
集团公司网站设计/1688官网入口
本人用入栈出栈来模拟递归的过程,下面是栈的结构和递归代码和非递归:typedef struct{int *base;int top;}Stack;void Nonrec_QuickSort(SqList &L,int low,int high)//非递归的快速排序{if(low>high)return;int left;int right;int pivot;Stack S…...