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 **.
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.
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)
Da die Menge an Code nicht groß ist, werde ich den gesamten Code einführen. Es gibt zwei Punkte.
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)
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.
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? .. .. ??
Einführung in das Abrufen (Crawlen) von Nachrichtenartikeln (Reuters-Artikeln) mit Selenium und BeautifulSoup4.