Ceci est l'article sur le 13ème jour du calendrier de l'Avent de l'Université de Kinki 2019.
Tout d'abord, il est important de noter que le scraping est fondamentalement un dernier recours qui ne devrait pas être fait si vous n'en avez pas besoin. Cette fois, je récupère le classement des tags de Qiita, mais Qiita a une API et j'obtiens le classement des tags. J'ai fait du scraping car il n'y avait pas d'API à faire (au 8 décembre 2019). Si vous pouvez obtenir les informations que vous voulez en utilisant l'API, récupérez-les avec l'API. De plus, lors du scraping, attendez au moment de la connexion Mettons du temps de côté et accordons du temps pour la connexion.
Docker
La version que j'utilise est la suivante.
Docker version 19.03.5, build 633a0ea
docker-compose.yml
docekr-compsoe.yml
version: '3'
services:
selenium-hub:
image: selenium/hub
container_name: selenium-hub
ports:
- "4444:4444"
chrome:
image: selenium/node-chrome-debug
depends_on:
- selenium-hub
environment:
- HUB_PORT_4444_TCP_ADDR=selenium-hub
- HUB_PORT_4444_TCP_PORT=4444
python:
build: .
container_name: python
volumes:
- .:/workspace
command: /bin/bash
tty: true
stdin_open: true
FROM python:3.7
WORKDIR /workspace
RUN pip install \
selenium \
beautifulsoup4
Je n'écrirai plus ce qui est un fichier dokcer-compose ou docker, donc si vous ne comprenez pas j'ai essayé d'utiliser Phoenix et PostgreSQL d'Elixir sur Docker Veuillez vous y référer car il est écrit en détail dans.
Commençons par docker-compose.yml.
Je pense que l'option de base Selenium
est maintenant pour gratter les sites dynamiques.
Créez un conteneur avec les images selenium / hub
et selenium / node-chrome-debug
.
Ici, «environnement» est défini dans «sélénium / node-chrome-debug». Veuillez noter que vous ne pouvez pas gratter sans cela.
Le Dockerfile construit l'environnement python. La commande RUN
est utilisée pour télécharger les bibliothèques nécessaires.
Placez ces fichiers et le code en dessous au même niveau et exécutez docker-compose up -d --build
pour lancer le conteneur.
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from bs4 import BeautifulSoup
import pprint
class QiitaGetRanking():
"""
Classe pour obtenir les données de classement de Qiita.
"""
def get_tag_ranking(self, browser: webdriver) -> dict:
"""
Fonction pour obtenir des informations sur le classement des tags de Qiita.
Parameters
----------
browser: webdrive
Objet Webdriver pour le scraping
Returns
-------
tag_ranking_data: dict
Objet dictionnaire contenant le classement des balises.
"""
html = browser.page_source.encode('utf-8')
soup = BeautifulSoup(html, "html.parser")
ra_tag_names = soup.find_all(class_='ra-Tag_name pr-1')
tag_ranking_data = {}
for i, ra_tag_name in enumerate(ra_tag_names):
tag_ranking_data[i+1] = [ra_tag_name.text,
'https://qiita.com/tags/%s'%(ra_tag_name.text.lower())]
return tag_ranking_data
if __name__ == "__main__":
"""
déclaration principale.le navigateur doit être fermé dès que l'acquisition html est terminée.La même chose s'applique lorsqu'une erreur survient.
"""
try:
browser = webdriver.Remote(
command_executor='http://selenium-hub:4444/wd/hub',
desired_capabilities=DesiredCapabilities.CHROME)
print("start scrape")
browser.get('https://qiita.com')
#Attendez que tout le javascript soit chargé.Jugement de timeout si la lecture ne se termine pas même après 15 secondes.
WebDriverWait(browser, 15).until(EC.presence_of_all_elements_located)
print("generate object")
qgr = QiitaGetRanking()
ranking_data = qgr.get_tag_ranking(browser)
browser.close()
browser.quit()
pprint.pprint(ranking_data)
except:
browser.close()
browser.quit()
Je pense que le code est assez simple: lors du scraping avec docker, la construction d'un serveur sélénium et le scraping sont plus faciles et plus légers que la création d'un environnement sélénium sur ubuntu.
Pour webdrriver.Remote, reportez-vous à 2.5. Utilisation de Selenium avec Remote WebDriver. S'il vous plaît essayez.
Assurez-vous que vous avez 3 conteneurs dans docker ps
, puis exécutez le programme dans docker exec -it python python qiita.py
.
start scrape
generate object
{1: ['Python', 'https://qiita.com/tags/python'],
2: ['JavaScript', 'https://qiita.com/tags/javascript'],
3: ['AWS', 'https://qiita.com/tags/aws'],
4: ['Rails', 'https://qiita.com/tags/rails'],
5: ['Ruby', 'https://qiita.com/tags/ruby'],
6: ['Débutant', 'https://qiita.com/tags/Débutant'],
7: ['Docker', 'https://qiita.com/tags/docker'],
8: ['PHP', 'https://qiita.com/tags/php'],
9: ['Vue.js', 'https://qiita.com/tags/vue.js'],
10: ['Go', 'https://qiita.com/tags/go']}
S'il est affiché comme ça, c'est une victoire totale, merci pour votre travail acharné.
Cette fois, je vous ai montré comment gratter un site dynamique à l'aide de Docker. Profitons du scraping dans les limites!
Recommended Posts