Python 用selenium模块的webdriver类实现对CSDN博客的自定义排序分类

Python 用selenium模块的webdriver类实现对CSDN博客的自定义排序分类

下面分几个步骤
1.安装Chrome驱动器,需要安装对应浏览器版本的 网址:https://npm.taobao.org/mirrors/chromedriver

2.获得并保存登陆后个人列表的信息

3.自己保存的个人列表进行一个排序,并保存文件

4.根据保存的文件和当前博客的分类顺序进行模拟点击,完成排序过程。

1. 安装Chorme驱动器

​ 这里我查看了自己Chrome浏览器的版本,我在此安装的版本为: 72.0.3626.69/

​ 在程序中用selenium模块的webdriver进行一个Chrome驱动器的实现

    login_url = "https://passport.csdn.net/login"
    driver = webdriver.Chrome(executable_path=r'C:Users12495Desktopchromedriver.exe')

2.获得登陆后保存的个人列表信息

​ 这里分两个步骤

>1.登陆到个人分类页面 login函数
>
>2.保存数据 SaveListInfo
from selenium import webdriver #selenium的webdriver类的功能
import requests
import time
from lxml import etree
def login(AccountNumbers,Passworld):
    login_url = "https://passport.csdn.net/login"
    driver = webdriver.Chrome(executable_path=r'C:Users12495Desktopchromedriver.exe')
    # 1.用该浏览器打开页面
    driver.get(login_url)
    time.sleep(1)
    # 2.向对应id的表格发送信息
    driver.find_element_by_xpath('//*[@id="app"]/div/div/div/div[2]/div[2]/ul/li[1]/a').click()
    driver.find_element_by_id("all").send_keys(AccountNumbers)
    driver.find_element_by_id("password-number").send_keys(Passworld)
    driver.find_element_by_xpath(r'//*[@id="app"]/div/div/div/div[2]/div[2]/form/div/div[6]/div/button').click()
    time.sleep(3)
    SortUrl = 'https://mp.csdn.net/category/list'
    driver.get(SortUrl)
    try:
        driver.find_element_by_id("btnStart").click()
    except:
        print("Login Fail!")
        exit(1)
    time.sleep(1)
    return driver

