[PYTHON] [Selen] Gehen Sie zur nächsten Seite, ohne auf Weiter zu klicken

1. Hintergrund / Zweck

Teratail, für das häufig gesorgt wird (https://teratail.com) Gelegentlich gibt es einen Mann, der seit Jahren spielt, ohne überhaupt beantwortet zu werden. Ich frage mich, was es in Bezug auf Kategorien (Tags) gibt. Ich denke darüber nach, großartig zu kratzen.

Was mir dort aufgefallen ist, dass die letzte Seite immer mit 500 endet. Die gleiche 500. Seite wird angezeigt, auch wenn Sie auf die Schaltfläche "Weiter" klicken. Es ist eine Endlosschleife. Also werde ich auf eine Weise kratzen, um es zu vermeiden.

2. Annahmen

Dieses Mal werde ich Selen mit Python 3.7 verwenden.

3. Flow

4. Ganzes Skript

No_answered_Tags.py



def main():

    import pandas as pd
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.common.exceptions import TimeoutException
    

    options = Options()
    options.add_argument('--headless')
    browser = webdriver.Chrome(executable_path='/Users/anatanonamae/Desktop/Tool/chromedriver', chrome_options=options)

    browser.implicitly_wait(3)

    #Greifen Sie auf die erste Seite zu
    PAGE = 1
    InitURL= "https://teratail.com/search?tab=active&page=" + str(PAGE) + "&q=is%3Anot-answered"
    browser.get(InitURL)
    print("Ich habe auf die erste Seite zugegriffen")

    #Sammeln von Informationen auf jeder Seite
    TAG_DIC={}    
    while True:
        A_TAG = browser.find_elements_by_tag_name("a")#Sammle ein Tag
        
        taglist=[]
        for TAG in A_TAG :
            HREF = TAG.get_attribute('href') #Sammle href
              
            if "tags" in str(HREF):#Sammle hrefs mit Tags
                if not TAG.text:
                    continue                        
                else:
                     taglist.append(TAG.text)

        for tag in taglist:
            if tag in TAG_DIC:
                 TAG_DIC[tag] += 1
            else:
                TAG_DIC[tag] = 1
            
        NEXT_XPATH = browser.find_elements_by_xpath("//*[@id=\"mainContainer\"]/div[4]/div/p/a/span[contains(text(),\'Folgende Seite\')]")

        if NEXT_XPATH:#Fügen Sie SEITE hinzu, wenn es die nächste gibt
            PAGE += 1

        else:
            print("Got tags at last page.")#Wenn nicht, ist es vorbei
            break

        browser.get(URL)#Zur nächsten Seite gehen
        WebDriverWait(browser, 2).until(EC.presence_of_all_elements_located)
        print(browser.current_url)
        if browser.title == "Die Seite kann nicht gefunden werden":
            print("Got tags at last page.")#Wenn auf der nächsten Seite ein Fehler auftritt, wird der Vorgang beendet.
            break
 
    #Nachbearbeitung: Erstellen eines Datenrahmens
    df = pd.DataFrame([TAG_DIC.keys(),TAG_DIC.values()],index=None).T#In Datenrahmen konvertieren
    df.rename(columns={0:"Tag",1:"Count"},inplace =True)#Spalte umbenennen
    df.sort_values(by=['Count'],ascending=False,inplace =True)#In absteigender Reihenfolge sortieren
    df.reset_index(drop=True,inplace=True)#Index neu zuweisen
        
    print(df)

if __name__ == "__main__":
    main()

5. Erklärung jedes Ortes

  1. Nehmen Sie zunächst die Grundeinstellungen für Selen vor.

selenium.py


    options = Options()#Einstellungen der Selen-Option
    options.add_argument('--headless')#Öffne nicht das Fenster
    browser = webdriver.Chrome(executable_path='/Users/anatanonamae/Desktop/Tool/chromedriver', chrome_options=options)#Aufrufen des Treibers und Einstellen der Optionen

    browser.implicitly_wait(3)#Wartezeiteinstellung
  1. Rufen Sie die erste Seite auf

access.py


    #Greifen Sie auf die erste Seite zu
    PAGE = 1
    InitURL= "https://teratail.com/search?tab=active&page=" + str(PAGE) + "&q=is%3Anot-answered"
    browser.get(InitURL)#Zugriff mit get
    print("Ich habe auf die erste Seite zugegriffen")#browser.current_Sie können die aktuelle Seite auch mit URL anzeigen.
  1. Schleifenverarbeitung Wir werden auf jeder Seite Tags sammeln. --A Sammle alle Tags mit find_elements_by_tag_name --Wählen Sie diejenigen aus, die "Tag" in der href enthalten.

"WebDriverWait (Browser, 2). Bis (EC.presence_of_all_elements_located)" ist die gleiche Verwendung wie "Sleep", jedoch leistungsfähiger. Sie können anweisen, zu warten, bis die Seite ordnungsgemäß erfasst wurde. Für weitere Informationen: https://qiita.com/uguisuheiankyo/items/cec03891a86dfda12c9a

loop.py


    #Sammeln von Informationen auf jeder Seite
    TAG_DIC={}    
    while True:
        A_TAG = browser.find_elements_by_tag_name("a")#Sammle ein Tag
        
        taglist=[]
        for TAG in A_TAG :
            HREF = TAG.get_attribute('href') #Sammle href
              
            if "tags" in str(HREF):#Sammle hrefs mit Tags
                if not TAG.text:#Überspringen, wenn leer
                    continue                        
                else:
                     taglist.append(TAG.text)

        for tag in taglist:
            if tag in TAG_DIC:
                 TAG_DIC[tag] += 1#Hinzufügen, wenn das Tag vorhanden ist
            else:
                TAG_DIC[tag] = 1#Wenn nicht, registrieren Sie einen neuen und setzen Sie den Anfangswert auf 1.
            
        NEXT_XPATH = browser.find_elements_by_xpath("//*[@id=\"mainContainer\"]/div[4]/div/p/a/span[contains(text(),\'Folgende Seite\')]")#「Folgende Seite」が含まれるelementを検索

        if NEXT_XPATH:#Fügen Sie SEITE hinzu, wenn es die nächste gibt
            PAGE += 1

        else:
            print("Got tags at last page.")#Wenn nicht, ist es vorbei
            break

        URL= "https://teratail.com/search?tab=active&page=" + str(PAGE) + "&q=is%3Anot-answered"
        browser.get(URL)#Zur nächsten Seite gehen
        WebDriverWait(browser, 2).until(EC.presence_of_all_elements_located)
        print(browser.current_url)

  1. Verarbeitung unterbrechen Der Grund, warum diese Schleife endet, ist, wenn die Schaltfläche "Weiter" nicht gefunden werden kann. Ich mache eine doppelte Untertasse, wenn ein Seitenfehler auftritt. Wenn es sich um einen "Seitenfehler" handelt, gibt es keine "Nächste Schaltfläche", aber ich möchte vermeiden, zusätzliche Tags auf der Fehlerseite zu sammeln.

break.py


        if browser.title == "Die Seite kann nicht gefunden werden":
            print("Got tags at last page.")#Wenn auf der nächsten Seite ein Fehler auftritt, wird der Vorgang beendet.
            break
  1. Nachbearbeitung Wir werden das Wörterbuch in Dataframe konvertieren. Sie können Zeilen und Spalten mit .T in pd.DataFrame ([TAG_DIC.keys (), TAG_DIC.values ()], index = None) .T austauschen. Bequem Bequem.

pandas.py


    #Nachbearbeitung: Erstellen eines Datenrahmens
    df = pd.DataFrame([TAG_DIC.keys(),TAG_DIC.values()],index=None).T#In Datenrahmen konvertieren
    df.rename(columns={0:"Tag",1:"Count"},inplace =True)#Spalte umbenennen
    df.sort_values(by=['Count'],ascending=False,inplace =True)#In absteigender Reihenfolge sortieren
    df.reset_index(drop=True,inplace=True)#Index neu zuweisen
        
    print(df)

Mit diesem Gefühl ist das Ergebnis ...

result.py


Got tags at last page.
                        Tag Count
0                       PHP  3139
1                    Python  2623
2                JavaScript  2428
3                      Ruby  1974
4                Python 3.x  1762
5                 WordPress  1563
・
・
[1369 rows x 2 columns]
・
・

Es kamen satte 1369 Zeilen heraus. "Tag-Liste 501" oder so etwas wie Müll aufsammeln oder zählen 1 Die Ursache war, dass es ziemlich viele gab. Es war in Ordnung, Zeilen mit einer Anzahl von 100 oder weniger in der Nachbearbeitung zu löschen. Wenn Sie es schöner machen möchten, registrieren Sie keine ausgeschlossenen Wörter im Wörterbuch Ich denke, es ist in Ordnung, einen bedingten Zweig zu erstellen.

Das ist alles für diese Zeit.

Recommended Posts

[Selen] Gehen Sie zur nächsten Seite, ohne auf Weiter zu klicken
[Selen] Verwenden Sie die while-Anweisung, um wiederholt zur "nächsten Seite" zu wechseln.
Dynamisches Ersetzen der nächsten Methode in Python
[Bachstelze] Fügen Sie dem Bachstelzenprojekt eine Anmeldeseite hinzu
Neben Excel jupyter Notebook vorerst
Wie man Python auf Android genießt !! Programmieren für unterwegs !!
[Django] So leiten Sie nicht angemeldete Benutzer zur Anmeldeseite um
[Selen] Wie wird der relative Pfad des Chromedriver angegeben?
Stellen Sie die Verwaltungsseite für die Produktion bereit, um die Wartung zu vereinfachen.
Ich habe dir geschrieben, dass du das Signal mit Go sehen sollst