zoukankan      html  css  js  c++  java
  • 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()
    
    
  • 相关阅读:
    2.Android之按钮Button和编辑框EditText学习
    《DSP using MATLAB》Problem 3.8
    《DSP using MATLAB》Problem 3.7
    《DSP using MATLAB》Problem 3.6
    《DSP using MATLAB》Problem 3.5
    《DSP using MATLAB》Problem 3.4
    《DSP using MATLAB》Problem 3.3
    《DSP using MATLAB》Problem 3.2
    《DSP using MATLAB》Problem 3.1
    《DSP using MATLAB》Problem 2.20
  • 原文地址:https://www.cnblogs.com/dchnzlh/p/10459999.html
Copyright © 2011-2022 走看看