Auswahl einer Quelle und Implementierungstools
Als Informationsquelle habe ich mich fĂŒr habr.com entschieden - ein kollektives Blog mit Elementen einer Nachrichtenseite (Nachrichten, analytische Artikel, Artikel zu Informationstechnologie, Wirtschaft, Internet usw. werden veröffentlicht). Auf dieser Ressource sind alle Materialien in Kategorien (Hubs) unterteilt, von denen nur die Hauptmaterialien - 416 StĂŒck. Jedes Material kann einer oder mehreren Kategorien angehören.
() python. â Jupyter notebook Google Colab. :
BeautifulSoup â html / xml;
Requests â http ;
Re â ;
Pandas â .
tqdm ratelim ( ).
, . :
mainUrl = 'https://habr.com/ru/post/'
postCount = 10000
, , , . try⊠except requests. :
@ratelim.patient(1, 1)
def get_post(postNum):
currPostUrl = mainUrl + str(postNum)
try:
response = requests.get(currPostUrl)
response.raise_for_status()
response_title, response_post, response_numComment, response_rating, response_ratingUp, response_ratingDown, response_bookMark, response_views = executePost(response)
dataList = [postNum, currPostUrl, response_title, response_post, response_numComment, response_rating, response_ratingUp, response_ratingDown, response_bookMark, response_views]
habrParse_df.loc[len(habrParse_df)] = dataList
except requests.exceptions.HTTPError as err:
pass
â . try â , .
executePost - .
def executePost(page):
soup = bs(page.text, 'html.parser')
#
title = soup.find('meta', property='og:title')
title = str(title).split('="')[1].split('" ')[0]
#
post = str(soup.find('div', id="post-content-body"))
post = re.sub('\n', ' ', post)
#
num_comment = soup.find('span', id='comments_count').text
num_comment = int(re.sub('\n', '', num_comment).strip())
# -
info_panel = soup.find('ul', attrs={'class' : 'post-stats post-stats_post js-user_'})
#
try:
rating = int(info_panel.find('span', attrs={'class' : 'voting-wjt__counter js-score'}).text)
except:
rating = info_panel.find('span', attrs={'class' : 'voting-wjt__counter voting-wjt__counter_positive js-score'})
if rating:
rating = int(re.sub('/+', '', rating.text))
else:
rating = info_panel.find('span', attrs={'class' : 'voting-wjt__counter voting-wjt__counter_negative js-score'}).text
rating = - int(re.sub('â', '', rating))
#
vote = info_panel.find_all('span')[0].attrs['title']
rating_upVote = int(vote.split(':')[1].split('')[0].strip().split('â')[1])
rating_downVote = int(vote.split(':')[1].split('')[1].strip().split('â')[1])
#
bookmk = int(info_panel.find_all('span')[1].text)
#
views = info_panel.find_all('span')[3].text
return title, post, num_comment, rating, rating_upVote, rating_downVote, bookmk, views
BeautifulSoup : soup = bs(page.text, âhtml.parserâ). find / findall (, html-). , html-, , .
( ), . , 10 . tqdm .
for pc in tqdm(range(postCount)):
postNum = pc + 1
get_post(postNum)
pandas :
Als Ergebnis erhielt ich einen Datensatz mit den Texten der Artikel der Ressource habr.com sowie zusÀtzlichen Informationen - dem Titel, dem Link zum Artikel, der Anzahl der Kommentare, der Bewertung, der Anzahl der Lesezeichen und der Anzahl der Aufrufe .
In Zukunft kann der resultierende Datensatz mit zusĂ€tzlichen Daten angereichert und fĂŒr Schulungen zum Erstellen verschiedener Sprachmodelle, Klassifizieren von Texten usw. verwendet werden.