Voici quelques techniques de scraping Web. Obtenez les principales nouvelles de Yahoo! Japan en utilisant respectivement GAS, VBA, PHP, Python. En conclusion, GAS + Spreadsheet est plus facile à utiliser et recommandé.
GAS + Spreadsheet
Si vous avez un compte Google, vous n'avez pas besoin de préparer d'environnement et vous pouvez l'exécuter régulièrement avec le déclencheur GAS.
Une exécution à grande échelle pose des problèmes de performances. Pour des raisons de sécurité, le traitement des données importantes est un peu strict.
gas.js
function yahoo() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('yahoo');
//Spécifiez le nom de la feuille à écrire
var getUrl = 'https://www.yahoo.co.jp/';
//Spécifiez la page cible
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="Actualités majeures">(.*?)<\/div><div>/);
//Définir le bloc de contenu
var data = data[0];
var URLs = data.match(/<a class="yMWCYupQNdgppL-NV6sMi _3sAlKGsIBCxTUbNi86oSjt" href="(.*?)"/g);
//Groupe d'URL à mettre en réseau à la fois
var Titles = data.match(/<span class="fQMqQTGJTbIMxjQwZA2zk _3tGRl6x9iIWRiFTkKl3kcR">(.*?)<\/span>/g);
//Rassemblez les groupes de noms d'articles dans un tableau
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
Pour les utilisateurs peu alphabétisés, je suis reconnaissant pour les phrases qui peuvent être utilisées dans Excel familier.
Comme cela dépend de l'objet IE, un terminal Windows est requis. En raison des spécifications uniques d'IE, il ne fonctionne souvent pas bien sur les sites Web modernes.
Sur l'écran Excel VBA Barre de menus> Outils> Paramètres de référence Vérifiez les deux bibliothèques suivantes. -Bibliothèque d'objets HTML Microsoft · Contrôles Internet Microsoft
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/"
'Créer et définir un nouvel objet IE
Set objIE = CreateObject("Internetexplorer.Application")
objIE.Visible = False
'Ouvrir l'URL dans IE
objIE.navigate PageURL
'En attente de lecture
Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE
DoEvents
Loop
'Définit le document HTML chargé par objIE
Set htmlDoc = objIE.document
'Obtenez du contenu pour chaque élément
Set NewsList = htmlDoc.getElementsByClassName("_2jjSS8r_I9Zd6O9NFJtDN-")
For Each NewsItem In NewsList
'Spécifiez les exigences de recherche pour chaque balise
Set NewsTitle = NewsItem.getElementsByTagName("a")
Set NewsURL = NewsItem.getElementsByClassName("fQMqQTGJTbIMxjQwZA2zk _3tGRl6x9iIWRiFTkKl3kcR")
'Obtenez la dernière ligne
LastRow = Worksheets("result").Cells(Rows.Count, 1).End(xlUp).Row
'Remplissez la valeur correspondante pour chaque cellule
Worksheets("result").Cells(LastRow + 1, 1).Value = Right(NewsURL(0).href, 4)
Worksheets("result").Cells(LastRow + 1, 2).Value = NewsTitle(0).innerText
'Ignorer si non trouvé
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
La performance est bonne. Il existe peu de bibliothèques qui en dépendent.
Vous avez besoin d'un environnement pour exécuter PHP.
phpQuery-onefile.php Téléchargez le fichier ci-dessus et placez-le dans la même hiérarchie que le fichier php du corps principal
scraping.php
<?php
require_once("phpQuery-onefile.php");
$path = "xxx/xxx.csv"; //Spécifiez csv pour la sortie
$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
La performance est bonne. Si vous utilisez déjà Python, il est facile de travailler avec.
C'est un peu compliqué de créer un environnement Python. Si vous utilisez déjà Python, vous pourrez peut-être vous connecter et l'utiliser de différentes manières, mais si vous ne faites que gratter, PHP est extrêmement plus facile à créer un environnement.
pip3 install requests
pip3 install beautifulsoup4
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:
#Décidez où placer le fichier csv
writer = csv.writer(f)
writer.writerow(['url', 'title'] )
for i in range(7):
writer.writerow([links[i].attrs['href'], titles[i].text])
Si vous ne pouvez pas afficher le contenu sans vous connecter, le pilote chrome de Python est utile. Vous pouvez en savoir plus sur l'utilisation de chromedriver dans cet article. Fonctionnement automatique complet de Chrome avec Python + Selenium Veuillez également vous référer à cet article pour savoir comment transmettre le PATH et les notes sur la version. [Pour le sélénium] Comment installer le pilote Chrome avec pip (pas besoin de passer, la version peut être spécifiée)
pip3 install selenium
pip3 install chromedriver-binary
login_scraping.py
# coding: utf-8
import time, os, requests, sys, csv
from selenium import webdriver
import chromedriver_binary
#Spécification du nom d'utilisateur et du mot de passe
user_id = "xxxxxxxxxx"
password = "xxxxxxxxxx"
download_dir = os.path.dirname(__file__)
#Spécifiez l'URL de la page de connexion
login = 'https://www.example.com/login/'
#Démarrez Chrome en spécifiant des options telles que la destination d'enregistrement
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)
#Ouvrir la page de connexion
driver.get(login)
time.sleep(3) #Attendez que la page s'ouvre
#Envoyer la clé au nom d'utilisateur sur l'écran de connexion
u = driver.find_element_by_name('xxx')
u.send_keys(user_id)
#Envoyer la clé au mot de passe de l'écran de connexion
p = driver.find_element_by_name('yyy')
p.send_keys(password)
p.submit()
time.sleep(3) #Attendez que la page s'ouvre
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:
#Décidez où placer le fichier csv
writer = csv.writer(f)
writer.writerow(['url', 'title'] )
for i in range(7):
writer.writerow([links[i].attrs['href'], titles[i].text])
#Attendez que la page s'ouvre
time.sleep(3)
driver.quit()
Jusqu'à présent, nous avons introduit cinq méthodes. Selon l'utilisation, chacun présente des avantages et des inconvénients. Nous sommes impatients de vous aider.
Recommended Posts