Scraping à l'aide de la syntaxe Python 3.5 Async

En tant que méthode de scraping avec Python, il existe une méthode d'utilisation des bibliothèques existantes telles que Scrapy et Demiurge, mais Cette fois, je vais essayer de créer le mien en utilisant la syntaxe Async ajoutée à partir de Python 3.5.

Je n'expliquerai pas ce qu'est async / await. Pour savoir comment utiliser la syntaxe async / await, l'article ici a été utile.


environnement

How To

D'abord à partir de la partie téléchargement du site Web

import asyncio
import urllib.request


class Downloader:
    def __init__(self, urls):
        self.urls = urls

    def run(self):
        loop = asyncio.get_event_loop()
        return loop.run_until_complete(self.fetch())

    async def fetch(self):
        return await asyncio.wait([self.download(i, url) for i, url in enumerate(self.urls)])

    async def download(self, n, url):
        request = urllib.request.Request(url)
        html = urllib.request.urlopen(request).read()
        print("{0} {1} download finish...".format(n, url))
        return html


if __name__ == "__main__":
    downloader = Downloader([
        "https://www.python.org/", 
        "https://www.python.org/about/", 
        "https://www.python.org/downloads/"
    ])

    downloader.run()

résultat

1 https://www.python.org/about/ download finish
2 https://www.python.org/downloads/ download finish
0 https://www.python.org/ download finish

La particularité du code est qu'il exécute la méthode de téléchargement en parallèle. Vous pouvez voir qu'ils téléchargent de manière asynchrone au lieu de les télécharger un par un de manière synchrone.

Grattage

Avec cela seul, je viens de télécharger le HTML et l'analyse est gênante, je vais donc modifier le code pour ajouter un analyseur. Cette fois, nous utiliserons BeautifulSoup pour obtenir le contenu de la balise Title du site Web.

import asyncio
import urllib.request
from bs4 import BeautifulSoup


class Scraping:
    def __init__(self, urls):
        self.urls = urls

    def run(self):
        loop = asyncio.get_event_loop()
        return loop.run_until_complete(self.fetch())

    async def fetch(self):
        return await asyncio.wait(
            [self.scraping(url) for url in self.urls]
        )

    async def scraping(self, url):
        request = urllib.request.Request(url)
        html = urllib.request.urlopen(request).read()
        bs = BeautifulSoup(html, "html.parser")
        print(bs.title.string)


if __name__ == "__main__":
    scraping = Scraping([
        "https://www.python.org/", 
        "https://www.python.org/about/", 
        "https://www.python.org/downloads/"
    ])

    scraping.run()

résultat

Welcome to Python.org
Download Python | Python.org
About Python™ | Python.org

Résumé

C'est facile, mais je peux maintenant mettre en œuvre mon propre processus de grattage. Après cela, en implémentant la fonction d'analyse, cela devient un cadre parfait. Pour l'exploration, je pense que vous devriez vous référer à Crawler / Web Scraping Advent Calendar etc.

Par rapport à 3.4 dans la syntaxe Async,

Tout ce code est publié sur Github, veuillez donc vous y référer si vous en avez.

référence

Recommended Posts