Scraping mit Python 3.5 Async-Syntax

Als Methode zum Scraping mit Python gibt es eine Methode zum Verwenden vorhandener Bibliotheken wie Scrapy und Demiurge Dieses Mal werde ich versuchen, meine eigene mit der aus Python 3.5 hinzugefügten Async-Syntax zu erstellen.

Ich werde nicht erklären, was Async / Warten ist. Für die Verwendung der asynchronen / wartenden Syntax war der Artikel hier hilfreich.


Umgebung

How To

Zuerst aus dem Download-Teil der Website

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()

Ergebnis

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

Das Besondere am Code ist, dass die Download-Methode parallel ausgeführt wird. Sie können sehen, dass sie asynchron heruntergeladen werden, anstatt sie einzeln synchron herunterzuladen.

Schaben

Allein damit habe ich gerade den HTML-Code heruntergeladen und das Parsen ist mühsam, daher werde ich den Code ändern, um einen Parser hinzuzufügen. Dieses Mal verwenden wir Beautiful Soup, um den Inhalt des Title-Tags der Website abzurufen.

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()

Ergebnis

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

Zusammenfassung

Es ist einfach, aber jetzt kann ich meinen eigenen Scraping-Prozess implementieren. Danach wird durch die Implementierung der Crawling-Funktion ein feines Framework. Ich denke, Sie sollten sich beim Crawlen auf Adventskalender für Crawler / Web Scraping usw. beziehen.

Im Vergleich zu 3.4 in der Async-Syntax

Der gesamte Code wird auf Github veröffentlicht. Wenn Sie welche haben, lesen Sie dies bitte.

Referenz

Recommended Posts