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.
Dieses Mal werde ich Selen mit Python 3.7 verwenden.
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()
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
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.
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)
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
.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