Les débutants en Python sont bloqués dans leur premier scraping Web

introduction

Quand j'ai essayé le scraping Web sans même connaître la grammaire de Python, je me suis retrouvé coincé de différentes manières, donc je vais le résumer avec un mémorandum. La mise en œuvre est un programme qui acquiert des données de boisson à partir d'un certain site Web et les génère dans un fichier CSV.

environnement

Récupérer les données de plusieurs pages

J'ai rapidement trouvé un moyen d'obtenir des données à partir d'une page, mais comment les obtenir à partir de plusieurs pages?

import requests
from bs4 import BeautifulSoup

import re

#Un tableau qui contient des URL pour plusieurs pages
urls_ary = []

#Recherchez toutes les balises a de la page supérieure, obtenez leurs attributs href et ajoutez-les au tableau
url = 'http://hoge/top'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')
for a in soup.find_all('a', href=re.compile('^huga')):
  urls_ary.append(a.get('href'))

#Arrangement pour mettre les données de boisson
drinks_ary = []

#Tournez en boucle pour accéder à toutes les pages
for page in urls_ary:
  url = 'http://hoge/top/'
  r = requests.get(url + str(page))
  soup = BeautifulSoup(r.text, 'lxml')
  #Si la balise span contient le nom de la boisson, récupérez la balise span
  tag = soup.find('span')
  drinks_ary.append(tag)

Je ne souhaite pas arrêter le programme même en cas d'erreur inattendue

Comme mentionné ci-dessus, j'étais triste que le processus se soit arrêté en raison d'une erreur inattendue lors de la rotation en boucle et que le programme soit à nouveau passé de 1. Même s'il y a une erreur, je veux l'ignorer pour le moment et mettre fin au processus. Les exceptions peuvent être traitées en utilisant «try» et «sauf».

for page in urls_ary:
  url = 'http://hoge/top/'
  r = requests.get(url + str(page))
  soup = BeautifulSoup(r.text, 'lxml')
  #Essayez du code qui peut provoquer des erreurs, except
  try:
    tag = soup.find('span')
    drinks_ary.append(tag)
  #Si une erreur se produit, ignorez ce processus et entrez dans la boucle suivante.
  except:
    continue

Impossible d'obtenir du texte avec `` .string ''

Si vous utilisez .text '', vous pouvez l'obtenir pour le moment. Pour plus d'informations sur les différences entre .stringet .text``, voir Cet article (Effacer les différences dans le comportement des chaînes et du texte dans Beautiful Soup - Python) / languages / python / bs4-text-or-string /) était personnellement facile à comprendre.

Je veux spécifier la nième balise

# <html>
# <body>
#   <ul>
#     <li>Non précisé</li>
#     <li>Non précisé</li>
#     <li>Il est précisé</li>
#     <li>Non précisé</li>
#   </ul>
# </body>
# </html>

import requests
from bs4 import BeautifulSoup

url = 'http://hoge/top'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')

#Troisième<li>Obtenir le tag
li_3rd = soup.select(body > ul > li:nth-of-type(3))

Au fait, il peut être spécifié avec nth-child () '', mais le comportement est plus compliqué que nth-of-type``.

# <html>
# <body>
#   <div>
#     <h1>Non précisé</h1>
#     <p>Non précisé</p>
#     <h2>Non précisé</h2>
#     <p>spécifier</p>
#   </div>
# </body>
# </html>

#Seconde<p>Je veux obtenir un tag
# nth-of-type
soup.select('body > div > p:nth-of-type(2)')
# nth-child
soup.select('body > div > nth-child(4)')

Il est facile d'utiliser le nth-of-type '', car je veux obtenir la deuxième balise

'' à l'intérieur de la balise <div> ''. Soit nième de type (2) ''. Par contre, la deuxième balise <p> peut être considérée comme la quatrième des balises de <div> '', donc nth-child (4) '' Peut également être spécifié.

le sélecteur css ne fonctionne pas comme prévu

Si vous vérifiez le html d'un site Web à l'aide de l'outil de développement de Chrome (?) Et spécifiez un sélecteur CSS basé sur celui-ci, vous obtiendrez rarement un élément différent de celui spécifié. C'est du côté du site Web où il y a une balise de début pour s et html mais pas de balise de fermeture, et du côté Chrome où la balise <tbody> '' est insérée arbitrairement à l'intérieur de la balise

''. Souvent un problème. Comme ils ne peuvent pas être identifiés à partir des outils de développement, il est nécessaire d'afficher la source de la page et de vérifier si la balise de fermeture est manquante.

