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.
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.
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
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
@ asyncio.coroutine </ code> -Dekorator hinzuzufügen, wenn ein Collout definiert wird, und es ist jetzt mit async def abgeschlossen.
Ausbeute von </ code> und dem Generator verwechselt werden konnte, ist jetzt eine wait </ code> -Anweisung, die einfacher und verständlicher ist.
Ich glaube, es ist.
Der gesamte Code wird auf Github veröffentlicht. Wenn Sie welche haben, lesen Sie dies bitte.
Recommended Posts