Web scraping pour les débutants en Python (1) Version améliorée

Cet article est une version améliorée de la source de l'article précédent Débutants Web Scraping avec Python (1). En changeant l'utilisation de la méthode bs4, j'ai pu améliorer le fait que des éléments supplémentaires apparaissent à la fin lors de l'extraction de l'actualité de Yahoo News, c'est donc un mémo.

Feuille de route pour l'apprentissage du web scraping en Python

(1) Réussir à gratter le contenu cible localement pour le moment. ← Toujours ici </ font> (2) Liez les résultats de la récupération locale à une feuille de calcul Google. (3) cron est automatiquement exécuté localement. (4) Défiez l'exécution automatique gratuite sur le serveur cloud. (Google Compute Engine) (5) Défiez l'exécution automatique gratuite sans serveur sur le cloud. (Peut-être Cloud Functions + Cloud Scheduler)

Fonctions de l'échantillon PGM (1)

・ Obtenez des informations sur le site Web à l'aide de demandes ・ Parse html avec Beautiful Soup ~~ ・ Recherchez une chaîne de caractères spécifique avec la bibliothèque re qui peut rechercher des chaînes de caractères (identifier l'actualité du titre) ~~ </ font> ・ Extraire clairement les titres et les liens en utilisant uniquement la méthode bs4 </ font> -Afficher tous les titres d'actualités et les liens de la liste des résultats acquis sur la console

Source d'échantillon précédente

requests-test.py


import requests
from bs4 import BeautifulSoup
import re

#Télécharger les informations du site Web à l'aide de demandes
url = 'https://news.yahoo.co.jp/'
response = requests.get(url)
#print(response.text)
print('url: ',response.url)
print('status-code:',response.status_code) #Code d'état HTTP, généralement[200 OK]
print('headers[Content-Type]:',response.headers['Content-Type']) #Puisque les en-têtes sont un dictionnaire, vous pouvez spécifier la clé du contenu-sortie de type
print('encoding: ',response.encoding) #codage

#BeautifulSoup()Informations sur le site Web et analyseur acquis dans"html.parser"donner
soup = BeautifulSoup(response.text, "html.parser")

#Dans l'attribut href"news.yahoo.co.jp/pickup"Extrayez uniquement ceux qui contiennent
elems = soup.find_all(href = re.compile("news.yahoo.co.jp/pickup"))

#Le titre et le lien des actualités extraites sont affichés sur la console.
for elem in elems:
    print(elem.contents[0])
    print(elem.attrs['href'])

Cette source d'échantillon

Trouvez la classe "opicsList "avec le sélecteur CSS Find_all'li'tag Trouvez le'a'tag

requests-test.py


import requests
from bs4 import BeautifulSoup

#Télécharger les informations du site Web à l'aide de demandes
url = 'https://news.yahoo.co.jp/'
response = requests.get(url)

#BeautifulSoup()Informations sur le site Web et analyseur acquis dans"html.parser"donner
soup = BeautifulSoup(response.text, "html.parser")
print('soup: ',type(soup))

topicsindex = soup.find('div', class_='topicsList')
#topicsindex = soup.find('div', attrs={'class': 'topicsList'})
print('topicsindex: ',type(topicsindex))

####manière(1)
#Après l'extraction avec li, tournez tout en extrayant un avec l'instruction for
topics = topicsindex.find_all('li')
#print(topics)
print('topics',type(topics))

#Le titre et le lien des actualités extraites sont affichés sur la console.
for topic in topics:
    print(topic.find('a').contents[0])
    print(topic.find('a').attrs['href'])

####manière(2)
#Après avoir extrait jusqu'à la balise a dans la notation d'inclusion de liste, tournez-la avec l'instruction for
headlines = [i.find('a') for i in topicsindex.find_all('li')]
print(headlines)
print(type(headlines))
#Le titre et le lien des actualités extraites sont affichés sur la console.
for headline in headlines:
    print(headline.contents[0])
    print(headline.attrs['href'])

Cette fois, j'ai également appris à extraire bs4 de différentes manières. Développez une stratégie tout en analysant grossièrement le html de Yahoo! News, ce qui est difficile et difficile à comprendre. スクリーンショット 2020-09-12 17.58.47.png

Les principaux sujets d'actualité sont -Définir dans la classe "TopicsList", </ font> ・ </ font> lors de la connexion des actualités avec le'li'tag -Les liens sont attachés avec l'attribut href du'a'tag </ font> Puisqu'il s'agit d'une composition, c'est une stratégie pour les retirer dans l'ordre.

Le code autour de la soupe et trouver est ci-dessous.

requests-test.py


soup = BeautifulSoup(response.text, "html.parser")
topicsindex = soup.find('div', class_='topicsList')
topics = topicsindex.find_all('li')
for topic in topics:    
    print(topic.find('a').contents[0])
    print(topic.find('a').attrs['href'])

Ce qui suit est une impression de cet attribut.

requests-test.py


print('soup: ',type(soup))
print('topicsindex: ',type(topicsindex))
print('topics: ',type(topics))
print('topic: ',type(topic))

Cliquez ici pour les résultats.

bash


