[PYTHON] Verschiedene Kratzer

Hier sind einige Web-Scraping-Techniken. Erhalten Sie die wichtigsten Neuigkeiten von Yahoo! Japan mit GAS, VBA, PHP bzw. Python. Zusammenfassend ist GAS + Spreadsheet einfacher zu verwenden und wird empfohlen.

GAS + Spreadsheet

guter Punkt

Wenn Sie ein Google-Konto haben, müssen Sie keine Umgebung vorbereiten und können es regelmäßig mit dem GAS-Trigger ausführen.

Schlechte Punkte

Es gibt Leistungsprobleme bei der Ausführung in großem Maßstab. Aus Sicherheitsgründen ist der Umgang mit wichtigen Daten etwas streng.

Code

gas.js


function yahoo() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('yahoo');
  //Geben Sie den zu schreibenden Blattnamen an
  var getUrl = 'https://www.yahoo.co.jp/';
  //Geben Sie die Zielseite an
  var content = UrlFetchApp.fetch(getUrl).getContentText('UTF-8');
  var content = content.replace(/\r?\n/g, '');
  var data = content.match(/<div class="_2jjSS8r_I9Zd6O9NFJtDN-" aria-label="Wichtige Neuigkeiten">(.*?)<\/div><div>/);
  //Inhaltsblock festlegen
  var data = data[0];
  var URLs = data.match(/<a class="yMWCYupQNdgppL-NV6sMi _3sAlKGsIBCxTUbNi86oSjt" href="(.*?)"/g);
  //URL-Gruppe auf einmal zu Array
  var Titles = data.match(/<span class="fQMqQTGJTbIMxjQwZA2zk _3tGRl6x9iIWRiFTkKl3kcR">(.*?)<\/span>/g);
  //Sammeln Sie Artikelnamengruppen in einem Array
  for (var i = 0; i < 8; i++) {
    var URL = URLs[i];
    URL = URL.replace('<a class="yMWCYupQNdgppL-NV6sMi _3sAlKGsIBCxTUbNi86oSjt" href="', '');
    URL = URL.replace('"', '');
    sheet.getRange(i + 2, 1).setValue(URL); 
    
    var Title = Titles[i];
    Title = Title.replace('<span class="fQMqQTGJTbIMxjQwZA2zk _3tGRl6x9iIWRiFTkKl3kcR">', '');
    Title = Title.replace('<\/span>', '');
    sheet.getRange(i + 2, 2).setValue(Title);
    
  }
  Browser.msgBox('Done!');
}

VBA + Excel

guter Punkt

Für Benutzer mit geringer Alphabetisierung bin ich dankbar für die Sätze, die im vertrauten Excel verwendet werden können.

Schlechte Punkte

Da dies vom IE-Objekt abhängt, ist ein Windows-Terminal erforderlich. Die einzigartigen Spezifikationen des IE funktionieren auf modernen Websites häufig nicht gut.

Bibliothek hinzufügen

Auf dem Excel VBA-Bildschirm Menüleiste> Extras> Referenzeinstellungen Überprüfen Sie die folgenden zwei Bibliotheken. -Microsoft HTML Object Library · Microsoft Internet Controls

Code

Sub GetData_Click()
Application.ScreenUpdating = False
Dim objIE As InternetExplorer
Dim htmlDoc As HTMLDocument
Dim NewsItem IHTMLElement
Dim NewsList, NewsTitle, NewsURL As IHTMLElementCollection
Dim PageURL As String
Dim LastRow As Long
PageURL = "https://www.yahoo.co.jp/"

'Erstellen Sie ein neues IE-Objekt und legen Sie es fest
Set objIE = CreateObject("Internetexplorer.Application")
objIE.Visible = False

'URL im IE öffnen
objIE.navigate PageURL
'Warten auf das Lesen
Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
  DoEvents
Loop
'Legen Sie das von objIE geladene HTML-Dokument fest
Set htmlDoc = objIE.document

