> 我真服了。。。。太久没登,回来一看自个写的公开文章变vip文章了。。。。。。
>
好活
# 准备整个脚本把文章下载导出markdown
找了一下,发现之前的的方法挺多都修复了。。。还加了反爬机制,自带的导出pdf文档,里面的代码无法完全显示
>找了下是最新的方法:[CSDN文章导出md并迁移至博客园](https://blog.csdn.net/qq_35204012/article/details/142504118) 准备迁移过去了
## 尝试1
看了下脚本,说是要把所有文章全部开放,不能有vip文章或者付费,否则会爬取失败。。。。。可是平台已经给我自动设置成了vip文章了。。。不想手动一篇篇重新发布修改了(好像有脚本可以一键改来着,不过改了要全部重新发布)
## 尝试2,使用edge编程
可以看到如果是使用了markdown编辑器编辑的文章,在上面是有一个导出的操作的,可以导出成markdown或者是html文件。
==参考:==
[python模拟操作edge浏览器,完成问题的采集](https://blog.csdn.net/weixin_42771529/article/details/138114136)
[Python爬虫实战——获取指定博主所有专栏链接及博文链接](https://blog.csdn.net/qq_53381910/article/details/130816856)
>查看版本信息
下个对应版本驱动然后丢在python的目录下面,我下的驱动版本后面几位数对不上,应该能用
>直接丢脚本,写的比较拉,有时会崩溃。。。能用就行.jpg
>==注意事项:这个只能导出自己写并发布的文章,本质就是模拟点击使用官方编辑器导出markdown文档==
```python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import WebDriverException
from bs4 import BeautifulSoup
import os
import requests
import time
import pickle
#from DrissionPage import ChromiumOptions
# 初始化Edge浏览器驱动
page = None
# 保存cookies,登录成功后随便输入个字符就行
def SaveCookies():
global page
# 等待一段时间
time.sleep(5)
#input("input something:")
# 在成功登录后,保存 Cookies
cookies = page.get_cookies()
with open("cookies.pkl", "wb") as cookies_file:
pickle.dump(cookies, cookies_file)
def login():
global page
# 尝试加载之前保存的 Cookies
try:
page.get("https://blog.csdn.net") # 替换为你想要打开的URL
with open("cookies.pkl", "rb") as cookies_file:
cookies = pickle.load(cookies_file)
for cookie in cookies:
page.add_cookie(cookie)
page.refresh() # 刷新页面以应用 Cookies
except FileNotFoundError:
print("没有找到 Cookies 文件,请先手动登录并保存 Cookies。")
time.sleep(60) # 一分钟内登录
SaveCookies()
def click_element(driver, locator, wait_time=20):
""" 封装点击元素的函数,支持重试机制 """
for _ in range(3): # 重试 3 次
try:
element = WebDriverWait(driver, wait_time).until(EC.element_to_be_clickable(locator))
element.click()
time.sleep(3) #点击完成后等待3s
return True
except Exception as e:
print(f"尝试点击元素失败: {e}")
#page.refresh() # 有时会卡住,要刷新一下页面
time.sleep(5) # 等待一段时间后重试
return False
#导出为md文档
def ExportMarkDown(title,url):
global page
#page.get(url)
max_retries = 3 # 最多重试次数
for attempt in range(max_retries):
try:
page.get(url)
# 等待编辑按钮可点击并点击 ,测试发现点击太快了,还反应不过来
if not click_element(page, (By.CLASS_NAME, "href-article-edit")):
print("未能找到编辑按钮")
continue
# 找到导出按钮并点击
if not click_element(page, (By.XPATH, "//button[@data-title='导出']")):
print("未能找到导出按钮")
continue
# 导出为markdown文件
if not click_element(page, (By.XPATH, "//div[contains(text(), '导出为 Markdown文件')]")):
print("未能找到导出按钮")
continue
break # 成功则退出循环
except WebDriverException as e:
print(f"尝试 {attempt + 1}/{max_retries} 失败: {e}")
time.sleep(3) # 等待一段时间后重试
else:
print("所有尝试均失败")
with open('failurl.txt',"w+",encoding="utf-8") as f:
f.write("[{}]({})".format(title,url) + "\n")
return
# # 导出为html文件
# if not click_element(page, (By.XPATH, "//div[contains(text(), '导出为 HTML文件')]")):
# print("未能找到导出按钮")
# return
# if not click_element(page, (By.XPATH, "//button[contains(text(), '确认')]")):
# print("未能找到导出按钮")
# return
#获取个人空间下的所有文章链接
def GetAllUrl(user):
url = "https://blog.csdn.net/{}".format(user)
# 构造请求头
headers={
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36'
}
# 发送get请求
r=requests.get(url = url,headers=headers,timeout = 5)
# 处理
soup=BeautifulSoup(r.text,'html.parser')
# 获取用户名
div = soup.find("div",class_ = "user-profile-head-name")
username = div.text.split(" ")[0]
# 查找专栏链接
divs = soup.find_all("div",class_ = "aside-common-box-content")
div = divs[1]
lis = div.find_all("li")
titles = []
infos = {}
# 爬取专栏链接及链接名
if os.path.isfile(user+"_categoty_link.txt"):
# 如果文件存在,删除文件
os.remove(user+"_categoty_link.txt")
for li in lis:
# print("####")
url = li.find("a").attrs['href']
title = li.find("span").attrs['title']
titles.append(title) #所有专栏名称
infos[title] = {"url":url}
#print(infos)
with open("{}的博文.md".format(username),"w+",encoding="utf-8") as f:
# 爬取专栏下的博文
templist = []
for title in titles:
# if True:
print(title)
f.write("# {}".format(title.replace(" ","").replace("\n","")) + "\n")
r = requests.get(url=infos[title]["url"], headers=headers, timeout=5)
soup = BeautifulSoup(r.text, 'html.parser')
lis_2 = soup.find("ul", class_="column_article_list").find_all("li")
print("###########{}##########\n".format(title))
for li in lis_2:
#print(li)
title = li.find("div",class_ = "column_article_title").text.strip()
href = li.find("a").attrs['href']
print(title,href)
#有重复链接,去一下重
if href not in templist:
f.write("[{}]({})".format(title,href) + "\n")
ExportMarkDown(title,href)
templist.append(href)
time.sleep(3) #延时3s
#这个脚本只能导出自己写的文章,不然是没有编辑按钮的
if __name__ == "__main__":
try:
page = webdriver.Edge()
login()
user = '准备跑路' # 替换成自己的用户名
GetAllUrl(user)
finally:
page.quit()
#ExportMarkDown("https://blog.csdn.net/ookami6497/article/details/132840398")
input()
```
>稍微说明一下,这个要在弹出的浏览器页面扫码登一下,然后会把你的cookie保存到本地,如果脚本崩了就不用再次登录了
```python
# 保存cookies,登录成功后随便输入个字符就行
def login():
global page
# 尝试加载之前保存的 Cookies
try:
page.get("https://blog.csdn.net") # 替换为你想要打开的URL
with open("cookies.pkl", "rb") as cookies_file:
cookies = pickle.load(cookies_file)
for cookie in cookies:
page.add_cookie(cookie)
page.refresh() # 刷新页面以应用 Cookies
except FileNotFoundError:
print("没有找到 Cookies 文件,请先手动登录并保存 Cookies。")
time.sleep(60) # 一分钟内登录
SaveCookies()
```
>然后整个脚本把markdown中的图片链接全部拉一份到本地就ok了
标签:cookies,markdown,title,url,导出,vip,文章,print,page From: https://www.cnblogs.com/ctrl-moyu/p/18544432