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.
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.
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
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,
@ asyncio.coroutine </ code> lors de la définition d'un collout, et il est complet avec async def.
yield from </ code> et le générateur est maintenant une instruction await </ code>, qui est plus simple et plus facile à comprendre.
Je pense que c'est.
Tout ce code est publié sur Github, veuillez donc vous y référer si vous en avez.
Recommended Posts