Maison > Article > développement back-end > Analyse approfondie des caractéristiques et des avantages du framework scrapy
Le framework Scrapy est un framework d'exploration Python open source qui peut être utilisé pour créer et gérer des applications qui explorent des données. Il s'agit de l'un des frameworks d'exploration les plus populaires actuellement sur le marché. Le framework Scrapy utilise des E/S asynchrones pour les requêtes réseau, qui peuvent capturer efficacement les données de sites Web et présentent les avantages d'évolutivité et de stabilité.
Cet article analysera en profondeur les caractéristiques et les avantages du framework Scrapy, et illustrera son fonctionnement efficace et stable à travers des exemples de code spécifiques.
Le framework Scrapy utilise le langage Python, qui est facile à apprendre et a une faible barrière d'entrée. Dans le même temps, il fournit également une documentation complète et des exemples de code pour permettre aux utilisateurs de démarrer rapidement. Ce qui suit est un exemple simple de robot d'exploration Scrapy qui peut être utilisé pour obtenir les titres et les liens des questions populaires sur Zhihu :
import scrapy class ZhihuSpider(scrapy.Spider): name = "zhihu" # 爬虫名 start_urls = [ 'https://www.zhihu.com/hot' ] # 起始网站链接 def parse(self, response): for question in response.css('.HotItem'): yield { 'title': question.css('h2::text').get(), 'link': question.css('a::attr(href)').get() }
Dans le code ci-dessus, un programme d'exploration nommé "zhihu" est défini en héritant de la classe scrapy.Spider. L'attribut start_urls est défini dans la classe et les liens de sites Web à explorer sont spécifiés dans une liste. Une méthode parse() est définie pour analyser la réponse et obtenir les titres et les liens des questions populaires via le sélecteur CSS, et renvoyer les résultats sous forme de dictionnaire.
Le framework Scrapy utilise des E/S asynchrones pour les requêtes réseau. Il peut envoyer plusieurs requêtes asynchrones en même temps et renvoyer toutes les réponses immédiatement. Cette méthode améliore considérablement la vitesse et l’efficacité du robot. Voici un exemple simple de code de requête asynchrone Scrapy :
import asyncio import aiohttp async def fetch(url): async with aiohttp.ClientSession() as session: async with session.get(url) as response: return await response.text() async def main(): urls = [ 'https://www.baidu.com', 'https://www.google.com', 'https://www.bing.com' ] tasks = [] for url in urls: tasks.append(asyncio.ensure_future(fetch(url))) responses = await asyncio.gather(*tasks) print(responses) if __name__ == '__main__': loop = asyncio.get_event_loop() loop.run_until_complete(main())
Dans le code ci-dessus, la méthode de requête asynchrone est implémentée via la bibliothèque asyncio et la bibliothèque aiohttp. Une fonction asynchrone fetch() est définie pour l'envoi de requêtes, et la bibliothèque aiohttp est utilisée pour implémenter un client HTTP asynchrone. Une fonction asynchrone main() est définie pour traiter les URL, l'objet Future renvoyé par fetch() est ajouté à la liste des tâches, et enfin la fonction asyncio.gather() est utilisée pour obtenir les résultats de retour de toutes les tâches.
Le framework Scrapy fournit un riche ensemble d'interfaces d'extension et de plug-ins. Les utilisateurs peuvent facilement ajouter un middleware personnalisé, des pipelines, des téléchargeurs, etc. pour étendre ses fonctionnalités et ses performances. Voici un exemple de middleware Scrapy simple :
from scrapy import signals class MyMiddleware: @classmethod def from_crawler(cls, crawler): o = cls() crawler.signals.connect(o.spider_opened, signal=signals.spider_opened) crawler.signals.connect(o.spider_closed, signal=signals.spider_closed) return o def spider_opened(self, spider): spider.logger.info('常规中间件打开: %s', spider.name) def spider_closed(self, spider): spider.logger.info('常规中间件关闭: %s', spider.name) def process_request(self, request, spider): spider.logger.info('常规中间件请求: %s %s', request.method, request.url) return None def process_response(self, request, response, spider): spider.logger.info('常规中间件响应: %s %s', str(response.status), response.url) return response def process_exception(self, request, exception, spider): spider.logger.error('常规中间件异常: %s %s', exception, request.url) return None
Dans le code ci-dessus, une classe middleware MyMiddleware est définie. Une fonction spéciale from_crawler() est définie dans la classe pour gérer la connexion du signal du programme d'exploration. Les fonctions spider_opened() et spider_closed() sont définies pour gérer les signaux d'ouverture et de fermeture du robot. Les fonctions process_request() et process_response() sont définies pour traiter les signaux de demande et de réponse. La fonction process_exception() est définie pour gérer les informations d'exception.
Le framework Scrapy est hautement configurable et réglable, et peut ajuster les détails du robot en fonction des besoins de l'utilisateur, améliorant ainsi la stabilité et la robustesse du robot d'exploration du framework Scrapy. Voici un exemple de configuration du délai de téléchargement et du délai d'expiration de Scrapy :
DOWNLOAD_DELAY = 3 DOWNLOAD_TIMEOUT = 5
Dans le code ci-dessus, en définissant le paramètre DOWNLOAD_DELAY sur 3, cela signifie que vous devez attendre 3 secondes entre chaque deux téléchargements. En définissant le paramètre DOWNLOAD_TIMEOUT sur 5, cela signifie que si aucune réponse n'est reçue dans les 5 secondes, le délai expirera et se terminera.
Résumé
Le framework Scrapy est un framework de robot d'exploration Python efficace, évolutif et stable avec les avantages d'un apprentissage facile, d'E/S asynchrones, d'évolutivité et de stabilité. Cet article présente les principales fonctionnalités et avantages du framework Scrapy à travers des exemples de code spécifiques. Pour les utilisateurs qui souhaitent développer des applications de robots efficaces et stables, le framework Scrapy est sans aucun doute un bon choix.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!