'Holen Sie sich Inhalte für jeden Artikel
Set NewsList = htmlDoc.getElementsByClassName("_2jjSS8r_I9Zd6O9NFJtDN-")

For Each NewsItem In NewsList
  'Geben Sie die Suchanforderungen für jedes Tag an
  Set NewsTitle = NewsItem.getElementsByTagName("a")
  Set NewsURL = NewsItem.getElementsByClassName("fQMqQTGJTbIMxjQwZA2zk _3tGRl6x9iIWRiFTkKl3kcR")
  'Holen Sie sich die letzte Zeile
  LastRow = Worksheets("result").Cells(Rows.Count, 1).End(xlUp).Row
  'Geben Sie für jede Zelle den entsprechenden Wert ein
  Worksheets("result").Cells(LastRow + 1, 1).Value = Right(NewsURL(0).href, 4)
  Worksheets("result").Cells(LastRow + 1, 2).Value = NewsTitle(0).innerText
  'Überspringen, wenn nicht gefunden
  On Error Resume Next
  Worksheets("result").Cells(LastRow + 1, 5).Value = Mid(Campagin(0).innerText, 2)
  Worksheets("result").Cells(LastRow + 1, 6).Value = Mid(Campagin(1).innerText, 1)
Next NewsItem

MsgBox "Done!"
End Sub

PHP + csv

guter Punkt

Die Leistung ist gut. Es gibt nur wenige Bibliotheken, die davon abhängen.

Schlechte Punkte

Sie benötigen eine Umgebung, um PHP auszuführen.

Erforderliche Bibliotheken

phpQuery-onefile.php Laden Sie die obige Datei herunter und fügen Sie sie in dieselbe Hierarchie ein wie die PHP-Datei des Hauptteils

Code

scraping.php


<?php
  require_once("phpQuery-onefile.php");
  $path = "xxx/xxx.csv"; //Geben Sie die auszugebende CSV an
  $header = "URL".", ". "Title"."\n";
  $file = fopen($path, "w");
  $target = "https://www.yahoo.co.jp/";
  $html = file_get_contents($target);
  $list = phpQuery::newDocument($html)->find("div._2jjSS8r_I9Zd6O9NFJtDN-");
  for($i = 0; $i < 8; $i++){
   $url[$i] = phpQuery::newDocument($list)->find("li:eq($i)")->find("a")->attr("href");
   $title[$i] = str_replace(",", "", phpQuery::newDocument($list)->find("span.fQMqQTGJTbIMxjQwZA2zk _3tGRl6x9iIWRiFTkKl3kcR:eq($i)")->text());
   $data .= ".$url[$i].", ".$title[$i]."."\n";
  }
    $content = $header . $data;
  fputs($file, $content);
  fclose($file);
?>

Python + csv

guter Punkt

Die Leistung ist gut. Wenn Sie Python bereits verwenden, ist es einfach, damit zu arbeiten.

Schlechte Punkte

Das Erstellen einer Python-Umgebung ist etwas mühsam. Wenn Sie Python bereits verwenden, können Sie möglicherweise eine Verbindung herstellen und es auf verschiedene Arten verwenden. Wenn Sie jedoch nur kratzen, ist es mit PHP überwiegend einfacher, eine Umgebung zu erstellen.

Installieren Sie die erforderlichen Bibliotheken

pip3 install requests
pip3 install beautifulsoup4

Code

scraping.py


# coding: utf-8
import requests
from bs4 import BeautifulSoup
import csv

r = requests.get("https://yahoo.co.jp/")
data = BeautifulSoup(r.content, "html.parser")
list = data.find("div", "_2jjSS8r_I9Zd6O9NFJtDN-")
links = list.find_all("a", "")
titles = list.find_all("span", "fQMqQTGJTbIMxjQwZA2zk _3tGRl6x9iIWRiFTkKl3kcR")

