Maison  >  Article  >  développement back-end  >  Questions d'entretien courantes sur Python super détaillées

Questions d'entretien courantes sur Python super détaillées

不言
不言avant
2019-02-23 10:18:4115945parcourir

Questions d'entretien courantes sur Python super détaillées

Le contenu de cet article concerne des questions d'entretien Python courantes très détaillées, qui ont une certaine valeur de référence. Amis dans le besoin Vous pouvez vous y référer, J'espère que cela vous sera utile.

Articles connexes recommandés  : " Résumé des questions d'entretien Python en 2020 (dernière) "

1. Lecture de fichiers de big data

① Utiliser le générateur

② Itérateur pour le parcours itératif : pour la ligne dans le fichier

2. La différence entre les itérateurs et les générateurs

1) L'itérateur est un concept plus abstrait, tout objet, si sa classe a la méthode next et la méthode iter, se renvoie lui-même. Pour les objets conteneurs tels que chaîne, liste, dict, tuple, etc., il est très pratique d'utiliser une boucle for à parcourir. En arrière-plan de l'instruction for, la fonction iter() est appelée sur l'objet conteneur iter() est une fonction intégrée de python. iter() renvoie un objet itérateur qui définit la méthode next(), qui accède aux éléments du conteneur un par un. Next() est également une fonction intégrée de python. Lorsqu'il n'y a aucun élément suivant, next() lèvera une exception StopIteration

2) Generator est un outil simple et puissant pour créer des itérateurs. Elles sont écrites comme des fonctions normales, sauf qu'elles utilisent l'instruction rendement lorsqu'elles doivent renvoyer des données. Chaque fois que next() est appelé, le générateur renvoie la position où il s'est arrêté (il se souvient de la position où l'instruction a été exécutée pour la dernière fois et de toutes les valeurs des données)

Différence : les générateurs peuvent faire ce que les itérateurs peuvent faire : tout, et comme les méthodes __iter__() et next() sont créées automatiquement, le générateur est particulièrement concis et le générateur est également efficace. L'utilisation d'expressions génératrices au lieu de compréhensions de liste peut en même temps économiser de la mémoire. En plus de la méthode automatique de création et de sauvegarde de l'état du programme, lorsque le générateur se termine, l'exception StopIteration sera également automatiquement levée

3. Le rôle et la fonction du décorateur :

Présentation des journaux

Statistiques du temps d'exécution de la fonction

Traitement préparatoire avant l'exécution de la fonction

Fonction de nettoyage après l'exécution de la fonction

Vérification des autorisations et autres scénarios

Cache

4. Parlez brièvement de GIL :

Global Interpreter Lock (verrouillage global de l'interprète)

Python L'exécution du code est contrôlée par la machine virtuelle Python (également appelée boucle principale de l'interpréteur, version CPython). Python a été initialement conçu pour n'avoir qu'un seul thread s'exécutant dans la boucle principale de l'interpréteur en même temps, c'est-à-dire , à tout moment, un seul thread s'exécute dans l'interpréteur. L'accès à la machine virtuelle Python est contrôlé par le Global Interpreter Lock (GIL), qui garantit qu'un seul thread est en cours d'exécution à la fois.

Dans un environnement multithread, la machine virtuelle Python s'exécute comme suit :

1. Configurez GIL

2. pour exécuter

3. Exécutez :

a. Spécifiez le nombre d'instructions de bytecode, ou b. Le thread abandonne activement le contrôle (time.sleep(0) peut être appelé)

4. Mettez le fil en état de veille

5. Déverrouillez le GIL

6. Répétez à nouveau toutes les étapes ci-dessus

avant d'appeler du code externe (comme par exemple). fonction d'extension C/C++), le GIL sera verrouillé jusqu'à la fin de cette fonction (puisqu'aucun bytecode Python n'est exécuté pendant cette période, aucun changement de thread ne sera effectué).

5. find et grep

