利用python爬取本站的所有博客链接

目录

前因

首先的尝试

解决办法

导入包

定义一个json配置文件

打开浏览器执行操作

注意

提取源代码并且进行筛选链接

执行结果


前因

由于自己要把csdn的博客同步到hugo中,把博客转为md格式已经搞好了,但是由于csdn的图片具有防盗链,所以打算把所有的图片爬取下来,然后保存在本地

刚好本人略懂一些python,所以自己先写了一个脚本用来爬取各个博客的链接,如果不想听我多bb的直接去我的github看源码

GitHub - mumuhaha487/Get_csdnContribute to mumuhaha487/Get_csdn development by creating an account on GitHub.https://github.com/mumuhaha487/Get_csdn

首先的尝试

首先的尝试就是利用简单好用的request包进行爬取。

但是由于csdn的博客是不显示全部,滑动底部时更新一部分

request包可能做不了这么复杂的工作QAQ

好像https://blog.csdn.net/你的名字/article/list/链接可以用request包进行爬取

解决办法

那么恰好我有学过一点点的selenium包,所以搞了一个自动化的形式通过模拟鼠标滑动到文章的底部来获取到所有的文章链接

导入包

各个包都有解释用途

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains    #用于自动化框架执行动作
import time     #延时操作,方便网站加载完全
import json     #用于读取配置信息
import re   #从源代码中提取文章的链接

定义一个json配置文件

定义一个json配置文件方便管理

现在文件只有用户名称,后续可加配置

bash 复制代码
{
  "blog_id": "mumuemhaha"
}

读取用户名称,并且将其拼接成csdn个人博客链接

python 复制代码
with open("./config.json",'r') as file_1:
    data_1=json.load(file_1)

blog_id=data_1["blog_id"]
url_1=f"https://blog.csdn.net/{blog_id}?type=blog"

打开浏览器执行操作

注意

这里由于不知道要下滑多少次,所以可以设定一个很大的数字然后每滑动十次判断源代码是否更新,然后源代码没有变化则跳出循环即可(

python 复制代码
driver = webdriver.Chrome()
driver.get(url_1)
for i in range(10000):
    time.sleep(0.5)
    actions = ActionChains(driver)
    actions.send_keys(Keys.PAGE_DOWN)  # 可以多次发送 PAGE_DOWN 来实现滚动的距离
    actions.perform()
    if i % 10 == 0:  # 每滑动 10 次进行判断
        prev_page_source = driver.page_source  # 获取前一次滑动后的页面源码
        time.sleep(2)  # 等待页面加载
        current_page_source = driver.page_source  # 获取当前页面源码

        if prev_page_source == current_page_source:
            print("网站滑倒底了,跳出循环...")
            break

提取源代码并且进行筛选链接

python 复制代码
req_1=driver.page_source
re_1='<a data-v-6fe2b6a7="" href="(.*?)"'
blog_urls=re.findall(re_1,req_1)

执行结果

我加了一个打印链接个数的代码来判断是否全部爬取下来了

python 复制代码
print(f"文章个数为{len(blog_urls)}(看看是不是全爬下来了)")

全部代码为

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains    #用于自动化框架执行动作
import time     #延时操作,方便网站加载完全
import json     #用于读取配置信息
import re   #从源代码中提取文章的链接
with open("./config.json",'r') as file_1:
    data_1=json.load(file_1)

blog_id=data_1["blog_id"]
url_1=f"https://blog.csdn.net/{blog_id}?type=blog"
driver = webdriver.Chrome()
driver.get(url_1)
for i in range(10000):
    time.sleep(0.5)
    actions = ActionChains(driver)
    actions.send_keys(Keys.PAGE_DOWN)  # 可以多次发送 PAGE_DOWN 来实现滚动的距离
    actions.perform()
    if i % 10 == 0:  # 每滑动 10 次进行判断
        prev_page_source = driver.page_source  # 获取前一次滑动后的页面源码
        time.sleep(2)  # 等待页面加载
        current_page_source = driver.page_source  # 获取当前页面源码

        if prev_page_source == current_page_source:
            print("网站滑倒底了,跳出循环...")
            break

req_1=driver.page_source
re_1='<a data-v-6fe2b6a7="" href="(.*?)"'
blog_urls=re.findall(re_1,req_1)
print(f"文章个数为{len(blog_urls)}(看看是不是全爬下来了)")
相关推荐
Hello.Reader3 分钟前
在 Rust 中实现面向对象的状态模式
开发语言·rust·状态模式
JouJz5 分钟前
Java虚拟机之垃圾收集(一)
java·开发语言·jvm
vortex516 分钟前
在Kali中使用虚拟环境安装python工具的最佳实践:以 pwncat 为例
linux·python·网络安全·渗透测试·pip·kali
五行星辰37 分钟前
Java链接redis
java·开发语言·redis
邪恶的贝利亚37 分钟前
C++之序列容器(vector,list,dueqe)
开发语言·c++
原来是猿38 分钟前
蓝桥备赛(13)- 链表和 list(上)
开发语言·数据结构·c++·算法·链表·list
异常驯兽师40 分钟前
Java集合框架深度解析:List、Set与Map的核心区别与应用指南
java·开发语言·list
AntBlack1 小时前
Python 打包笔记 : 你别说 ,PyStand 确实简单易上手
后端·python·创业
Ryan_Gosling2 小时前
QT-异步编程
开发语言·qt
Pocker_Spades_A2 小时前
Python刷题:Python基础
开发语言·python