Scrapy+Selenium自动化获取个人CSDN文章质量分

news2024/9/25 15:24:08

前言

本文将介绍如何使用Scrapy和Selenium这两个强大的Python工具来自动获取个人CSDN文章的质量分数。我们将详细讨论Scrapy爬虫框架的使用,以及如何结合Selenium浏览器自动化工具来实现这一目标。无需手动浏览每篇文章,我们可以轻松地获取并记录文章的质量分数,从而更好地了解我们的博客表现。

Scrapy相关基础知识:
爬虫框架Scrapy学习笔记-1

爬虫框架Scrapy学习笔记-2

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 scrapy

class 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 scrapy


class 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 scrapy


class 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 ItemAdapter


class 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 Options

option = 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]').text
    print(title,soc)
    time.sleep(1)
driver.quit()

这段代码是一个Python脚本,使用了CSV模块和Selenium库来自动化获取CSDN文章的质量分数。下面我将逐行详细解释这段代码的功能和作用:

  1. 导入必要的库:
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相关的模块和类。

  1. 配置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则启用了无头模式,使得浏览器在后台运行,不会显示界面。

  1. 创建Chrome WebDriver实例:
driver = webdriver.Chrome(options=option)

这里创建了一个Chrome WebDriver实例,使用了上述配置选项。WebDriver将用于模拟浏览器操作。

  1. 创建一个空列表用于存储数据:
data = []

这个列表将用于存储从CSV文件中读取的数据。

  1. 打开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))

这部分代码使用open函数打开名为"data.csv"的CSV文件,并使用csv.reader来读取文件的内容。每一行都包括两个字段:链接和标题,这些数据被添加到之前创建的data列表中。

  1. 使用浏览器访问网页:
driver.get("https://www.csdn.net/qc")

这行代码使用WebDriver打开了CSDN网站的首页,准备开始搜索文章的质量分数。

  1. 迭代处理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]').text
    print(title, soc)
    time.sleep(1)

在这个循环中,我们对CSV文件中的每一行数据执行以下操作:

  • 使用driver.find_element通过CSS选择器定位搜索框,并在搜索框中输入文章链接。
  • 使用driver.find_element定位搜索按钮,并模拟点击搜索按钮。
  • 延迟0.5秒以等待页面加载完毕。
  • 使用XPath表达式定位质量分数元素,并提取其文本内容。
  • 打印文章标题和质量分数。
  • 延迟1秒以确保不会频繁访问网站。
  1. 最后,使用driver.quit()关闭浏览器窗口,释放资源。

这段代码的主要作用是自动化地访问CSDN网站,搜索文章链接,提取文章的质量分数,并将结果打印出来。这对于批量获取文章质量分数非常有用,而无需手动一个个查看。
当然,我将为你添加前言、摘要和总结来完善这篇文章。

总结

通过本文的学习,你将掌握使用Scrapy和Selenium自动获取个人CSDN文章质量分数的技能。这将帮助你更好地了解你的博客表现,以及哪些文章受到了更多的关注和评价。

同时,你也学到了如何设置Scrapy爬虫项目,配置爬虫规则,以及如何处理数据。这些技能对于进行各种网络数据采集任务都是非常有用的。

希望本文对你的网络数据采集和分析工作有所帮助,让你能够更好地理解你的读者和观众。如果你有任何问题或疑问,欢迎提出,我们将竭诚为你提供帮助。

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

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

相关文章

OpenCV实现的F矩阵+RANSAC原理与实践

1 RANSAC 筛选 1.1 大致原理 Random sample consensus (RANSAC),即随机抽样一致性,其是一种用于估计模型参数的迭代方法,特别适用于处理包含离群点(outliers)的数据集 RANSAC 的主要思想是随机采样数据点&#xff0…

SpringBoot文件上传-阿里云OSS

1.打开阿里云 说明:登录阿里云账号 2.点击AccessKey管理 3.创建AccessKey 说明:记得复制accessKeyId,accessKeySecret并保存起来 4. 点击对象存储OSS 5.创建Bucket 说明:创建储存桶 6.查看SDK示例 7.Java简单上传 8.上传文件流…

已解决 AttributeError: ‘str‘ object has no attribute ‘decode‘

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页: 🐅🐾猫头虎的博客🎐《面试题大全专栏》 🦕 文章图文并茂&#x1f996…

相对论的应用:GPS导航

“但是数学享有盛誉还有另一个原因:正是数学为精确的自然科学提供了一定程度的安全保障,而没有数学,它们就无法实现这一点。” “就现实而言,数学定律是不确定的;就其确定而言,它们并不涉及现实。” —阿尔…

Mysql高级——索引优化和查询优化(1)

索引优化 1. 数据准备 学员表插50万条, 班级表插1万条。 建表 CREATE TABLE class (id INT ( 11 ) NOT NULL AUTO_INCREMENT,className VARCHAR ( 30 ) DEFAULT NULL,address VARCHAR ( 40 ) DEFAULT NULL,monitor INT NULL,PRIMARY KEY ( id ) ) ENGINE INNO…

