Depuis que je suis à l'université, je travaille sur l'acquisition et l'accumulation des cours des actions et des articles de presse à l'aide de mon ordinateur de laboratoire. Cependant, récemment, il est devenu nécessaire de relever le défi d'acquérir et d'accumuler des articles de presse ** «en anglais» ** au travail.
Alors, essayons de réaliser le processus d'obtention d'articles d'actualité "en anglais" dans un programme Python. Cette fois, la source d'information est ** Reuters **.
Sur la base du code décrit dans le lien ci-dessous, nous avons ajouté le code pour obtenir le texte de l'article qui est la destination du lien de "NEWS HEADLINES".
How to scrape news headlines from Reuters? Business News Headlines
De plus, l'auteur a confirmé l'opération avec la version suivante.
Pour l'installation de Selenium, je me suis référé à l'article suivant. [Pour le sélénium] Comment installer le pilote Chrome avec pip (pas besoin de passer, la version peut être spécifiée)
Étant donné que la quantité de code n'est pas importante, je présenterai le code entier. Il y a deux points.
Il est indispensable de mettre en œuvre le traitement de veille (Sleep) même en ** car il n'impose pas de charge sur la destination d'accès **. Il est préférable de mettre en œuvre le traitement de veille en supposant qu'il faudra du temps pour que l'URL (page) soit chargée par le navigateur Web.
J'ai fait référence à l'article suivant. [Python] Comment utiliser Selenium Histoire du traitement en veille avec Selenium Trois paramètres pour rendre Selenium stable (prend également en charge le mode sans tête)
Il est indispensable de regarder la source de chaque page, de spécifier l'élément en tenant compte de la structure des balises et d'acquérir les informations avec Selenium ou BeautifulSoup4. Cette fois, le titre est Selenium et le texte de l'article est BeautifulSoup4.
La partie traitée à l'aide de Selenium est presque la même que Code de référence. Il s'agit d'une implémentation supplémentaire du processus d'acquisition du lien (attribut href) de chaque corps d'article et du processus d'acquisition du corps d'article.
Lorsque vous exécutez le code, le fichier CSV sera généré dans le dossier spécifié dans ** outputdirpath **. (Le fichier CSV est page par page) Je suis un peu inquiet de ne pas avoir sérieusement implémenté la gestion des codes d'erreur et de caractères.
crawler_reuters.py
import chromedriver_binary
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import dateutil.parser
import time
import os
import datetime
import csv
import io
import codecs
import requests
from bs4 import BeautifulSoup
'''
#Ci-dessous, pour le lieu de travail ou le réseau interne (environnement proxy).(2020/11/02 Update)
os.environ["HTTP_PROXY"] = "http://${Adresse IP du serveur proxy}:${Numéro de port du serveur proxy}/"
os.environ["HTTPS_PROXY"] = "http://${Adresse IP du serveur proxy}:${Numéro de port du serveur proxy}/"
'''
def createOutputDirpath():
workingdirpath = os.getcwd()
outputdirname = 'article_{0:%Y%m%d}'.format(datetime.datetime.now())
outputdirpath = "..\\data\\%s" %(outputdirname)
if not os.path.exists(os.path.join(workingdirpath, outputdirpath)):
os.mkdir(os.path.join(workingdirpath, outputdirpath))
return os.path.join(workingdirpath, outputdirpath)
def getArticleBody(url):
html = requests.get(url)
#soup = BeautifulSoup(html.content, "html.parser")
soup = BeautifulSoup(html.content, "lxml")
wrapper = soup.find("div", class_="ArticleBodyWrapper")
paragraph = [element.text for element in wrapper.find_all("p", class_="Paragraph-paragraph-2Bgue")]
#paragraph = []
#for element in wrapper.find_all("p", class_="Paragraph-paragraph-2Bgue"):
# paragraph.append(element.text)
return paragraph
outputdirpath = createOutputDirpath()
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('https://www.reuters.com/news/archive/businessnews?view=page&page=5&pageSize=10')
count = 0
for x in range(5):
try:
print("=====")
print(driver.current_url)
print("-----")
#f = open(os.path.join(outputdirpath, "reuters_news.csv"), "w", newline = "")
f = codecs.open(os.path.join(outputdirpath, "reuters_news_%s.csv" %(x)), "w", "UTF-8")
writer = csv.writer(f, delimiter=',', quoting=csv.QUOTE_ALL, quotechar="\"")
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "control-nav-next")))
loadMoreButton = driver.find_element_by_class_name("control-nav-next") # or "control-nav-prev"
# driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
#news_headlines = driver.find_elements_by_class_name("story-content")
news_headlines = driver.find_elements_by_class_name("news-headline-list")[0].find_elements_by_class_name("story-content")
for headline in news_headlines:
#print(headline.text)
#print(headline.get_attribute("innerHTML"))
href = headline.find_element_by_tag_name("a").get_attribute("href")
title = headline.find_element_by_class_name("story-title").text
smry = headline.find_element_by_tag_name("p").text
stmp = headline.find_element_by_class_name("timestamp").text
body = getArticleBody(href)
print(href)
#print(title)
#print(smry)
#print(stmp)
#print(body)
writer.writerow([href, title, smry, stmp, '\r\n'.join(body)])
time.sleep(1)
f.close()
count += 1
loadMoreButton.click()
time.sleep(10)
except Exception as e:
print(e)
break
Après tout, c'est pratique, Python. Modifions les paramètres d'URL de Reuters (numéro de page et nombre d'articles par page) et utilisons-le au travail.
Mais la version Java de Selenium est-elle plus simple à utiliser? .. .. ??
Présentation de la procédure d'obtention (d'exploration) d'articles d'actualité (articles Reuters) à l'aide de Selenium et BeautifulSoup4.
Recommended Posts