La commande grep est un puissant outil de recherche de texte. La chaîne de contenu de recherche grep peut être une expression régulière, permettant des modèles sur les fichiers texte. Trouver. Si un motif correspondant est trouvé, grep imprime toutes les lignes contenant le motif.

find est généralement utilisé pour rechercher des fichiers qui répondent aux conditions dans un répertoire spécifique. Il peut également être utilisé pour rechercher des fichiers appartenant à un utilisateur spécifique.

6. Que dois-je faire si le service en ligne peut raccrocher pour diverses raisons ?

Supervisor, un outil de gestion des processus en arrière-plan sous Linux

Après chaque modification de fichier, Linux exécute le redémarrage du service superviseur

Comment améliorer le fonctionnement. de python Efficacité

Utilisez des générateurs ; les codes clés utilisent des packages de fonctions externes (Cython, pylnlne, pypy, pyrex) – essayez d'éviter d'accéder aux propriétés des variables dans les boucles

8. Commandes Linux courantes :

ls,help,cd,more,clear,mkdir,pwd,rm,grep,find,mv,su,date

9. Utilisation de Yield en Python

Yield est simplement un générateur, de sorte que la fonction se souvient de la position dans le corps de la fonction lors de son dernier retour. Le deuxième (ou n) appel au générateur passe à cette fonction.


10. Comment Python gère la mémoire

