Python-Programmierung: Ich habe versucht, Nachrichtenartikel mit Selenium und BeautifulSoup4 abzurufen (zu crawlen)

Einführung

Seit ich ein Universitätsstudent war, arbeite ich daran, Aktienkurse und Nachrichtenartikel mit meinem Labor-PC zu erfassen und zu akkumulieren. In letzter Zeit ist es jedoch notwendig geworden, sich der Herausforderung zu stellen, bei der Arbeit ** "englische" ** Nachrichtenartikel zu erwerben und zu sammeln.

Versuchen wir also, den Prozess des Abrufs von "englischen" Nachrichtenartikeln in einem Python-Programm zu realisieren. Diesmal lautet die Nachrichtenquelle ** Reuters **.

Was in diesem Artikel einzuführen

Basierend auf dem im folgenden Link beschriebenen Code haben wir den Code hinzugefügt, um den Artikeltext zu erhalten, der das Linkziel von "NEWS HEADLINES" ist.

How to scrape news headlines from Reuters? Business News Headlines

Darüber hinaus hat der Autor den Vorgang mit der folgenden Version bestätigt.

In diesem Artikel nicht vorgestellt

Für die Installation von Selen habe ich auf den folgenden Artikel verwiesen. [Für Selen] So installieren Sie den Chrome-Treiber mit pip (kein Durchgang erforderlich, Version kann angegeben werden)

Beispielcode

Da die Menge an Code nicht groß ist, werde ich den gesamten Code einführen. Es gibt zwei Punkte.

1. Explizites Warten

Es ist ein Muss, die Standby-Verarbeitung (Sleep) auch in ** zu implementieren, da das Zugriffsziel dadurch nicht belastet wird **. Es ist besser, die Standby-Verarbeitung unter der Annahme zu implementieren, dass das Laden der URL (Seite) durch den Webbrowser einige Zeit in Anspruch nimmt.

Ich habe auf den folgenden Artikel verwiesen. [Python] Verwendung von Selen Geschichte der Standby-Verarbeitung mit Selen Drei Einstellungen, um Selen stabil zu machen (unterstützt auch den Headless-Modus)

2. Angeben von Tag-Elementen

Es ist ein Muss, die Quelle jeder Seite zu betrachten, das Element unter Berücksichtigung der Tag-Struktur anzugeben und die Informationen mit Selenium oder BeautifulSoup4 zu erhalten. Diesmal lautet die Überschrift Selen und der Artikeltext lautet BeautifulSoup4.

Code einführen

Der mit Selen verarbeitete Teil entspricht fast dem Referenzcode. Dies ist eine zusätzliche Implementierung des Prozesses zum Erfassen des Links (href-Attributs) jedes Artikelkörpers und des Prozesses zum Erfassen des Artikelkörpers.

Wenn Sie den Code ausführen, wird die CSV-Datei in den unter ** Ausgabepfad ** angegebenen Ordner ausgegeben. (CSV-Datei ist Seite für Seite) Ich mache mir ein wenig Sorgen, dass ich die Behandlung von Fehler- und Zeichencodes nicht ernsthaft implementiert habe.

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

'''
#Unten für den Arbeitsplatz oder das interne Netzwerk (Proxy-Umgebung).(2020/11/02 Update)
os.environ["HTTP_PROXY"] = "http://${IP-Adresse des Proxyservers}:${Portnummer des Proxyservers}/"
os.environ["HTTPS_PROXY"] = "http://${IP-Adresse des Proxyservers}:${Portnummer des Proxyservers}/"
'''

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

Immerhin ist es bequem, Python. Lassen Sie uns die URL-Parameter von Reuters (Seitenzahl und Anzahl der Artikel pro Seite) ändern und bei der Arbeit verwenden.

Aber ist die Java-Version von Selen einfacher zu verwenden? .. .. ??

Zusammenfassung

Einführung in das Abrufen (Crawlen) von Nachrichtenartikeln (Reuters-Artikeln) mit Selenium und BeautifulSoup4.

Recommended Posts

