Cette fois, j'aimerais faire du web scraping en utilisant Python et Selenium, que j'étudie actuellement. Le site cible est Google, qui recherche avec le mot-clé spécifié, acquiert le nombre spécifié d'éléments et écrit les trois éléments "titre, URL et résumé" dans la base de données.
Obtenez les éléments suivants. Le but ultime est d'écrire les informations dans la base de données SQLite.
Utilisez Python 3.7.1. L'environnement de développement est Visual Studio 2019. J'ai téléchargé le pilote pour Firefox depuis geckodriver.
Le code source est le suivant. ** Veuillez noter que le code ci-dessous fonctionne à partir du "23 avril 2020", mais il peut ne pas fonctionner en raison de changements dans les spécifications du site à l'avenir. ** **
google.py
import urllib.parse
import records
from selenium.webdriver import Firefox, FirefoxOptions
from sqlalchemy.exc import IntegrityError
#Rechercher à l'aide des mots-clés suivants
keywd = ['Python','Apprentissage automatique']
#Le nom du fichier qui enregistre les données récupérées
db = records.Database('sqlite:///google_search.db')
db.query('''CREATE TABLE IF NOT EXISTS items (
url text PRIMARY KEY,
title text,
summary text NULL)''')
def store_data(url, title, summary):
try:
db.query('''INSERT INTO items (url, title, summary)
VALUES (:url, :title, :summary)''',
url=url, title=title, summary=summary)
except IntegrityError:
#Ignorer cet élément car il existe déjà
print("it's already exist.")
return False
return True
def visit_next_page(driver, url):
driver.get(url)
items = driver.find_elements_by_css_selector('#rso > div.g')
for item in items:
tag = item.find_element_by_css_selector('div.r > a')
link = tag.get_attribute('href')
title = tag.find_element_by_tag_name('h3').text.strip()
summary = item.find_element_by_css_selector('div.s span.st').text.strip()
if store_data(link, title, summary):
print(title, link, sep='\n', end='\n\n')
def main():
#Site cible et nombre de recherches (recherche_unit * search_loop)
base_url = "https://www.google.co.jp/"
search_unit = 20 #Nombre d'éléments affichés sur une page (il semble impossible de spécifier 100 ou plus)
search_loop = 5
start = 0
#Combinez les mots-clés en une seule chaîne
target = ' '.join(keywd)
#Encodage URL (l'encodage par défaut est"utf-8")
target = urllib.parse.quote(target)
opt = FirefoxOptions()
#Si vous souhaitez observer vous-même le comportement du navigateur, veuillez commenter
opt.add_argument('-headless')
driver = Firefox(options=opt)
#Réglez le temps d'attente
driver.implicitly_wait(10)
#Lire page par page
for i in range(search_loop):
url = "{0}search?num={1}&start={2}&q={3}".format(base_url, search_unit, start, target)
start += search_unit
print("\npage count: {0}...".format(i + 1), end='\n\n')
visit_next_page(driver, url)
driver.quit()
if __name__ == '__main__':
main()
Comme vous pouvez le voir dans les commentaires dans la source, je vais vous expliquer la partie centrale du grattage.
La partie qui contient les données pour un cas est la suivante. Obtenez ceci avec un code comme celui-ci:
items = driver.find_elements_by_css_selector('#rso > div.g')
L'URL du titre et du lien est la suivante. La partie de contour est la suivante.
Obtenez ceci avec un code comme celui-ci:
tag = item.find_element_by_css_selector('div.r > a')
link = tag.get_attribute('href')
title = tag.find_element_by_tag_name('h3').text.strip()
summary = item.find_element_by_css_selector('div.s span.st').text.strip()
Lorsque vous l'utilisez réellement, spécifiez le mot-clé que vous souhaitez rechercher et le nom du fichier à enregistrer au début du code source.
#Rechercher à l'aide des mots-clés suivants
keywd = ['Python', 'Apprentissage automatique']
#Le nom du fichier qui enregistre les données récupérées
db = records.Database('sqlite:///google_search.db')
De plus, même si le même programme est exécuté plusieurs fois, la même URL sera ignorée sans être enregistrée.
def store_data(url, title, summary):
try:
db.query('''INSERT INTO items (url, title, summary)
VALUES (:url, :title, :summary)''',
url=url, title=title, summary=summary)
except IntegrityError:
#Ignorer cet élément car il existe déjà
print("it's already exist.")
return False
return True
Au début, je pensais obtenir environ 1000 éléments sur une seule page, mais il semble que la limite soit d'environ 100 éléments par page selon les spécifications de Google.
C'est pourquoi je racle en passant à la page suivante en utilisant deux variables, search_unit
et search_loop
.
Aussi, pourquoi ne pas utiliser Beautiful Soup? Cependant, je voulais m'entraîner à utiliser Selenium, et comme il existe de nombreux sites qui utilisent JavaScript ces jours-ci, il semble qu'il y aura plus d'opportunités d'utiliser Selenium, donc cette fois en grattant avec cette méthode J'ai essayé de.
Vous êtes libre d'utiliser le code source introduit cette fois, mais veuillez le faire à vos propres risques.
[Bases et pratique du grattage Python / Seppe vanden Broucke et al.](Https://www.amazon.co.jp/Python%E3%82%B9%E3%82%AF%E3%83%AC%E3%82% A4% E3% 83% 94% E3% 83% B3% E3% 82% B0% E3% 81% AE% E5% 9F% BA% E6% 9C% AC% E3% 81% A8% E5% AE% 9F% E8% B7% B5-% E3% 83% 87% E3% 83% BC% E3% 82% BF% E3% 82% B5% E3% 82% A4% E3% 82% A8% E3% 83% B3% E3 % 83% 86% E3% 82% A3% E3% 82% B9% E3% 83% 88% E3% 81% AE% E3% 81% 9F% E3% 82% 81% E3% 81% AEWeb% E3% 83 % 87% E3% 83% BC% E3% 82% BF% E5% 8F% 8E% E9% 9B% 86% E8% A1% 93-impress-top-gear / dp / 4295005282 / ref = tmm_pap_swatch_0? _Encoding = UTF8 & qid = 1587624962 & sr = 1-1)
Recommended Posts