Teratail qui est souvent pris en charge (https://teratail.com) Parfois, il y a un gars qui joue depuis des années sans qu'on lui réponde du tout. Je me demande ce qu'il y en a beaucoup en termes de catégories (tags) Je pense faire un bon grattage.
Ce que j'ai remarqué, c'est que la dernière page se termine toujours par 500. La même 500e page s'affiche même si vous appuyez sur le bouton "Suivant". C'est une boucle sans fin. Alors je vais gratter de manière à l'éviter.
Cette fois, j'utiliserai du sélénium avec Python 3.7.
--Accédez à l'URL sans réponse "https://teratail.com/feed/not-answered/
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)
#Accédez à la première page
PAGE = 1
InitURL= "https://teratail.com/search?tab=active&page=" + str(PAGE) + "&q=is%3Anot-answered"
browser.get(InitURL)
print("J'ai accédé à la première page")
#Collecte d'informations sur chaque page
TAG_DIC={}
while True:
A_TAG = browser.find_elements_by_tag_name("a")#collecter une étiquette
taglist=[]
for TAG in A_TAG :
HREF = TAG.get_attribute('href') #Recueillir href
if "tags" in str(HREF):#Collecter des hrefs contenant des balises
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(),\'Page suivante\')]")
if NEXT_XPATH:#Ajouter une PAGE s'il y a une prochaine
PAGE += 1
else:
print("Got tags at last page.")#Sinon, c'est fini
break
browser.get(URL)#Aller à la page suivante
WebDriverWait(browser, 2).until(EC.presence_of_all_elements_located)
print(browser.current_url)
if browser.title == "Page non trouvée":
print("Got tags at last page.")#Si une erreur se produit sur la page suivante, le processus se termine.
break
#Post-traitement: création d'une Dataframe
df = pd.DataFrame([TAG_DIC.keys(),TAG_DIC.values()],index=None).T#Convertir en Dataframe
df.rename(columns={0:"Tag",1:"Count"},inplace =True)#Renommer la colonne
df.sort_values(by=['Count'],ascending=False,inplace =True)#Trier par ordre décroissant
df.reset_index(drop=True,inplace=True)#Réaffecter l'index
print(df)
if __name__ == "__main__":
main()
selenium.py
options = Options()#Paramètres des options de sélénium
options.add_argument('--headless')#N'ouvre pas la fenêtre
browser = webdriver.Chrome(executable_path='/Users/anatanonamae/Desktop/Tool/chromedriver', chrome_options=options)#Appel du pilote et options de paramétrage
browser.implicitly_wait(3)#Réglage du temps d'attente
access.py
#Accédez à la première page
PAGE = 1
InitURL= "https://teratail.com/search?tab=active&page=" + str(PAGE) + "&q=is%3Anot-answered"
browser.get(InitURL)#Accès avec get
print("J'ai accédé à la première page")#browser.current_Vous pouvez également afficher la page actuelle avec l'URL.
find_elements_by_tag_name
--Sélectionnez ceux qui contiennent "tag" dans le href.WebDriverWait (browser, 2) .until (EC.presence_of_all_elements_located)
est le même usage que sleep mais plus puissant. Vous pouvez demander d'attendre que la page soit acquise correctement.
Pour plus d'informations: https://qiita.com/uguisuheiankyo/items/cec03891a86dfda12c9a
loop.py
#Collecte d'informations sur chaque page
TAG_DIC={}
while True:
A_TAG = browser.find_elements_by_tag_name("a")#collecter une étiquette
taglist=[]
for TAG in A_TAG :
HREF = TAG.get_attribute('href') #Recueillir href
if "tags" in str(HREF):#Collecter des hrefs contenant des balises
if not TAG.text:#Ignorer si vide
continue
else:
taglist.append(TAG.text)
for tag in taglist:
if tag in TAG_DIC:
TAG_DIC[tag] += 1#Ajouter si le tag existe
else:
TAG_DIC[tag] = 1#Sinon, enregistrez-en un nouveau et définissez la valeur initiale sur 1.
NEXT_XPATH = browser.find_elements_by_xpath("//*[@id=\"mainContainer\"]/div[4]/div/p/a/span[contains(text(),\'Page suivante\')]")#「Page suivante」が含まれるelementを検索
if NEXT_XPATH:#Ajouter une PAGE s'il y a une prochaine
PAGE += 1
else:
print("Got tags at last page.")#Sinon, c'est fini
break
URL= "https://teratail.com/search?tab=active&page=" + str(PAGE) + "&q=is%3Anot-answered"
browser.get(URL)#Aller à la page suivante
WebDriverWait(browser, 2).until(EC.presence_of_all_elements_located)
print(browser.current_url)
break.py
if browser.title == "Page non trouvée":
print("Got tags at last page.")#Si une erreur se produit sur la page suivante, le processus se termine.
break
.T
dans pd.DataFrame ([TAG_DIC.keys (), TAG_DIC.values ()], index = None) .T
. Pratique Pratique.pandas.py
#Post-traitement: création d'une Dataframe
df = pd.DataFrame([TAG_DIC.keys(),TAG_DIC.values()],index=None).T#Convertir en Dataframe
df.rename(columns={0:"Tag",1:"Count"},inplace =True)#Renommer la colonne
df.sort_values(by=['Count'],ascending=False,inplace =True)#Trier par ordre décroissant
df.reset_index(drop=True,inplace=True)#Réaffecter l'index
print(df)
Avec ce sentiment, le résultat est ...
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]
・
・
Un énorme 1369 lignes sont sorties. "Liste de balises 501" ou quelque chose comme ramasser la corbeille ou compter 1 La cause était qu'il y en avait beaucoup. Il était normal de supprimer les lignes avec un nombre de 100 ou moins en post-traitement. Si vous voulez le rendre plus beau, n'enregistrez pas les mots exclus dans le dictionnaire Je pense qu'il est normal de créer une branche conditionnelle.
C'est tout pour cette fois.
Recommended Posts