Sélection d'une source et outils de mise en œuvre
Comme source d'information, j'ai décidé d'utiliser habr.com - un blog collectif avec des éléments d'un site d'actualités (actualités, articles analytiques, articles sur les technologies de l'information, les affaires, Internet, etc. sont publiés). Sur cette ressource, tous les matériaux sont divisés en catégories (hubs), dont seuls les principaux - 416 pièces. Chaque matériau peut appartenir à une ou plusieurs catégories.
() 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 :
En conséquence, j'ai reçu un ensemble de données contenant les textes des articles de la ressource habr.com , ainsi que des informations complémentaires - le titre, le lien vers l'article, le nombre de commentaires, la note, le nombre de signets, le nombre de vues .
À l'avenir, l'ensemble de données résultant pourra être enrichi de données supplémentaires et utilisé pour la formation à la construction de divers modèles de langage, à la classification de textes, etc.