Au fait, si la balise de fermeture est insuffisante, vous devez la traiter comme suit.

#Balise de fermeture div manquante HTML
# <html>
# <body>
#   <div>
#     <h1>Non précisé</h1>
#     <p>Non précisé</p>
#     <h2>Non précisé</h2>
#     <p>spécifier</p>
# </body>
# </html>

#Supprimer la balise div
for tag_div in soup.find_all('div'):
  tag_div.unwrap()

tag_p = soup.select('body > p:nth-of-type(2)')

Barrières avec python3, fenêtres et code de caractères

J'ai été tourmenté par `ʻUnicodeEncodeError`` en essayant de sauvegarder les données récupérées dans un fichier au format CSV. Cet article (Causes et solutions de contournement pour UnicodeEncodeError dans (Windows) Python 3) a été particulièrement utile. Il y avait de nombreux autres articles que j'ai recherchés sur Google et auxquels j'ai fait référence, mais je les omettrai ici car il y en a trop.

Au fait, j'ai pu l'enregistrer avec succès avec le code suivant.

import csv
import codecs

#Un tableau contenant les données que vous souhaitez enregistrer
drinks_data = ['hoge', 'hogehoge', 'hugahuga']

#Enregistrer au format CSV
f = codecs.open('data/sample.csv', 'wb', 'cp932', 'ignore')
writer = csv.writer(f)
writer.writerows(drinks_data)
f.close()

en conclusion

Ce qui précède est un résumé du contenu du premier scraping pour les débutants de Python. Je n'oublie pas la tristesse lorsque le programme que j'ai exécuté parce que j'ai mal compris qu'il était terminé s'est arrêté avec une erreur une heure plus tard et a recommencé ... Traitement des exceptions ... Soyez toujours conscient ...

Site de référence

Recommended Posts

Les débutants en Python sont bloqués dans leur premier scraping Web
Web scraping avec Python Première étape
[Pour les débutants] Essayez le web scraping avec Python
Web scraping avec python + JupyterLab
Web scraping débutant avec python
J'ai essayé webScraping avec python.
Obtenez une capture d'écran Web avec python
Obtenez les tendances Qiita avec le scraping Python
Web scraping pour les débutants en Python (1)
Web scraping pour les débutants en Python (4) -1
Obtenez des informations météorologiques avec Python et le grattage
[Pour les débutants] Web scraping avec Python "Accédez à l'URL de la page pour obtenir le contenu"
Obtenez des informations sur la propriété en grattant avec python
Grattage avec Python
Grattage WEB avec Python (pour mémo personnel)
Grattage avec Python
Premiers pas avec Python Web Scraping Practice
[Note personnelle] Scraping de pages Web en python3
Site de courses de chevaux Web scraping avec Python
Premiers pas avec Python Web Scraping Practice
Pratiquer le web scraping avec Python et Selenium
Scraping Web facile avec Python et Ruby
Comment les débutants en Python commencent avec Progete
Exécutez régulièrement le scraping WEB avec AWS-Lambda + Python + Cron
La première application Web créée par des débutants en Python
Web scraping avec Python (prévisions météo)
Web scraping avec Python (cours de l'action)
[Cloud102] # 1 Premiers pas avec Python (première partie des premiers pas de Python)
Grattage en Python (préparation)
Essayez de gratter avec Python.
Grattage avec Python + PhantomJS
Obtenez date avec python
Grattage avec du sélénium [Python]
Scraping avec Python + PyQuery
Scraping RSS avec Python
Web scraping pour les débutants en Python (1) Version améliorée
Analyse de données pour améliorer POG 1 ~ Web scraping avec Python ~
Scraping Web pour débutants avec Python (4) --2 Scraping sur Cloud Shell
Obtenez le code du pays avec python
J'ai essayé de gratter avec Python
Grattage au sélénium en Python
Grattage avec Selenium + Python Partie 1
Obtenez la chronologie Twitter avec Python
Grattage festif avec Python, scrapy
Enregistrez des images avec le web scraping
Obtenez des données Youtube avec python
Première simulation de cellule nerveuse avec NEURON + Python
Grattage avec Tor en Python
API Web avec Python + Falcon
Obtenir l'ID de thread avec python
Web scraping avec Selenium (Python)
Scraping prévisions météorologiques avec python
Grattage avec Selenium + Python Partie 2
Commencez avec Python! ~ ② Grammaire ~
Application Web avec Python + Flask ② ③
J'ai essayé de gratter avec du python