解决Win11/10中Edge浏览器页面加载不出来、打不开问题|有网但是打不开,加载不了

问题症状 edge浏览器打不开,有网络能正常上网,但是edge浏览器无法浏览。网络质量很高,但是页面就是加载不出来,详情如下: (我是在科学上网后造成这样子的原因,现在将我的方法分享一下&#xff…

Flask狼书笔记 | 09_图片社交网站 - 大型项目的架构与需求

文章目录 9 图片社交网站9.1 项目组织架构9.2 编写程序骨架9.3 高级用户认证9.4 基于用户角色的权限管理9.5 使用Flask-Dropzone优化文件上传9.6 使用Flask-Avatars处理用户头像9.7 图片展示与管理9.8 收藏图片9.9 用户关注9.10 消息提醒9.11用户资料与账户设置9.12 首页与探索…

近万采集各种典故网站文章大全ACCESS\EXCEL数据库

一个学语文的朋友问我有没有关于各种典故以及万物由来的数据,我看了看手头的资料发现还真没有,而且网上似乎也没有这一类的成品,因此就用程序采集了一个典故网的文章。 分类统计情况有:成语典故(共4198条)、…

第三、四、五场面试

第三场 共享屏幕做题(三道简单题) 替换空格成%20(双指针) 删除升序链表中的重复元素(指针)有效的括号(栈) 第四场、第五场 自我介绍 项目拷打 整个项目架构rpc模块的情况分析的数…

【UE 粒子练习】01——练习前的准备

步骤 1. 首先在虚幻商城中搜索如下资产然后创建工程 2. 打开新建的示例工程然后新建一个空白关卡 3. 将“BP_DemoRoom”拖入视口 这里设置“Base Room Size”为5 移入“BP_DemoDisplay” 这里“Description”设置为“Standard Sprite Emitter” 通过快捷键Alt来快速复制一份“…

FireFly PowerBASIC RAD编程,调用PowerBASIC COM对象

一、序言 初步看了看PowerBASIC编程,很类似用VC注册窗体后调用回调函数,先是一个Dialog new,然后添加组件 Control add ......, 然后在处理 Windows MSG和发给组件的消息,这种编程方式和早期DOS 25x80屏幕上编程一样&…

UWB学习——day5

旁瓣的控制 在UWB(Ultra-Wideband,超宽带)通信系统中,对主瓣和旁瓣进行控制和优化是重要的,因为这直接影响了信号的传输质量、抗干扰性和系统性能。 旁瓣出现的原因 频谱泄露,根据傅里叶变换原理&#x…

uniapp实时获取当前位置

首先我们需要先下载一个插件(高德地图官网插件) (插件主要作用是获取当前地理定位或者是自身的位置,并且可以返回名称name) 相关下载-微信小程序插件 | 高德地图API (amap.com)https://developer.amap.com/api/wx/do…

旅游出行类APP如何找到策略优势,最大化流量红利

刚刚结束了暑期出游,中秋国庆小长假马上到啦,出行计划又要安排起来了!多样化的出行方式为大家旅行带来极大的便利,同时,伴随互联网模式的深化发展,各式各样的旅游出行类APP已经成长为旅行用户所依赖的一类工…

【LeetCode热题100】--128. 最长连续序列

128.最长连续序列 先对数组进行排序,不断尝试x1,x2,…是否存在,不断枚举并更新答案 class Solution {public int longestConsecutive(int[] nums) {if (nums null || nums.length 0){return 0;}Arrays.sort(nums);int maxLength 1,current 1;for(in…

LVM分区空间扩充

老早之前自己整理的,今天有同事问起,再整理一下发出来。 LVM的全称为Logical Volume Manager,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活…

MySQL: 锁

一、table CREATE TABLE dog (id int(11) NOT NULL AUTO_INCREMENT,age int(11) DEFAULT NULL,weight int(11) DEFAULT NULL,PRIMARY KEY (id),KEY idx_age (age) ) ENGINEInnoDB AUTO_INCREMENT51 DEFAULT CHARSETutf8二、插入数据: 三、主键上锁的测试&#xff…

C++中的四种类型转换运算符

隐式类型转换是安全的,显式类型转换是有风险的,C语言之所以增加强制类型转换的语法,就是为了强调风险,让程序员意识到自己在做什么。但是,这种强调风险的方式还是比较粗放,粒度比较大,它并没有表明存在什么风险,风险程度如何。 再者,C风格的强制类型转换统一使用( ),…

linux上mysql数据备份(全量备份策略+增量备份策略)

执行备份策略前,先做好scp命令的准备 解决思路: 生成SSH公钥/私钥后,您需要将公钥添加到服务器上,从而使服务器可以使用该公钥来验证您的身份。 生成SSH公钥/私钥的命令为 ssh-keygen -t rsa -b 4096什么都不用输入&#xff0c…

用于无功补偿的固定电容晶闸管控制反应器研究(Simulink)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…