with open('xxx/xxx.csv', 'w') as f:
#Entscheiden Sie, wo die CSV-Datei abgelegt werden soll
    writer = csv.writer(f)
    writer.writerow(['url', 'title'] )
    for i in range(7):
        writer.writerow([links[i].attrs['href'], titles[i].text])

Bonus: Für Seiten, für die eine Anmeldung erforderlich ist

Wenn Sie den Inhalt nicht anzeigen können, ohne sich anzumelden, ist der Chrome-Treiber von Python hilfreich. Weitere Informationen zur Verwendung von chromedriver finden Sie in diesem Artikel. Vollständiger automatischer Betrieb von Chrome mit Python + Selen Weitere Informationen zum Übergeben des Pfads und Hinweise zur Version finden Sie in diesem Artikel. [Für Selen] So installieren Sie den Chrome-Treiber mit pip (kein Durchgang erforderlich, Version kann angegeben werden)

Erforderliche Bibliotheken

pip3 install selenium
pip3 install chromedriver-binary

Code

login_scraping.py


# coding: utf-8
import time, os, requests, sys, csv
from selenium import webdriver
import chromedriver_binary

#Angabe von Benutzername und Passwort
user_id = "xxxxxxxxxx"
password = "xxxxxxxxxx"
download_dir = os.path.dirname(__file__)
#Geben Sie die URL der Anmeldeseite an
login = 'https://www.example.com/login/'
#Starten Sie Chrome, indem Sie Optionen wie "Ziel speichern" angeben
opt = webdriver.ChromeOptions()
opt.add_experimental_option("prefs", {
    "download.default_directory": download_dir,
    "download.prompt_for_download": False,
    "plugins.always_open_pdf_externally": True
})
driver = webdriver.Chrome(options=opt)
#Anmeldeseite öffnen
driver.get(login)
time.sleep(3) #Warten Sie, bis die Seite geöffnet wird
#Senden Sie den Schlüssel auf dem Anmeldebildschirm an den Benutzernamen
u = driver.find_element_by_name('xxx')
u.send_keys(user_id)
#Schlüssel zum Anmeldebildschirmkennwort senden
p = driver.find_element_by_name('yyy')
p.send_keys(password)
p.submit()
time.sleep(3) #Warten Sie, bis die Seite geöffnet wird

driver.get("https://www.example.com/listdata/")
list = driver.find_element_by_tag_name("_2jjSS8r_I9Zd6O9NFJtDN-")
links = list.find_all("a", "")
titles = list.find_all("span", "fQMqQTGJTbIMxjQwZA2zk _3tGRl6x9iIWRiFTkKl3kcR")

with open('xxx/xxx.csv', 'w') as f:
#Entscheiden Sie, wo die CSV-Datei abgelegt werden soll
    writer = csv.writer(f)
    writer.writerow(['url', 'title'] )
    for i in range(7):
        writer.writerow([links[i].attrs['href'], titles[i].text])

#Warten Sie, bis die Seite geöffnet wird
time.sleep(3)
driver.quit()

Bisher haben wir fünf Methoden eingeführt. Je nach Verwendung gibt es Vor- und Nachteile. Wir freuen uns darauf, Ihnen zu helfen.

Recommended Posts

Verschiedene Kratzer
Schaben 1
Beginn des Schabens
[Scraping] Python-Scraping
Probe abkratzen
Web Scraping
Python-Scraping-Memo
Schaben mit Selen
Python Scraping get_ranker_categories
Schaben mit Selen ~ 2 ~
Scraping mit Python
Über Twitter Scraping
Scraping mit Python
Ich habe versucht zu kratzen
Web Scraping (Prototyp)
Python Scraping eBay
Schaben mit Selen
# 3 [python3] Verschiedene Operatoren
100 Fortnite-Bilder kratzen
Python Scraping get_title
Verschiedene Lotteriespiele
Python: Scraping Teil 1
Verschiedene Einschlussnotationen
Scraping mit Python
Verschiedene Linux-Befehle
Python: Scraping Teil 2