Python-Programmierung: Ich habe versucht, Nachrichtenartikel mit Selenium und BeautifulSoup4 abzurufen (zu crawlen)
Python-Programmierung: Ich habe versucht, mithilfe von BeautifulSoup4 Unternehmensinformationen (Crawlen) von Yahoo Finance in den USA abzurufen
Ich habe versucht, die Informationen des Webs mit "Requests" und "lxml" abzurufen.
[Python Scraping] Ich habe versucht, Google Search Top10 mit Beautifulsoup & Selenium
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
[Python] Ich habe versucht, mithilfe der YouTube-Daten-API verschiedene Informationen abzurufen!
Ich habe ein Beispiel für den Zugriff auf Salesforce mit Python und Bottle erstellt
Ich habe versucht, Objekte mit Python und OpenCV zu erkennen
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe versucht, einen periodischen Prozess mit CentOS7, Selenium, Python und Chrome durchzuführen
Ich habe versucht, mit Blenders Python script_Part 01 zu beginnen
Ich habe versucht, mit Blenders Python script_Part 02 zu beginnen
Ich habe versucht, mit AWS Lambda einen AMI zu erhalten
Holen Sie sich die ASP Datepicker-Steuerung mit Python und Selen und automatisieren Sie sie
[Python] Ich habe versucht, Json von Tintenfischring 2 zu bekommen
Ich habe versucht, mit Python auf Google Spread Sheets zuzugreifen
Ich möchte benutzerdefinierte Datenattribute von HTML als Elemente mit Python Selenium erhalten
Ich habe versucht, das Artikel-Update des Livedoor-Blogs mit Python und Selen zu automatisieren.
Starten Sie mit Python zu Selen
Ich habe versucht "Wie man eine Methode in Python dekoriert"
Ich habe versucht, den Chi-Quadrat-Test in Python und Java zu programmieren.
Ich habe versucht, die Unterschiede zwischen Java und Python aufzuzählen
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Ich habe versucht, mit pypyodbc schnell Daten von AS / 400 abzurufen
Ich habe versucht, Python zu berühren (Installation)
[Einführung in Python3 Tag 1] Programmierung und Python
Ich habe versucht, Thonny (Python / IDE) zu verwenden.
Selen und Python zum Öffnen von Google
Ich habe versucht, mit Pandas eine Pferderenn-Datenbank zu erstellen
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
Ein Memorandum beim automatischen Erwerb mit Selen
Ich habe versucht, mit Python einen regulären Ausdruck für "Betrag" zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck von "Zeit" zu erstellen
[Python] Ein Memo, das ich versucht habe, mit Asyncio zu beginnen
Ich habe versucht, mit Python einen regulären Ausdruck von "Datum" zu erstellen
Ich habe versucht, mit Boto3 eine Liste der AMI-Namen zu erhalten
Rufen Sie den Wert des Dropdown-Menüs mit Python und Selen ab und legen Sie ihn fest
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
Ich habe versucht, Gesichtsmarkierungen mit Python und Dlib leicht zu erkennen
Ich habe versucht, Spieler- und Fertigkeitsnamen aus Sportartikeln zu extrahieren
Ich habe versucht, unerfahrenen Programmierern Python beizubringen
Ich habe versucht, mit pypyodbc Preparation 1 schnell Daten von AS / 400 abzurufen
Ich habe versucht, die Behandlung von Python-Ausnahmen zusammenzufassen
Ich habe versucht, PLSA in Python zu implementieren
Ich habe versucht, Azure Speech to Text zu verwenden.
Von Python bis zur Verwendung von MeCab (und CaboCha)
Ich habe versucht, Permutation in Python zu implementieren
Ich habe versucht, Selen mit Headless-Chrom zu verwenden
Python3-Standardeingabe habe ich versucht zusammenzufassen
Ich habe versucht, PyEZ und JSNAPy zu verwenden. Teil 2: Ich habe versucht, PyEZ zu verwenden
Ich habe versucht, die Bayes'sche Optimierung von Python zu verwenden
[ML-Aents] Ich habe versucht, maschinelles Lernen mit Unity und TensorFlow of Python (v0.11β-kompatibel) zu lernen.
Ich habe versucht, Text mit TensorFlow zu klassifizieren
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe versucht, datetime <-> string mit tzinfo mit strftime () und strptime () zu konvertieren.