Programmation Python: j'ai essayé d'obtenir (l'exploration) des articles de presse en utilisant Selenium et BeautifulSoup4

introduction

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 **.

Que présenter dans cet article

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.

Non présenté dans cet article

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)

Exemple de code

Étant donné que la quantité de code n'est pas importante, je présenterai le code entier. Il y a deux points.

1. Attente explicite

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)

2. Spécification des éléments de balise

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.

Présentation du code

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? .. .. ??

Sommaire

Présentation de la procédure d'obtention (d'exploration) d'articles d'actualité (articles Reuters) à l'aide de Selenium et BeautifulSoup4.

Recommended Posts

Programmation Python: j'ai essayé d'obtenir (l'exploration) des articles de presse en utilisant Selenium et BeautifulSoup4
Programmation Python: j'ai essayé d'obtenir des informations sur l'entreprise (exploration) de Yahoo Finance aux États-Unis en utilisant BeautifulSoup4
J'ai essayé d'obtenir les informations du Web en utilisant "Requests" et "lxml"
[Python scraping] J'ai essayé la recherche Google Top10 en utilisant Beautifulsoup et sélénium
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
[Python] J'ai essayé d'obtenir diverses informations en utilisant l'API de données YouTube!
J'ai créé un exemple pour accéder à Salesforce en utilisant Python et Bottle
J'ai essayé la détection d'objets en utilisant Python et OpenCV
J'ai essayé d'obtenir des données CloudWatch avec Python
J'ai essayé de faire un processus périodique avec CentOS7, Selenium, Python et Chrome
J'ai essayé de démarrer avec le script python de blender_Part 01
J'ai essayé de démarrer avec le script python de blender_Partie 02
J'ai essayé d'obtenir une AMI en utilisant AWS Lambda
Obtenez et automatisez le contrôle ASP Datepicker à l'aide de Python et Selenium
[Python] J'ai essayé d'obtenir Json de squid ring 2
J'ai essayé d'accéder aux feuilles de calcul Google en utilisant Python
Je souhaite obtenir des attributs de données personnalisés de HTML sous forme d'éléments à l'aide de Python Selenium
J'ai essayé d'automatiser la mise à jour de l'article du blog Livedoor avec Python et sélénium.
Commencez à Selenium en utilisant python
J'ai essayé "Comment obtenir une méthode décorée en Python"
J'ai essayé de programmer le test du chi carré en Python et Java.
J'ai essayé d'énumérer les différences entre java et python
J'ai fait un chronomètre en utilisant tkinter avec python
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
J'ai essayé d'obtenir rapidement des données d'AS / 400 en utilisant pypyodbc
J'ai essayé de toucher Python (installation)
[Introduction à Python3 Jour 1] Programmation et Python
J'ai essayé d'utiliser Thonny (Python / IDE)
Sélénium et python pour ouvrir Google
J'ai essayé d'obtenir une base de données sur les courses de chevaux en utilisant Pandas
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
Un mémorandum lors de l'acquisition automatique avec du sélénium
J'ai essayé de créer une expression régulière de "montant" en utilisant Python
J'ai essayé de créer une expression régulière de "temps" en utilisant Python
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
J'ai essayé de créer une expression régulière de "date" en utilisant Python
J'ai essayé d'obtenir une liste de noms AMI en utilisant Boto3
Obtenez et définissez la valeur du menu déroulant en utilisant Python et Selenium
J'ai essayé de créer une application todo en utilisant une bouteille avec python
J'ai essayé de détecter facilement les points de repère du visage avec python et dlib
J'ai essayé d'extraire des noms de joueurs et de compétences d'articles sportifs
J'ai essayé d'enseigner Python à des programmeurs inexpérimentés
J'ai essayé d'obtenir rapidement des données d'AS / 400 en utilisant pypyodbc Préparation 1
J'ai essayé de résumer la gestion des exceptions Python
J'ai essayé d'implémenter PLSA en Python
J'ai essayé d'utiliser Azure Speech to Text.
De Python à l'utilisation de MeCab (et CaboCha)
J'ai essayé d'implémenter la permutation en Python
J'ai essayé d'utiliser du sélénium avec du chrome sans tête
Entrée standard Python3 que j'ai essayé de résumer
J'ai essayé d'utiliser PyEZ et JSNAPy. Partie 2: J'ai essayé d'utiliser PyEZ
J'ai essayé d'utiliser l'optimisation bayésienne de Python
[ML-Aents] J'ai essayé l'apprentissage automatique en utilisant TensorFlow de Unity et Python (compatible v0.11β)
J'ai essayé de classer le texte en utilisant TensorFlow
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé de convertir la chaîne datetime <-> avec tzinfo en utilisant strftime () et strptime ()