soup:  <class 'bs4.BeautifulSoup'>
topicsindex:  <class 'bs4.element.Tag'>
topics:  <class 'bs4.element.ResultSet'>
topic:  <class 'bs4.element.Tag'>

L'état de la soupe est l'objet "BeauSoup", L'état où se trouve la classe avec le sélecteur CSS est l'objet 'Tag', La balise li find_all est un objet'ResultSet '(bien que introuvable dans la documentation). Vous pouvez voir que le'ResultSet'est de type liste Python et ses éléments individuels sont également des objets'Tag '. Puisque chaque élément «topique» de «sujets» est un objet Tag, il est possible d'utiliser des méthodes telles que find. La partie chaîne de caractères (c'est-à-dire le titre de l'actualité) entourée de balises dans le contenu, L'attribut href peut également être extrait.

Comment faire (1) Après l'extraction avec la balise li, tournez lors de l'extraction de la balise a avec l'instruction for Méthode (2) Après avoir extrait jusqu'à la balise a dans la notation d'inclusion de liste, tournez-la avec l'instruction for J'en ai essayé deux, mais les deux donnent le même résultat. Les sujets avec des photos comme la dernière fois ne sont plus extraits de manière étrange!

bash


Compte Docomo Obtenir des informations de faux HP?
https://news.yahoo.co.jp/pickup/6370962
Mots politiques pour décider de démissionner
https://news.yahoo.co.jp/pickup/6370953
Deux personnes sont mortes dans les flammes après un accident de voiture à Hakone
https://news.yahoo.co.jp/pickup/6370970
Dans l'ancien tertre funéraire?Avis sur la carte d'enquête HP
https://news.yahoo.co.jp/pickup/6370965
Maladie cérébrale de l'avortement fœtal sélectionné
https://news.yahoo.co.jp/pickup/6370957
Montagnes de ferraille en banlieue Pourquoi
https://news.yahoo.co.jp/pickup/6370958
Fujii 2 couronnes mur 5 défaites consécutives contre Toyoshima Ryuo
https://news.yahoo.co.jp/pickup/6370961
Naissance du "nouveau et plus jeune joueur" de 17 ans
https://news.yahoo.co.jp/pickup/6370964

Au fait, la personne qui a extrait le tag a à l'avance par la méthode (2) est un objet ordinaire de type "Liste". Je ne comprends rien à la vérification des éléments de chrome, Si vous l'extrayez jusqu'à présent, vous pouvez voir qu'il s'agit d'une forme simple qui est facile pour les débutants.

bash


<class 'list'>
[<a data-ual-gotocontent="true" data-ylk="rsec:tpc_maj;slk:title;pos:1;" href="https://news.yahoo.co.jp/pickup/6370962">Compte Docomo Obtenir des informations de faux HP?</a>, 
<a data-ual-gotocontent="true" data-ylk="rsec:tpc_maj;slk:title;pos:2;" href="https://news.yahoo.co.jp/pickup/6370953">Mots politiques pour décider de démissionner<span aria-label="NEW" class="labelIcon labelIcon-NEW"></span></a>, 
<a data-ual-gotocontent="true" data-ylk="rsec:tpc_maj;slk:title;pos:3;" href="https://news.yahoo.co.jp/pickup/6370970">Deux personnes sont mortes dans les flammes après un accident de voiture à Hakone<span aria-label="NEW" class="labelIcon labelIcon-NEW"></span></a>, 
<a data-ual-gotocontent="true" data-ylk="rsec:tpc_maj;slk:title;pos:4;" href="https://news.yahoo.co.jp/pickup/6370965">Dans l'ancien tertre funéraire?Avis sur la carte d'enquête HP</a>, 
<a data-ual-gotocontent="true" data-ylk="rsec:tpc_maj;slk:title;pos:5;" href="https://news.yahoo.co.jp/pickup/6370957">Maladie cérébrale de l'avortement fœtal sélectionné<span aria-label="NEW" class="labelIcon labelIcon-NEW"></span></a>, 
<a data-ual-gotocontent="true" data-ylk="rsec:tpc_maj;slk:title;pos:6;" href="https://news.yahoo.co.jp/pickup/6370958">Montagnes de ferraille en banlieue Pourquoi<span aria-label="NEW" class="labelIcon labelIcon-NEW"></span></a>, 
<a data-ual-gotocontent="true" data-ylk="rsec:tpc_maj;slk:title;pos:7;" href="https://news.yahoo.co.jp/pickup/6370961">Fujii 2 couronnes mur 5 défaites consécutives contre Toyoshima Ryuo</a>, 
<a data-ual-gotocontent="true" data-ylk="rsec:tpc_maj;slk:title;pos:8;" href="https://news.yahoo.co.jp/pickup/6370964">Naissance du "nouveau et plus jeune joueur" de 17 ans</a>]

Épilogue

Cette fois, j'ai essayé différentes choses en regardant le document officiel. La voie royale est de jeter un œil sur les sites Web de nos prédécesseurs et de s'y référer tout en gardant les documents officiels au cœur. https://www.crummy.com/software/BeautifulSoup/bs4/doc/ (anglais: Beautiful Soup version 4.9.1 du 13 septembre 2020) http://kondou.com/BS4/ (japonais: Beautiful Soup version 4.2.0 du 13 septembre 2020)

Recommended Posts