[PYTHON] Divers grattage

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

bon point

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.

Mauvais points

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.

code

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

bon point

Pour les utilisateurs peu alphabétisés, je suis reconnaissant pour les phrases qui peuvent être utilisées dans Excel familier.

Mauvais points

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.

Ajouter une bibliothèque

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

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/"

'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

bon point

La performance est bonne. Il existe peu de bibliothèques qui en dépendent.

Mauvais points

Vous avez besoin d'un environnement pour exécuter PHP.

Bibliothèques requises

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

code

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

bon point

La performance est bonne. Si vous utilisez déjà Python, il est facile de travailler avec.

Mauvais points

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.

Installez les bibliothèques requises

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:
#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])

Bonus: pour les pages nécessitant une connexion

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)

Bibliothèques requises

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

#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

Divers grattage
Grattage 1
Début du grattage
[Scraping] Scraping Python
Échantillon de grattage
raclage Web
Mémo de raclage Python
Grattage au sélénium
Scraping Python get_ranker_categories
Grattage au sélénium ~ 2 ~
Grattage avec Python
À propos du scraping Twitter
Grattage avec Python
J'ai essayé de gratter
grattage Web (prototype)
Python racle eBay
Grattage avec du sélénium
# 3 [python3] Divers opérateurs
Grattage de 100 images Fortnite
Grattage Python get_title
Divers jeux de loterie
Python: grattage partie 1
Diverses notations d'inclusion
Scraping à l'aide de Python
Diverses commandes Linux
Python: grattage, partie 2