def SaveListInfo(HtmlCode):#保存当前sort的信息保存
    Xpath = r'//li[@ class="d-flex align-items-center"]'
    element=etree.HTML(HtmlCode)
    ElementList=element.xpath(Xpath)
    with open("ListInfo.txt","w",encoding="utf-8") as fp:
        for i in range(len(ElementList)):
            element=ElementList[i]
            element=etree.HTML(etree.tostring(element))
            fp.write("{}  {} {}
".format(i,element.xpath(r'//input/@value')[0],element.xpath('//@data-id')[0]))
            
if __name__ == '__main__':
    AccountNumbers=input("请输入账号:")
    Password=input("请输入密码:")
    driver=login(AccountNumbers,Password)#第一步 得到一个当前页面的list Chrome 驱动
    SaveListInfo(driver.page_source)#第二步  保存数据
    time.sleep(5)
    driver.quit()

3.用保存的文件 自定义排序

在上一步的程序中得到一个ListInfo.txt文件  里面每行是一个分类的:顺序  名称  编号

​ 然后自己粘贴复制一轮乱搞,把信息排个序就行,像下面这样 ,(其实只要把id号按规定的排个序就行,名称只是个幌子,为了看清除)

>35 ------------------------动态规划--... 8057180
>36 【动态规划dp】 7495677
>37 【区间DP】 7671892
>38 状压dp 8633336
>39 数位DP 8597046
>40 期望/概率dp 8642191
>41 ------------------------图论----... 8057155
>42 【最短路径】 7425656
>43 【最小生成树】 7433840
>44 【并查集】 7799073
>45 【欧拉回路】 7732919

4.开始模拟浏览器进行分类处理

算法实现很简单:

现在对应该所处位置第 i 个 进行模拟点击

1.读取现在第i个分类所处的位置

2.计算位置差,从而点击多少次。

'''
程序需要:
1.登陆页面信息 程序提示输入
2.想要达到的ShoudleList.txt文件 第二步和第三步手动处理后的文件  (只要id号对应即可

'''
from selenium import webdriver #selenium的webdriver类的功能
import requests
import time
from lxml import etree
import os
def GetCookies(driver):#获得此时浏览器的cookies 是字典形式
    CookiesList = driver.get_cookies()
    # print(CookiesList)
    # 6.把cookies的name和value提取出来,作为键值对
    cookies = {}
    for i in CookiesList:
        cookies[i["name"]] = i["value"]
    return cookies
def SaveListInfo(HtmlCode):#保存当前sort的信息保存
    Xpath = r'//li[@ class="d-flex align-items-center"]'
    element=etree.HTML(HtmlCode)
    ElementList=element.xpath(Xpath)
    with open("ListInfo.txt","w",encoding="utf-8") as fp:
        for i in range(len(ElementList)):
            element=ElementList[i]
            element=etree.HTML(etree.tostring(element))
            fp.write("{} {} {}
".format(i,element.xpath(r'//input/@value')[0],element.xpath('//@data-id')[0]))
def IdToUp(driver,id,times):
    for i in range(times):
        driver.find_element_by_xpath('//li[@ data-id="{}"]/div/button[ @data-type="up"]'.format(id)).click()
        time.sleep(0.5)
def IdToDown(driver,id,times):
    for i in range(times):
        driver.find_element_by_xpath('//li[@ data-id="{}"]/div/button[ @data-type="down"]'.format(id)).click()
        time.sleep(0.5)
def login(AccountNumbers,Passworld):
    login_url = "https://passport.csdn.net/login"
    driver = webdriver.Chrome(executable_path=r'C:Users12495Desktopchromedriver.exe')
    # 1.用该浏览器打开页面
    driver.get(login_url)
    time.sleep(1)
    # 2.向对应id的表格发送信息
    driver.find_element_by_xpath('//*[@id="app"]/div/div/div/div[2]/div[2]/ul/li[1]/a').click()
    driver.find_element_by_id("all").send_keys(AccountNumbers)
    driver.find_element_by_id("password-number").send_keys(Passworld)
    driver.find_element_by_xpath(r'//*[@id="app"]/div/div/div/div[2]/div[2]/form/div/div[6]/div/button').click()
    time.sleep(20)
    SortUrl = 'https://mp.csdn.net/category/list'
    driver.get(SortUrl)
    try:
        driver.find_element_by_id("btnStart").click()
    except:
        print("Login Fail!")
        exit(1)
    time.sleep(1)
    return driver
def GetCurrentSortMap(HtmlCode):
    Xpath = r'//li[@ class="d-flex align-items-center"]'
    element=etree.HTML(HtmlCode)
    ElementList=element.xpath(Xpath)
    CurrentSortMap={}
    for i in range(len(ElementList)):#把每个element的 id:顺序(从0开始)
        element=ElementList[i]
        element=etree.HTML(etree.tostring(element))
        CurrentSortMap[element.xpath('//@data-id')[0]]=i
    return CurrentSortMap
def Init():
    EndSortList=[]#表示按照顺序排序之后的编号顺序
    with open("ShoudleList.txt","r",encoding="utf-8") as fp:
        while True:
            line=fp.readline()
            if not line:
                break
            EndSortList.append(line.split(" ")[-1][:-1])
    return EndSortList#标号从0开始
if __name__ == '__main__':

    EndSortList = Init() #排序后应该的id顺序
    AccountNumbers=input("请输入账号:")
    Password=input("请输入密码:")
    driver=login(AccountNumbers,Password)#得到一个当前页面的list Chrome 驱动
    for i in range(len(EndSortList)):#从应该的顺序从低到高 依次完成
        NeedSortId=EndSortList[i]
        CurrentSortMap=GetCurrentSortMap(driver.page_source)
        NowNumbers=CurrentSortMap[NeedSortId]
        if(NowNumbers>i):
            IdToUp(driver,NeedSortId,NowNumbers-i)
    SaveListInfo(driver.page_source)
    # IdToUp(driver,"8642191",22)
    time.sleep(5)
    driver.quit()

原文地址:https://www.cnblogs.com/dchnzlh/p/10459999.html