1. Garbage collection : Python n'est pas comme C++, Java et d'autres langages. Ils peuvent attribuer des valeurs aux variables directement sans déclarer le type de variable à l'avance. Pour le langage Python, le type et la mémoire de l'objet sont déterminés au moment de l'exécution. C'est aussi la raison pour laquelle nous appelons le langage Python typé dynamiquement (on peut ici simplement résumer le typage dynamique à l'allocation d'adresses mémoire variables, qui détermine automatiquement le type de variable et attribue une valeur à la variable au moment de l'exécution).

2. Comptage de références : Python utilise une méthode similaire aux objets du noyau Windows pour gérer la mémoire. Chaque objet conserve un nombre de références pointant vers l'objet. Lorsqu'une variable est liée à un objet, le nombre de références de la variable est 1 (il existe d'autres situations qui entraîneront également une augmentation du nombre de références de la variable). Le système conservera automatiquement ces étiquettes et les analysera régulièrement lorsqu'une étiquette sera créée. le compteur de référence devient 0, la paire sera recyclée.

3. Mécanisme de pool de mémoire Le mécanisme de mémoire de Python est en rangées pyramidales. Les couches -1 et -2 sont principalement exploitées par le système d'exploitation

La 0ème couche est constituée de mémoires malloc, libres et autres. en C. Les fonctions d'allocation et de libération fonctionnent ;

Les couches 1 et 2 sont des pools de mémoire, qui sont implémentés par la fonction d'interface Python PyMem_Malloc. Lorsque l'objet fait moins de 256 Ko, cette couche alloue directement de la mémoire ; >

La troisième couche est la couche supérieure, qui est notre opération directe des objets Python ;

En C, si malloc et free sont fréquemment appelés, des problèmes de performances se produiront en outre, des allocations et des versions fréquentes. de petits blocs de mémoire produiront une fragmentation de la mémoire. Les principales tâches effectuées par Python ici sont :

Si l'allocation de mémoire demandée est comprise entre 1 et 256 octets, utilisez son propre système de gestion de la mémoire, sinon utilisez directement malloc .

Ici, malloc sera toujours appelé pour allouer de la mémoire, mais à chaque fois un gros bloc de mémoire d'une taille de 256 Ko sera alloué.

La mémoire enregistrée via le pool de mémoire sera toujours recyclée vers le le pool de mémoire à la fin. C's free ne sera pas appelé pour le libérer pour une prochaine utilisation. Pour les objets Python simples, tels que les valeurs, les chaînes et les tuples (les tuples ne peuvent pas être modifiés), la méthode de copie (copie profonde ?) est utilisé, c'est-à-dire que lorsqu'une autre variable B est affectée à la variable A, bien que les espaces mémoire de A et B soient toujours les mêmes, lorsque la valeur de A change, l'espace sera réaffecté à A et les adresses de A et B ne seront plus les mêmes

11 Décrivez les différences entre les tableaux, les listes chaînées, les files d'attente et les piles ?

Les tableaux et les listes chaînées sont des concepts de stockage de données. Les tableaux stockent les données dans un espace continu, tandis que les listes chaînées peuvent stocker des données dans des espaces non continus

La file d'attente et la pile décrivent le ; concept de mode d'accès aux données, la file d'attente est premier entré, premier sorti et la pile est la dernière entrée, premier sorti ; les files d'attente et les piles peuvent être implémentées à l'aide de tableaux ou de listes chaînées ;

12. Connaissez-vous plusieurs types de tri, parlez-moi de celui que vous connaissez le plus ?

Partie framework Web

1. Dans Django, lorsqu'un utilisateur se connecte au serveur d'applications A (entre dans l'état de connexion), et que la requête suivante est transmise par nginx au serveur d'applications B, quel sera l'impact ?

Si les données de session enregistrées par l'utilisateur sur le serveur d'applications A ne sont pas partagées avec le serveur d'applications B, l'état de connexion précédent de Nano sera perdu.

2. Comment résoudre le problème de demande inter-domaines dans Django (principe)

Activer le middleware

Publier la demande
Code de vérification
Ajouter la balise {%csrf_token%} au formulaire

3. Veuillez expliquer ou décrire l'architecture de Django

Le framework Django suit la conception MVC et a un nom propre : MVT

M s'écrit Model, qui a la même fonction que M dans MVC, responsable du traitement des données, avec un framework ORM intégré

V épelé comme View, qui a la même fonction que C dans MVC. Il reçoit HttpRequest, le traitement métier et renvoie HttpResponse
T épelé comme Template. , qui est la même que la fonction V dans MVC Idem, elle est responsable de l'encapsulation et de la construction du code HTML à renvoyer, avec un moteur de modèle intégré

4 Comment trier les résultats d'une requête de données avec Django, comment. faire l'ordre décroissant, comment faire une requête supérieure à un certain champ

Utiliser order_by()

L'ordre décroissant nécessite d'ajouter -
devant le nom du champ de tri : le champ de requête est supérieur à une certaine valeur : utiliser le filtre (field name_gt=value)

5. Parlez-moi de Django, le rôle du middleware MIDDLEWARES ?

Le middleware est un processus de traitement entre le traitement des requêtes et des réponses. Il est relativement léger et modifie globalement l'entrée et la sortie de Django.


6. Que savez-vous de Django ?

Django prend une direction large et globale. Il est surtout connu pour son backend de gestion entièrement automatisé : il vous suffit d'utiliser ORM et de créer des définitions d'objets simples, et il peut générer automatiquement une structure de base de données et un backend de gestion complet. .

L'ORM intégré de Django est fortement couplé aux autres modules du framework.

L'application doit utiliser l'ORM intégré de Django, sinon elle ne pourra pas profiter des différentes commodités basées sur l'ORM fournies dans le framework en théorie, vous pouvez désactiver son module ORM, mais c'est équivalent ; à rénover l'achevé Si la maison doit être démolie et rénovée, il vaut mieux aller à l'état brut pour faire une nouvelle décoration dès le début.

L'argument de vente de Django est son efficacité de développement ultra-élevée, mais son expansion des performances est limitée ; les projets utilisant Django doivent être restructurés une fois que le trafic atteint une certaine échelle pour répondre aux exigences de performances.

Django convient aux sites Web de petite et moyenne taille, ou comme outil pour les grands sites Web permettant de mettre en œuvre rapidement des prototypes de produits.

La philosophie de conception des modèles Django est de séparer complètement le code et les styles ; Django élimine fondamentalement la possibilité de coder et de traiter des données dans les modèles.

7. Comment implémenter la redirection Django ? Quel code de statut est utilisé ?
Utiliser HttpResponseRedirect
redirection et reverse
Code d'état : 302 301

8.ngnix proxy direct et proxy inverse ?
Le proxy de transfert est un serveur situé entre le client et le serveur d'origine. Afin d'obtenir le contenu du serveur d'origine, le client envoie une requête au proxy et spécifie la cible (serveur d'origine), puis le proxy envoie la requête. contenu au serveur d'origine. Transfère la demande et renvoie le contenu obtenu au client. Le client doit définir certains paramètres spéciaux pour utiliser le proxy de transfert.
Un proxy inverse est tout le contraire. Il agit comme le serveur d'origine pour le client, et le client n'a pas besoin de définir de paramètres particuliers. Le client envoie une requête normale au contenu dans l'espace de noms du proxy inverse, puis le proxy inverse déterminera où transmettre la requête (serveur d'origine) et renverra le contenu obtenu au client, comme si le contenu était lui-même le même.

9.Quel est le cœur de Tornado ?
Le cœur de Tornado est constitué des deux modules ioloop et iostream. Le premier fournit une boucle d'événements d'E/S efficace et le second encapsule un socket non bloquant. En ajoutant des événements d'E/S réseau à ioloop, en utilisant des sockets non bloquants et en faisant correspondre les fonctions de rappel correspondantes, vous pouvez obtenir l'exécution asynchrone efficace et convoitée.

10.Django lui-même fournit runserver, pourquoi ne peut-il pas être utilisé pour le déploiement ? La méthode
runserver est une méthode d'exécution couramment utilisée lors du débogage de Django. Elle utilise le propre
serveur WSGI de Django pour s'exécuter. Elle est principalement utilisée dans les tests et le développement, et la méthode runserver est également à processus unique.
uWSGI est un serveur Web qui implémente le protocole WSGI, uwsgi, http et d'autres protocoles. Notez que uwsgi est un protocole de communication et uWSGI est un serveur Web qui implémente le protocole uwsgi et le protocole WSGI. uWSGI présente les avantages de performances ultra-rapides, d'une faible utilisation de la mémoire et d'une gestion multi-applications. Lorsqu'il est associé à Nginx
, il devient un environnement de production, qui peut isoler les demandes d'accès des utilisateurs des applications d'application pour réaliser un véritable déploiement. En comparaison, il prend en charge un niveau de concurrence plus élevé, facilite la gestion de plusieurs processus, tire parti du multicœur et améliore les performances.

Programmation réseau et partie front-end

1. Qu'est-ce qu'AJAX et comment utiliser AJAX ?
ajax (javascript et xml asynchrones) peut actualiser des données partielles d'une page Web au lieu de recharger la page Web entière.
La première étape consiste à créer un objet xmlhttprequest, var xmlhttp =new XMLHttpRequest(); l'objet XMLHttpRequest est utilisé pour échanger des données avec le serveur.
La deuxième étape consiste à utiliser les méthodes open() et send() de l'objet xmlhttprequest pour envoyer des requêtes de ressources au serveur.
La troisième étape consiste à utiliser l'attribut ResponseText ou ResponseXML de l'objet xmlhttprequest pour obtenir la réponse du serveur.
La quatrième étape est la fonction onreadystatechange. Lors de l'envoi d'une requête au serveur, nous devons utiliser la fonction onreadystatechange si nous voulons que le serveur réponde et exécute certaines fonctions. La fonction onreadystatechange sera déclenchée à chaque fois que le readyState du. Modifications de l'objet xmlhttprequest.

2. Quels sont les codes d'état HTTP courants ?

200 OK
301 Déplacé de façon permanente
302 Trouvé
304 Non modifié
307 Redirection temporaire
400 Demande incorrecte
401 Non autorisée
403 Interdit
404 Introuvable
410 Disparu
500 Erreur de serveur interne
501 Non implémenté

3. Quelle est la différence entre Publier et obtenir ?

Requête GET, les données demandées seront ajoutées à l'URL pour diviser l'URL et transmettre les données. Plusieurs paramètres sont connectés à &. Le format de codage URL utilise le codage ASCII au lieu du codage uniclde, ce qui signifie que tous les caractères non-ASCII doivent être codés avant d'être transmis.
Requête POST : Une requête POST placera les données demandées dans le corps du package de requête HTTP. L'élément = scie à ruban ci-dessus correspond aux données de transmission réelles.
Par conséquent, les données des requêtes GET seront exposées dans la barre d'adresse, mais pas les requêtes POST.

2. La taille des données transmises

Dans la spécification HTTP, il n'y a aucune restriction sur la longueur de l'URL et la taille des données transmises. Mais dans le processus de développement actuel, pour GET, des navigateurs et des serveurs spécifiques ont des restrictions sur la longueur de l'URL. Par conséquent, lors de l'utilisation de requêtes GET, les données transférées sont limitées par la longueur de l'URL.

Pour POST, puisqu'il ne s'agit pas d'une valeur d'URL, elle n'est pas restreinte en théorie. Cependant, en fait, chaque serveur stipulera une limite sur la taille des données soumises par POST, et Apache et IIS ont la leur. configurations.

3. Sécurité

POST est plus sécurisé que GET. La sécurité fait ici référence à la sécurité réelle, qui est différente de la sécurité de la méthode de sécurité mentionnée ci-dessus dans GET. La sécurité mentionnée ci-dessus ne modifie tout simplement pas les données du serveur. Par exemple, lors d'une opération de connexion, via une requête GET, le nom d'utilisateur et le mot de passe seront exposés sur l'URL, car la page de connexion peut être mise en cache par le navigateur et d'autres personnes peuvent consulter l'historique du navigateur, le nom d'utilisateur et le mot de passe à ce moment-là. sont faciles à obtenir par quelqu'un d'autre. De plus, les données soumises par la requête GET peuvent également provoquer des attaques de type frogery de requêtes intersites.

4. Quelle est la différence entre cookie et session ?

1. Les données des cookies sont stockées sur le navigateur du client et les données de session sont stockées sur le serveur.
2. Les cookies ne sont pas très sûrs. D'autres peuvent analyser le COOKIE stocké localement et procéder à une tromperie des COOKIES. Compte tenu de la sécurité, une session doit être utilisée.
3. La session sera enregistrée sur le serveur dans un certain délai. Lorsque l'accès augmente, cela nécessitera davantage de performances du serveur. Afin de réduire les performances du serveur, COOKIE doit être utilisé.
4. Les données enregistrées par un seul cookie ne peuvent pas dépasser 4K. De nombreux navigateurs limitent un site à enregistrer jusqu'à 20 cookies.
5. Suggestion :
Stockez les informations importantes telles que les informations de connexion en tant que SESSION
Si d'autres informations doivent être conservées, elles peuvent être placées dans le COOKIE

Obligatoire pour la création. un simple serveur TCP Le processus

1.socket crée un socket
2. lie l'adresse IP et le port
3.écoute pour rendre le socket passivement lié
4. pour le lien du client
5.recv/send pour recevoir et envoyer des données

Crawler et partie base de données

1. Quelle est la différence entre scrapy et scrapy- redis ? Pourquoi choisir la base de données Redis ?

(1) Scrapy est un framework d'exploration Python avec une efficacité d'exploration extrêmement élevée et une personnalisation élevée, mais il ne prend pas en charge la distribution. Scrapy-redis est un ensemble de composants basés sur la base de données redis et fonctionnant sur le framework scrapy, qui permet à scrapy de prendre en charge des stratégies distribuées. Le côté Slaver partage la file d'attente des éléments, la file d'attente des requêtes et l'empreinte digitale des requêtes définies dans la base de données redis côté maître.

(2) Pourquoi choisir la base de données Redis ? Parce que Redis prend en charge la synchronisation maître-esclave et que les données sont mises en cache en mémoire, les robots distribués basés sur Redis sont très efficaces dans la lecture à haute fréquence des requêtes et des données.

2. Quels frameworks ou modules de robots d'exploration avez-vous utilisés ? Parler de leurs différences ou de leurs avantages et inconvénients ?
Python est livré avec : urllib, urllib2
Tiers : requêtes
Framework : Scrapy
Les modules urllib et urllib2 effectuent tous deux des opérations liées à la demande d'URL, mais ils fournissent des fonctions différentes.
urllib2. : urllib2.urlopen peut accepter un objet Request ou une URL (lors de l'acceptation d'un objet Request, et utilisez-le pour définir les en-têtes d'une URL), urllib.urlopen n'accepte qu'une URL
urllib a un urlencode, Là n'est pas urllib2, donc c'est toujours urllib. La raison pour laquelle urllib2 est souvent utilisé ensemble
scrapy est un framework encapsulé. Il comprend un téléchargeur, un analyseur, une gestion des journaux et des exceptions. Il est basé sur un traitement multi-thread et tordu. Pour un seul fixe, le développement de l'exploration de sites Web présente des avantages, mais pour l'exploration de 100 sites Web à partir de plusieurs sites Web, il n'est pas assez flexible en termes de traitement simultané et distribué, et il n'est pas pratique de l'ajuster et de l'étendre.

request est une bibliothèque HTTP. Elle est uniquement utilisée pour effectuer des requêtes. Pour les requêtes HTTP, il s'agit d'une bibliothèque puissante. Le téléchargement et l'analyse sont tous gérés par vous-même. Elle offre une plus grande flexibilité, une concurrence élevée et un déploiement distribué. Il est très flexible et peut mieux implémenter les fonctions

Avantages et inconvénients de Scrapy :

Avantages : scrapy est asynchrone

Utilisez XPath plus lisible au lieu d'expressions régulières

Statistiques puissantes et système de journalisation

Exploration de différentes URL en même temps

Prise en charge du mode shell pour faciliter le débogage indépendant

Écrire un middleware pour faciliter l'écriture de certains filtres unifiés

Stockés dans la base de données via des pipelines

Inconvénients : Framework de robot d'exploration basé sur Python, relativement évolutif Différence

Basé sur le framework tordu, l'exécution d'exceptions ne tuera pas le réacteur et le framework asynchrone n'arrêtera pas les autres tâches après qu'une erreur se soit produite, ce qui rend difficile la détection des erreurs de données.

3. Quels sont vos moteurs MySQL couramment utilisés ? Quelles sont les différences entre les moteurs ?

Il existe deux moteurs principaux, MyISAM et InnoDB. Les principales différences sont les suivantes :

1. InnoDB prend en charge les transactions, mais MyISAM ne le fait pas. La transaction est une méthode de traitement de haut niveau. Par exemple, dans certaines séries d'ajouts, de suppressions et de modifications, tant qu'une erreur se produit, elle peut être annulée et restaurée, mais MyISAM

ne peut pas

;

2. MyISAM convient aux requêtes et aux applications basées sur l'insertion, tandis qu'InnoDB convient aux modifications fréquentes et aux applications impliquant

une sécurité plus élevée

3. ne le fait pas ;

4. MyISAM est le moteur par défaut, InnoDB doit être spécifié ;

5. InnoDB ne prend pas en charge l'index de type FULLTEXT ; Les lignes de la table ne sont pas enregistrées dans InnoDB. Par exemple, lors de la sélection de count(*) dans la table, InnoDB doit

analyser la table entière pour calculer le nombre de lignes, mais MyISAM n'a qu'à simplement lire. sur le nombre de lignes enregistrées

. Notez que lorsque l'instruction count(*) contient la condition Where, MyISAM doit également analyser la table entière

7. Pour les champs auto-croissants, InnoDB doit contenir un index avec uniquement ce champ, mais dans MyISAM ;

Des index conjoints peuvent être établis avec d'autres champs de la table ;

8 Lors de l'effacement de la table entière, InnoDB supprime les lignes une par une, ce qui est très lent. MyISAM reconstruira la table

 ;

9. InnoDB prend en charge les verrous de ligne (dans certains cas, la table entière est verrouillée, comme la mise à jour de l'ensemble de tables a=1 où

utilisateur comme '%lee%'

4. Décrivez le mécanisme du framework scrapy

.

Récupérez le premier lot d'URL de start_urls et envoyez la requête. La requête est transmise au planificateur par le moteur et placée dans la file d'attente des requêtes. Une fois l'acquisition terminée, le planificateur transmet la requête dans la file d'attente des requêtes. le téléchargeur pour obtenir la ressource de réponse correspondant à la demande.Et remettre la réponse à la méthode d'analyse écrite par vous-même pour le traitement d'extraction : 1. Si les données requises sont extraites, elles sont transmises au fichier pipeline pour traitement ; l'URL est extraite, continuez à effectuer les étapes précédentes (envoyer la requête URL, et le moteur transmet la requête au planificateur et la met en file d'attente...) jusqu'à ce qu'il n'y ait plus de requêtes dans la file d'attente des requêtes et que le programme se termine.

5. Que sont les requêtes associées et que sont-elles ?

Combinez plusieurs tables pour la requête, y compris principalement la jointure interne, la jointure gauche, la jointure droite, la jointure complète (jointure externe)

6. Utiliser pour écrire des robots Il s'agit de plusieurs processus mieux? Ou le multithread est mieux ? Pourquoi?

Pour le code gourmand en E/S (traitement de fichiers, robots d'exploration Web, etc.), le multithreading peut améliorer efficacement l'efficacité (s'il y a des opérations d'E/S dans un seul thread, une attente d'E/S se produira, provoquant des perte de temps et ouverture de plusieurs threads peuvent basculer automatiquement vers le thread B pendant que le thread A attend, afin que les ressources CPU ne soient pas gaspillées, améliorant ainsi l'efficacité de l'exécution du programme). Dans le processus réel de collecte de données, vous devez prendre en compte non seulement les problèmes de vitesse et de réponse du réseau, mais également les conditions matérielles de votre propre machine pour configurer le multi-processus ou le multi-thread

7. Optimisation de la base de données ?

1. Optimisez les index, les instructions SQL et analysez les requêtes lentes ;

2. Lors de la conception des tables, concevez la base de données strictement selon le paradigme de conception de base de données ; >3 .Utilisez le cache pour placer les données fréquemment consultées et les données qui n'ont pas besoin de changer fréquemment dans le cache, ce qui peut

enregistrer les E/S du disque

4. Technologie de files d'attente de disque (RAID0, RAID1, RDID5), etc. ;

5. L'utilisation de la propre technologie de partitionnement de table de MySQL pour superposer les données dans différents fichiers peut améliorer l'efficacité de lecture du disque magnétique ;

6. Partitionnement vertical des tables ; placez certaines données rarement lues dans une seule table pour enregistrer les E/S du disque ;

7. Séparation maître-esclave de la lecture et de l'écriture ; utiliser la réplication maître-esclave pour séparer les opérations de lecture et d'écriture ; opérations de la base de données ;

8. Sous-bases de données, tables et machines (la quantité de données est extrêmement importante)

9 .Choisissez la table appropriée. moteur et optimiser les paramètres ;

10. Effectuer la mise en cache, la statique et la distribution au niveau de l'architecture ;

11. Ne pas utiliser l'index de texte intégral

12. méthodes de stockage, telles que NoSQL pour stocker les données fréquemment consultées

8. Anti-crawlers et contre-mesures courants ?

1). Anti-crawling via les en-têtes

L'anti-crawling des en-têtes demandé aux utilisateurs est la stratégie anti-crawling la plus courante. De nombreux sites Web détecteront l'agent utilisateur des en-têtes, et certains sites Web détecteront les référents (l'anti-sangsue de certains sites Web de ressources consiste à détecter les référents). Si vous rencontrez ce type de mécanisme anti-crawler, vous pouvez directement ajouter des en-têtes au robot d'exploration et copier l'agent utilisateur du navigateur dans les en-têtes du robot d'exploration ; ou remplacer la valeur du référent par le nom de domaine du site Web cible. Pour les anti-crawlers qui détectent les en-têtes, ils peuvent être facilement contournés en modifiant ou en ajoutant des en-têtes dans le robot. 2) Anti-crawlers basés sur le comportement de l'utilisateur

Il existe également certains sites Web qui détectent le comportement des utilisateurs, comme la même IP visitant la même page plusieurs fois sur une courte période de temps, ou le même compte plusieurs fois sur une courte période. Faites de même.

La plupart des sites Web se trouvent dans la première situation. Pour cette situation, l'utilisation d'un proxy IP peut la résoudre. Vous pouvez écrire un robot d'exploration spécial pour explorer les adresses IP proxy publiques sur Internet et les enregistrer toutes après détection. De tels robots d'exploration IP proxy sont souvent utilisés, il est donc préférable d'en préparer un vous-même. Une fois que vous disposez d'un grand nombre d'adresses IP proxy, vous pouvez modifier une adresse IP toutes les quelques requêtes. Ceci est facile à faire dans les requêtes ou dans urllib2, afin que vous puissiez facilement contourner le premier anti-crawler.

Pour le deuxième cas, vous pouvez attendre aléatoirement quelques secondes après chaque demande avant de faire la demande suivante. Certains sites Web présentant des failles logiques peuvent contourner la restriction selon laquelle le même compte ne peut pas faire la même demande plusieurs fois sur une courte période en demandant plusieurs fois, en se déconnectant, en se reconnectant et en continuant à demander.

3) Anti-crawler pour les pages dynamiques

La plupart des situations ci-dessus se produisent sur des pages statiques, et il existe également certains sites Web sur lesquels les données que nous devons explorer sont obtenues via des requêtes ajax. Ou généré via JavaScript. Utilisez d’abord Fiddler pour analyser les requêtes réseau. Si nous pouvons trouver la requête ajax et analyser les paramètres spécifiques et la signification spécifique de la réponse, nous pouvons utiliser la méthode ci-dessus pour simuler directement la requête ajax à l'aide de requêtes ou urllib2, et analyser la réponse json pour obtenir les données requises.

C'est génial de pouvoir simuler directement des requêtes ajax pour obtenir des données, mais certains sites Web chiffrent tous les paramètres des requêtes ajax. Nous n'avons tout simplement aucun moyen de créer une demande pour les données dont nous avons besoin. Dans ce cas, utilisez selenium+phantomJS pour appeler le noyau du navigateur et utilisez phantomJS pour exécuter js afin de simuler des opérations humaines et de déclencher des scripts js dans la page. Du remplissage du formulaire au clic sur le bouton en passant par le défilement de la page, tout peut être simulé, quel que soit le processus de demande et de réponse spécifique. Il simule simplement complètement le processus de navigation des personnes sur la page pour obtenir des données.

Utiliser ce framework peut presque contourner la plupart des anti-crawlers, car il ne fait pas semblant d'être un navigateur pour obtenir des données (l'ajout de Headers mentionné ci-dessus revient dans une certaine mesure à faire semblant d'être un navigateur), c'est un navigateur lui-même, phantomJS est un navigateur sans interface, mais le navigateur n'est pas contrôlé par des humains. Selenium+phantomJS peut faire beaucoup de choses, comme l'identification de codes tactiles (12306) ou de vérification glissante, le craquage par force brute des formulaires de page, etc.

9. Quels problèmes le robot distribué résout-il principalement ?

1)ip

2)bande passante

3)cpu

4)io

10. Comment gérer le code de vérification pendant le processus du robot d'exploration ?

1. Scrapy est livré avec

2 Interface payante

Recommandations d'apprentissage associées : Tutoriel vidéo Python.

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer