Python crawler Development and Learning full tutoriel 2nd Edition, banggan 100000 words [recommended Collection]

Cinq paquets de spaghettis! 2021-10-29 03:51:22
python crawler development learning tutoriel

Bonjour tout le monde,Je suis hottie.. 

Le dernier tutoriel crawler organisé a bien répondu,Mais il y a encore des petits amis qui disent qu'ils ne sont pas assez méticuleux,Une mise à jour a été apportée aujourd'hui,Le texte complet est long,Il est recommandé de les ranger d'abord.

Table des matières

Un.、Base de reptiles

Aperçu des reptiles

httpExamen du Protocole

2.、requestsModule

1. requestsIntroduction au module

2. responseObjet de la réponse

3. requestsModule envoyer la demande

4. requestsModule envoyépostDemande

5. Utilisationrequests.sessionMaintenir l'état

Trois、Extraction des données

Aperçu de l'extraction des données

Extraction des données-jsonpathModule

Extraction des données-lxmlModule

Quatre、seleniumUtilisation de

seleniumIntroduction

seleniumExtraire les données

seleniumAutres utilisations de

Cinq、 Solution de préhension et de contre - escalade

Contre - escalade commune et solutions

Traitement du Code de vérification

chromeIntroduction à l'utilisation du navigateur

JSAnalyse de

Six、mongodbBase de données

MongodbIntroduction et installation

mongodbUtilisation simple de

MongodbAjouter, supprimer, modifier et vérifier

mongodbOpérations d'agrégation pour

MongodbGestion des droits pour

mongodbEtpythonInteraction

Sept、scrapyCadre crawler

scrapyConcepts et processus

scrapyPour commencer à utiliser

scrapyModélisation des données et demandes

scrapyConnexion analogique

scrapyUtilisation de tuyaux

scrapyUtilisation des intergiciels

scrapy_redisConcepts rôles et processus

scrapy_redisAnalyse de principe et réalisation de l'escalade intermittente et de l'escalade distribuée

scrapy_splashUtilisation des composants

scrapyInformations et configuration du journal pour

scrapydDéploiementscrapyProjets

Gerapy

Huit、appiumUtilisation de

Utilisationappium Contrôle automatique des appareils mobiles et extraction des données


Un.、Base de reptiles

Aperçu des reptiles

Point de connaissance:

  • Compris. Le concept de reptile

  • Compris. Le rôle des reptiles

  • Compris. Classification des reptiles

  • Maîtrise Processus crawler


1. Le concept de reptile

Navigateur analogique,Envoyer la demande,Obtenir une réponse

Crawler Web(Aussi connu sous le nom d'araignée Web,Robot réseau)C'est un client simulé.(Navigateur principal)Envoyer une demande de réseau,Recevoir la réponse à la demande,Selon certaines règles,Un programme pour saisir automatiquement l'information sur Internet.

  • En principe,Tant que c'est un client(Navigateur)Ce qui peut être fait,Les reptiles peuvent le faire.

  • Crawler ne peut obtenir que des clients(Navigateur)Données affichées


Point de connaissance: Comprendre le concept de crawler


2. Le rôle des reptiles

Les reptiles jouent un rôle important dans le monde de l'Internet, En un mot, le résumé est de saisir l'information sur le site. .

Point de connaissance:Compris. Le rôle des reptiles


3. Classification des reptiles

3.1 Selon le nombre de sites rampés,Peut être divisé en:

  • Reptile générique,Par exemple: Moteur de recherche

  • Focus crawler,Par exemple:12306Vol de billets,Ou saisir spécifiquement un(Une certaine catégorie)Données du site Web

3.2 Selon qu'il s'agit ou non d'obtenir des données,Peut être divisé en:

  • Reptiles fonctionnels,Votez pour votre star préférée、- Oui.

  • Données incrémentales crawler,Comme l'information sur le recrutement

3.3 SelonurlSi l'adresse et le contenu de la page correspondante ont changé,Les rampes incrémentales de données peuvent être divisées en:

  • Basé sururlChangement d'adresse、Le contenu change avec le crawler incrémental de données

  • urlAdresse inchangée、Rampes incrémentales de données pour les changements de contenu

Point de connaissance:Compris. Classification des reptiles


4. Processus crawler

Le processus de base du crawler est le suivant:

  1. Obtenez unurl

  2. VersurlEnvoyer la demande,Et obtenir une réponse(BesoinhttpAccord)

  3. Si extrait de la réponseurl,Continuer à envoyer la demande pour obtenir une réponse

  4. Si les données sont extraites de la réponse,Enregistrer les données


Point de connaissance:Maîtrise Processus crawler

httpExamen du Protocole

Point de connaissance

  • Maîtrise httpEthttpsConcept et port par défaut pour

  • Maîtrise En - tête de demande et en - tête de réponse pour l'attention du crawler

  • Compris. Codes d'état de réponse communs

  • Compris. Différences entre les navigateurs et les rampes

1. httpEthttpsConcepts et différences

HTTPSQueHTTPPlus sûr,Mais moins performant

  • HTTP:Protocole de transfert hypertexte,Le numéro de port par défaut est80

    • Hypertexte:Est plus que le texte,Pas seulement le texte;Y compris les photos、Audio、Fichiers vidéo, etc.

    • Protocole de transmission:Se réfère à l'utilisation d'un format fixe de Convention commune pour passer du contenu hypertexte converti en chaîne

  • HTTPS:HTTP + SSL(Couche de socket sécurisée),C'est - à - dire une association de transport hypertexte avec une couche de socket sécurisée,Numéro de port par défaut:443

    • SSLSur le contenu transmis(Hypertexte,C'est - à - dire le demandeur ou le répondant)Cryptage

  • Vous pouvez ouvrir un navigateur pour accéder à unurl,Vérification du clic droit,Cliquez surnet work,Cliquez sur unurl,VoirhttpForme de l'Accord


Point de connaissance:Maîtrise httpEthttpsConcept et port par défaut pour


2. En - têtes de demande et de réponse présentant un intérêt particulier pour le crawler

2.1 Champs d'en - tête de demande particulièrement préoccupants

Le crawler accorde une attention particulière aux champs d'en - tête de requête suivants

  • Content-Type

  • Host (Numéro d'hôte et de port)

  • Connection (Type de lien)

  • Upgrade-Insecure-Requests (Mise à jour versHTTPSDemande)

  • User-Agent (Nom du Navigateur)

  • Referer (Saut de page)

  • Cookie (Cookie)

  • Authorization(Utilisé pour représenterHTTPInformations d'authentification dans le Protocole nécessitant des ressources d'authentification,Comme devant.webUtilisé dans le coursjwtCertification)

L'en - tête de requête en gras est l'en - tête de requête commun,Le serveur est utilisé le plus souvent pour la reconnaissance des Crawlers,Plus important que les autres en - têtes de requête,Mais ce qui est important ici, c'est que ça ne veut pas dire que le reste n'a pas d'importance.,Parce que l'exploitation et la maintenance de certains sites Web, ou les développeurs, peuvent être à l'avant - garde,Utilise des en - têtes de demande moins courants pour identifier les Crawlers

2.2 Champs d'en - tête de réponse particulièrement préoccupants

Le crawler ne se concentre que sur un seul champ d'en - tête de réponse

  • Set-Cookie (Paramètres du serveur opposécookieCache dans le navigateur utilisateur)


Point de connaissance:Maîtrise En - tête de demande et en - tête de réponse pour l'attention du crawler


3. Codes d'état de réponse communs

  • 200:Succès

  • 302:Saut,NouveauurlEn réponseLocationDans la tête

  • 303:Navigateur pourPOSTRediriger la réponse vers la nouvelleurl

  • 307:Navigateur pourGETRediriger la réponse vers le nouveauurl

  • 403:Ressources non disponibles;Le serveur comprend les demandes des clients,Mais refuse de s'en occuper.(Pas de permission)

  • 404:La page n'a pas pu être trouvée

  • 500:Erreur interne du serveur

  • 503:Le serveur n'a pas répondu en raison de la maintenance ou de la surcharge,Peut être transporté en réponseRetry-AfterEn - tête de réponse;Peut - être parce que les Crawlers y accèdent fréquemment.url,Demande au serveur d'ignorer le crawler,Retour final503Code d'état de réponse

ApprendrewebJ'ai appris le Code d'état quand j'ai appris.,Nous savons que c'est la rétroaction que le serveur m'a donnée.,On nous a appris à transmettre la vérité au client.,Mais dans les reptiles,Peut - être que les développeurs ou le personnel d'exploitation et de maintenance de ce site essaient d'empêcher les Crawlers d'accéder facilement aux données,Peut - être un code d'état.,C'est - à - dire que le Code d'état retourné n'est pas nécessairement vrai,Par exemple,:Le serveur vous a reconnu comme un crawler.,Mais pour que tu sois négligent,,Donc le Code d'état est retourné de la même façon200,Mais il n'y a pas de données sur le poids de réponse.

Tous les codes d'état ne sont pas fiables,Tout dépend de la question de savoir si les données ont été obtenues à partir des réponses obtenues lors de la saisie des paquets.


Point de connaissance:Compris. Codes d'état de réponse communs


4. Exécution du Navigateur

Après examenhttpAprès l'Accord,Découvrons ce que les navigateurs suivants ont envoyéhttpProcessus de demande

4.1 httpProcessus de demande

  1. Le navigateur obtient le nom de domaine correspondantipAprès,Dans la barre d'adresseurlDemande d'initiation,Et obtenir une réponse

  2. Contenu de la réponse retournée(html)Moyenne,Aveccss、js、Photos, etc.urlAdresse,EtajaxCode,Le navigateur envoie d'autres demandes dans l'ordre dans lequel elles apparaissent dans la réponse,Et obtenir la réponse correspondante

  3. Chaque fois que le navigateur obtient une réponse, il ajoute les résultats affichés(Chargement),js,cssAttendre que le contenu modifie le contenu de la page,jsVous pouvez également renvoyer la demande,Obtenir une réponse

  4. Obtenir la première réponse de et la montrer dans le Navigateur,Jusqu'à ce que toutes les réponses soient finalement obtenues,Et ajouter du contenu ou modifier les résultats affichés————Ce processus s'appelle le NavigateurRendre

4.2 Attention!:

Mais dans les reptiles,Le crawler ne demande queurlAdresse,Je l'ai eu.urlRéponse à l'adresse(Le contenu de cette réponse peut être:html,css,js,Photos, etc.)

Les pages rendues par le navigateur ne sont pas toujours les mêmes que celles demandées par crawler,Parce que le crawler n'a pas la capacité de rendre(Bien sûr, dans les prochaines leçons, nous utiliserons d'autres outils ou paquets pour aider les Crawlers à rendre le contenu de la réponse.)

  • Les résultats affichés par le Navigateur sont les suivants:urlRésultats co - rendus de réponses multiples correspondant à des demandes multiples envoyées séparément par adresse

  • Donc, dans les reptiles,,Besoin d'envoyer la demandeurlL'extraction des données est effectuée en fonction de la réponse de l'adresse.


Point de connaissance:Compris. Les résultats affichés par le navigateur peuvent être rendus par plusieurs réponses à des demandes multiples,Et crawler est une demande à la fois pour une réponse


2.、requestsModule

requestsModule

Point de connaissance:

  • Maîtrise headersUtilisation des paramètres

  • Maîtrise Envoyer une demande avec paramètres

  • Maîtrise headersMoyennecookie

  • Maîtrise cookiesUtilisation des paramètres

  • Maîtrise cookieJarMéthode de conversion

  • Maîtrise Paramètres de temporisationtimeoutUtilisation de

  • Maîtrise AgentsipParamètresproxiesUtilisation de

  • Maîtrise UtiliserverifyParamètre ignoréCACertificat

  • Maîtrise requestsModule envoyépostDemande

  • Maîtrise Utilisationrequests.sessionMaintenir l'état


Nous avons appris les bases des reptiles,Ensuite, nous allons apprendre à implémenter notre crawler dans le Code

1. requestsIntroduction au module

1.1 requestsLe rôle du module:

  • EnvoyerhttpDemande,Obtenir les données de réponse

1.2 requestsLe module est un module tiers,J'ai besoin d'unpython(Virtuel)Installation supplémentaire dans l'environnement

  • pip/pip3 install requests

1.3 requestsModule envoyégetDemande

  1. Besoins:AdoptionrequestsEnvoyer la demande à la page d'accueil de Baidu,Obtenir le code source de cette page

  2. Exécuter le code suivant,Observer les résultats de l'impression

# 1.2.1-Mise en œuvre simple du Code
import requests
​
# Objectifsurl
url = 'https://www.baidu.com'
​
# Vers la cibleurlEnvoyergetDemande
response = requests.get(url)
​
# Imprimer le contenu de la réponse
print(response.text)

Point de connaissance:Maîtrise requestsModule envoyégetDemande


2. responseObjet de la réponse

Observez les résultats de l'exécution du code ci - dessus et découvrez,Il y a beaucoup de désordre.;Ceci est dû au fait que les jeux de caractères utilisés par le codec sont différents depuis longtemps.;Nous essayons d'utiliser la méthode ci - dessous pour résoudre le problème de codage chinois

# 1.2.2-response.content
import requests
​
# Objectifsurl
url = 'https://www.baidu.com'
​
# Vers la cibleurlEnvoyergetDemande
response = requests.get(url)
​
# Imprimer le contenu de la réponse
# print(response.text)
print(response.content.decode()) # Attention.!
  1. response.text- Oui.requestsModule selonchardetRésultat du décodage de l'ensemble de caractères codés déduit par le module

  2. Toutes les chaînes transmises par le réseau sontbytesType,Alors...response.text = response.content.decode('Jeu de caractères codés extrapolés')

  3. Nous pouvons rechercher dans le code source de la page Webcharset,Essayez de faire référence à l'ensemble de caractères codés,Attention aux inexactitudes

2.1 response.text Etresponse.contentLa différence entre:

  • response.text

    • Type:str

    • Type de décodage: requestsModule automatique basé surHTTP L'en - tête fait des suppositions fondées sur le codage de la réponse,Codage de texte spéculatif

  • response.content

    • Type:bytes

    • Type de décodage: Non spécifié


Point de connaissance:Maîtrise response.textEtresponse.contentLa différence entre


2.2 Par la droiteresponse.contentEn coursdecode,Pour résoudre le désordre chinois

  • response.content.decode() Par défaututf-8

  • response.content.decode("GBK")

  • Jeux de caractères codés courants

    • utf-8

    • gbk

    • gb2312

    • ascii (Prononciation:Ask)

    • iso-8859-1


Point de connaissance:Maîtrise UtilisationdecodePaire de fonctionsrequests.contentRésoudre le désordre chinois


2.3 responseAutres propriétés ou méthodes communes de l'objet de réponse

response = requests.get(url)MoyenneresponseEst l'objet de réponse obtenu en envoyant la demande;responseDans l'objet de réponse, sauftext、contentIl existe d'autres propriétés ou méthodes couramment utilisées en plus du contenu de la réponse:

  • response.urlRéponseurl;Parfois réactifurlEt demandéurlPas d'accord.

  • response.status_code Code d'état de réponse

  • response.request.headers Répondre à l'en - tête de demande correspondant

  • response.headers En - tête de réponse

  • response.request._cookies Réponse à la demande correspondantecookie;RetourcookieJarType

  • response.cookies Réponsecookie(C'est passé.set-cookieAction;RetourcookieJarType

  • response.json()AutomatiquementjsonLe contenu de la réponse de type chaîne est converti enpythonObjet(dict or list)

# 1.2.3-responseAutres attributs communs
import requests
​
# Objectifsurl
url = 'https://www.baidu.com'
​
# Vers la cibleurlEnvoyergetDemande
response = requests.get(url)
​
# Imprimer le contenu de la réponse
# print(response.text)
# print(response.content.decode()) # Attention.!
print(response.url) # Imprimer la réponseurl
print(response.status_code) # Imprimer le Code d'état de la réponse
print(response.request.headers) # Imprimer l'en - tête de la demande pour l'objet de réponse
print(response.headers) # Imprimer l'en - tête de réponse
print(response.request._cookies) # Print request Carryingcookies
print(response.cookies) # Imprimer le contenu de la réponsecookies

Point de connaissance:Maîtrise responseAutres propriétés communes de l'objet de réponse


3. requestsModule envoyer la demande

3.1 Envoyer la bandeheaderDemandes

Commençons par écrire un code pour obtenir la page d'accueil de Baidu

import requests
​
url = 'https://www.baidu.com'
​
response = requests.get(url)
​
print(response.content.decode())
​
# Imprimer l'en - tête de la demande en réponse à la demande correspondante
print(response.request.headers)

3.1.1 Penser

  1. Comparez le navigateur Baidu home page source et le Code Baidu home page source,Quelle différence??

    • Comment voir le code source d'une page Web:

      • Clic droit-Afficher le code source de la page Ou

      • Clic droit-Vérifiez

  2. Correspondance comparativeurlLe contenu de la réponse et le code source de la page d'accueil de Baidu,Quelle différence??

    • Voir la correspondanceurlComment répondre au contenu:

      1. Clic droit-Vérifiez

      2. Cliquez sur Net work

      3. Cocher Preserve log

      4. Rafraîchir la page

      5. VoirNameSous la même colonne que dans la barre d'adresse du NavigateururlDeResponse

  3. Le code source de la page d'accueil de Baidu est très petit,Pourquoi?

    • Nous devons apporter l'en - tête de la demande

      Revoir le concept de crawler,Navigateur analogique,Serveur spoofing,Obtenir du contenu compatible avec le Navigateur

    • Il y a beaucoup de champs dans l'en - tête de la requête,Parmi euxUser-AgentChamps obligatoires,Représente le système d'exploitation du client et les informations du Navigateur

3.1.2 Méthode de transport des demandes de cheveux

requests.get(url, headers=headers)

  • headersParameter receive Dictionary form request Header

  • Demander le nom du champ d'en - tête commekey,La valeur correspondant au champ estvalue

3.1.3 Achèvement de la mise en œuvre du Code

Copier à partir du NavigateurUser-Agent,StructureheadersDictionnaire;Après avoir complété le code suivant,Exécuter le Code pour voir les résultats

import requests
​
url = 'https://www.baidu.com'
​
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
​
# Dans l'en - tête de la demandeUser-Agent,Demande d'envoi du navigateur analogique
response = requests.get(url, headers=headers)
​
print(response.content)
​
# Imprimer les informations de l'en - tête de la demande
print(response.request.headers)

Point de connaissance:Maîtrise headersUtilisation des paramètres


3.2 Envoyer une demande avec paramètres

Nous l'avons souvent trouvé en utilisant Baidu SearchurlIl y en aura un dans l'adresse. ?,Le point d'interrogation est suivi du paramètre de requête,Aussi appelé chaîne de requête

3.2.1 InurlParamètres de transport

Directement sur les paramètresurlDemande d'initiation

import requests
​
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
​
url = 'https://www.baidu.com/s?wd=python'
​
response = requests.get(url, headers=headers)
​

3.2.2 AdoptionparamsDictionnaire des paramètres de transport

1.Construire un dictionnaire de paramètres de requête

2.Apporter un dictionnaire de paramètres lors de l'envoi de la demande à l'interface,Parameter dictionary set toparams

import requests
​
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
​
# C'est la cible.url
# url = 'https://www.baidu.com/s?wd=python'
​
# Y a - t - il un point d'interrogation à la fin et les résultats sont les mêmes?
url = 'https://www.baidu.com/s?'
​
# Le paramètre de requête est un dictionnaire C'est - à - dire:wd=python
kw = {'wd': 'python'}
​
# Lancer la demande avec les paramètres de la demande,Obtenir une réponse
response = requests.get(url, headers=headers, params=kw)
​
print(response.content)

Point de connaissance:Maîtriser la méthode d'envoi des demandes avec paramètres


3.3 InheadersPorté dans le paramètrecookie

Les sites Web utilisent souventCookieChamp pour maintenir l'état d'accès de l'utilisateur,Alors nous pouvonsheadersAjouter au paramètreCookie,Simuler les demandes des utilisateurs normaux.Nous avonsgithubExemple de connexion:

3.3.1 githubAnalyse de la capture des paquets d'atterrissage

  1. Ouvrir le Navigateur,Clic droit-Vérifiez,Cliquez surNet work,CocherPreserve log

  2. Accès àgithubDébarquementurlAdresse https://github.com/login

  3. Saisissez le mot de passe du compte et cliquez sur connexion,Pour accéder à unurl,Comme cliquer sur le coin supérieur droitYour profileAccès àhttps://github.com/USER_NAME

  4. C'est sûr.urlAprès,Déterminer à nouveau les informations d'en - tête de la demande nécessaires à l'envoi de la demandeUser-AgentEtCookie

3.3.2 Code complet

  • Copier à partir du NavigateurUser-AgentEtCookie

  • Les champs et les valeurs de l'en - tête de requête dans le navigateur correspondent àheadersDoit être cohérent dans les paramètres

  • headersDans le dictionnaire des paramètres de requêteCookieLa valeur de la clé est une chaîne

import requests
​
url = 'https://github.com/USER_NAME'
​
# Construire un dictionnaire d'en - tête de requête
headers = {
   # Copié à partir du NavigateurUser-Agent
   'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36',
   # Copié à partir du NavigateurCookie
   'Cookie': 'xxxC'est une copie.cookieString'
}
​
# Porté dans le dictionnaire des paramètres de l'en - tête de requêtecookieString
resp = requests.get(url, headers=headers)
​
print(resp.text)

3.3.3 Résultats de la validation du Code d'exécution

Recherche dans la sortie impriméetitle,htmlSi c'est le vôtregithubNuméro de compte,Est utilisé avec succèsheadersPortage des paramètrescookie,Obtenir des pages accessibles après la connexion


Point de connaissance:Maîtrise headersMoyennecookie


3.4 cookiesUtilisation des paramètres

Dans la section précédente,headersPorté dans le paramètrecookie,Vous pouvez également utilisercookiesParamètres

  1. cookiesForme du paramètre:Dictionnaire

    cookies = {"cookieDename":"cookieDevalue"}

    • Le dictionnaire correspond à l'en - tête de la requêteCookieString,Point - virgule、Division de l'espace pour chaque paire de clés du dictionnaire

    • Le signe égal à gauche est uncookieDename,Correspondant àcookiesDictionnairekey

    • Correspond à droite du signe égalcookiesDictionnairevalue

  2. cookiesUtilisation des paramètres

    response = requests.get(url, cookies)

  3. Oui.cookieChaîne convertie encookiesDictionnaire requis pour les paramètres:

    cookies_dict = {cookie.split('=')[0]:cookie.split('=')[-1] for cookie in cookies_str.split('; ')}

  4. Attention!:cookieIl y a généralement un délai d'expiration,Besoin de récupérer une fois expiré

import requests
​
url = 'https://github.com/USER_NAME'
​
# Construire un dictionnaire d'en - tête de requête
headers = {
   'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'
}
# StructurecookiesDictionnaire
cookies_str = 'Depuis le NavigateurcopyViens ici.cookiesString'
​
cookies_dict = {cookie.split('=')[0]:cookie.split('=')[-1] for cookie in cookies_str.split('; ')}
​
# Porté dans le dictionnaire des paramètres de l'en - tête de requêtecookieString
resp = requests.get(url, headers=headers, cookies=cookies_dict)
​
print(resp.text)

Point de connaissance:Maîtrise cookiesUtilisation des paramètres


3.5 cookieJarObjet converti encookiesMéthode du dictionnaire

UtiliserrequestsAcquisresposneObjet,AveccookiesPropriétés.La valeur de l'attribut est uncookieJarType,Contient les paramètres locaux du serveur opposécookie.Comment les convertir encookiesEt le dictionnaire??

  1. Méthode de conversion

    cookies_dict = requests.utils.dict_from_cookiejar(response.cookies)

  2. Parmi euxresponse.cookiesCe qui revient, c'estcookieJarObjet de type

  3. requests.utils.dict_from_cookiejarRetour de la fonctioncookiesDictionnaire


Point de connaissance:Maîtrise cookieJarMéthode de conversion


3.6 Paramètres de temporisationtimeoutUtilisation de

En surfant sur Internet,Nous rencontrons souvent des fluctuations du réseau,À ce moment - là.,Une demande qui a attendu si longtemps n'a peut - être pas abouti..

Dans les reptiles,Une demande sans résultat depuis longtemps,Cela rend l'ensemble du projet très inefficace.,C'est à ce moment - là que nous devons faire pression sur la demande.,Qu'il retourne les résultats dans un délai déterminé.,Sinon, c'est une erreur..

  1. Paramètres de temporisationtimeoutComment utiliser

    response = requests.get(url, timeout=3)

  2. timeout=3Représentation:Après l'envoi de la demande,3Retour à la réponse en secondes,Sinon, une exception est lancée

import requests
​
​
url = 'https://twitter.com'
response = requests.get(url, timeout=3)     # Réglage du temps d'arrêt
​

Point de connaissance:Maîtrise Paramètres de temporisationtimeoutUtilisation de


3.7 Comprendre les agents etproxyUtilisation des paramètres Proxy

proxyParamètre proxy en spécifiant Proxyip,Laissez l'agentipEnvoyer nos demandes au serveur mandataire correspondant,Commençons par les agents.ipEt serveur mandataire

3.7.1 Comprendre le processus d'utilisation des agents

  1. AgentsipC'est unip,Pointez vers un serveur mandataire

  2. Le serveur mandataire peut nous aider à transmettre les demandes au serveur cible

3.7.2 Différence entre les agents avant et les agents arrière

Mentionné précédemmentproxyAgent spécifié par le paramètreipPointer vers un serveur mandataire positif,Il y a donc un serveur inverse;Découvrez maintenant la différence entre un proxy avant et un proxy arrière

  1. Du point de vue de la partie qui a envoyé la demande,Pour distinguer les agents avant ou arrière

  2. Pour le Navigateur ou le client(Partie qui a envoyé la demande)Transmission de la demande,Appelé proxy positif

    • Le navigateur connaît la réalité du serveur qui a finalement traité la demandeipAdresse,Par exempleVPN

  3. Pas de navigateur ou de client(Partie qui a envoyé la demande)Transmettre la demande、Au lieu de cela, il transmet les demandes au serveur qui les traite en dernier ressort.,Appelé agent inverse

    • Le navigateur ne connaît pas l'adresse réelle du serveur,Par exemplenginx

3.7.3 Agentsip(Serveur mandataire)Classification de

  1. Selon l'AgenceipDegré d'anonymat,AgentsIPIl peut être divisé en trois catégories::

    • Agent transparent(Transparent Proxy):L'agent transparent peut être direct“Cacher”La tienne.IPAdresse,Mais on peut toujours savoir qui tu es..Les en - têtes de requête reçus par le serveur cible sont les suivants::

      REMOTE_ADDR = Proxy IP
      HTTP_VIA = Proxy IP
      HTTP_X_FORWARDED_FOR = Your IP
    • Agent anonyme(Anonymous Proxy):Utiliser un agent anonyme,Tout ce qu'on sait, c'est que tu as utilisé un agent.,Je ne sais pas qui tu es..Les en - têtes de requête reçus par le serveur cible sont les suivants::

      REMOTE_ADDR = proxy IP
      HTTP_VIA = proxy IP
      HTTP_X_FORWARDED_FOR = proxy IP
    • Agent Gao Fang(Elite proxyOuHigh Anonymity Proxy):L'agent Gao Ning ne permet pas aux gens de savoir que vous utilisez un agent.,C'est donc le meilleur choix..Il ne fait aucun doute que l'utilisation d'agents hautement dissimulés est la meilleure solution..Les en - têtes de requête reçus par le serveur cible sont les suivants::

      REMOTE_ADDR = Proxy IP
      HTTP_VIA = not determined
      HTTP_X_FORWARDED_FOR = not determined
  2. Selon le protocole utilisé par le site,Services de procuration nécessitant l'utilisation de l'accord approprié.Les protocoles demandés au service mandataire peuvent être divisés en::

    • httpAgents:ObjectifsurlPourhttpAccord

    • httpsAgents:ObjectifsurlPourhttpsAccord

    • socksAgent Tunnel(Par exemplesocks5Agents)Attendez.:

      1. socks L'agent passe simplement les paquets,Peu importe le Protocole d'application(FTP、HTTPEtHTTPSAttendez.).

      2. socks Ratio des agentshttp、httpsLes agents prennent moins de temps.

      3. socks L'agent peut transmettrehttpEthttpsDemandes

3.7.4 proxiesUtilisation des paramètres Proxy

Pour faire croire au serveur que ce n'est pas le même client qui demande;Pour éviter que les demandes d'envoi fréquent à un nom de domaine ne soient bloquéesip,Donc nous avons besoin d'un agentip;Alors, on va étudier.requestsComment le module utilise les agentsipDe

  • Utilisation:

    response = requests.get(url, proxies=proxies)
  • proxiesForme:Dictionnaire

  • Par exemple:

    proxies = {
       "http": "http://12.34.56.79:9527",
       "https": "https://12.34.56.79:9527",
    }
  • Attention!:SiproxiesLe dictionnaire contient plusieurs paires de valeurs clés,Lors de l'envoi d'une demandeurlProtocole d'adresse pour choisir d'utiliser l'agent appropriéip


Point de connaissance:Maîtrise AgentsipParamètresproxiesUtilisation de


4. requestsModule envoyépostDemande

Penser:Où allons - nous utiliserPOSTDemande?

  1. Inscription( InwebDe l'avis de l'Ingénieur,POST Que GET Plus sûr,urlLes informations telles que le numéro de compte et le mot de passe de l'utilisateur ne seront pas exposées dans l'adresse)

  2. Lorsque vous devez transférer du contenu en gros texte( POST La demande n'exige pas de longueur de données)

Donc la même chose,Notre crawler doit également retourner à ces deux endroits pour simuler l'envoi du NavigateurpostDemande

4.1 requestsEnvoyerpostMéthode demandée

  • response = requests.post(url, data)

  • dataLe paramètre reçoit un dictionnaire

  • requestsModule envoyépostAutres paramètres et envoi de la fonction de demandegetLes paramètres demandés sont entièrement cohérents

4.2 POSTDemande d'exercice

Voici un exemple de traduction de Jinshan postComment utiliser la demande:

  1. Adresse:http://fy.iciba.com/

Analyse des idées

  1. Capture de paquets pour déterminer la demandeurlAdresse

  2. Déterminer les paramètres demandés

  3. Déterminer l'emplacement des données retournées

  4. Acquisition de données par navigateur analogique

4.2.3 Conclusions de l'analyse de capture de paquets

  1. urlAdresse:http://fy.iciba.com/

  2. Méthode de demande:POST

  3. Paramètres requis pour la demande:

    data = {
    'f': 'auto', # Indique que la langue traduite est automatiquement reconnue
    't': 'auto', # Indique que la langue traduite est automatiquement reconnue
    'w': 'La vie est courte.' # Chaîne chinoise à traduire
    }
  4. pcFinUser-Agent:

    Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36

4.2.4 Mise en œuvre du Code

Compris.requestsModule envoyépostMéthode demandée,Et après avoir analysé la traduction de Baidu à l'extrémité mobile,Finissons le Code.

import requests
import json
class King(object):
def __init__(self, word):
self.url = "http://fy.iciba.com/ajax.php?a=fy"
self.word = word
self.headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
}
self.post_data = {
"f": "auto",
"t": "auto",
"w": self.word
}
def get_data(self):
response = requests.post(self.url, headers=self.headers, data=self.post_data)
# Retour par défautbytesType,Sauf s'il est déterminé que l'appel externe utilisestrPour décoder
return response.content
def parse_data(self, data):
# Oui.jsonDonnées converties enpythonDictionnaire
dict_data = json.loads(data)
# Extraire les résultats de la traduction du dictionnaire
try:
print(dict_data['content']['out'])
except:
print(dict_data['content']['word_mean'][0])
def run(self):
# url
# headers
# post——data
# Envoyer la demande
data = self.get_data()
# Analyse
self.parse_data(data)
if __name__ == '__main__':
# king = King("La vie est courte.,Amusez - vous bien.")
king = King("China")
king.run()
# pythonLes bibliothèques standard ont de nombreuses façons utiles,Voir l'utilisation d'une bibliothèque standard tous les jours

Point de connaissance:Maîtrise requestsModule envoyépostDemande


5. Utilisationrequests.sessionMaintenir l'état

requestsDans le moduleSessionClasse capable de traiter automatiquement les demandes d'envoi pour obtenir des réponsescookie,Pour atteindre l'objectif du maintien de l'état.Ensuite, nous allons l'apprendre.

5.1 requests.sessionRôle et scénarios d'application

  • requests.sessionLe rôle de

    • Traitement automatiquecookie,C'est - à - dire: La prochaine demande portera la dernière.cookie

  • requests.sessionScénarios d'application pour

    • Traitement automatique des demandes multiples consécutivescookie

5.2 requests.sessionMode d'emploi

sessionExemple après avoir demandé un site Web,Le serveur opposé est configuré localementcookieSera sauvegardé danssessionMoyenne,Réutiliser la prochaine foissessionLors de la demande du serveur opposé,Je l'apporterai avec moi.cookie

session = requests.session() # InstanciationsessionObjet
response = session.get(url, headers, ...)
response = session.post(url, data, ...)
  • sessionEnvoi d'objetsgetOupostParamètres demandés,AvecrequestsLes paramètres de la demande d'envoi du module sont entièrement cohérents

5.3 Tests

Utiliserrequests.sessionPour finirgithubDébarquement,Et obtenir les pages que vous devez vous connecter pour accéder

5.3.1 Conseils

  1. C'est exact.githubCapture de paquets tout au long du processus d'ouverture de session et d'accès aux pages accessibles après l'ouverture de session

  2. Déterminer la demande de connexionurlAdresse、Méthode de demande et paramètres de demande requis

    • Certains paramètres de requête sont dans d'autresurlDans la réponse correspondante,Peut être utiliséreAcquisition de modules

  3. Identifier les pages accessibles après la connexionurlAdresse et méthode de demande

  4. Utilisationrequests.sessionCode complet

5.3.2 Code de référence

import requests
import re
# Construire un dictionnaire d'en - tête de requête
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36',
}
# InstanciationsessionObjet
session = requests.session()
# Accéder à la page de connexion pour obtenir les paramètres requis pour la demande de connexion
response = session.get('https://github.com/login', headers=headers)
authenticity_token = re.search('name="authenticity_token" value="(.*?)" />', response.text).group(1) # Utiliser la régularisation pour obtenir les paramètres requis pour la demande de connexion
# Construire un dictionnaire de paramètres de demande de connexion
data = {
'commit': 'Sign in', # Valeur fixe
'utf8': '*', # Valeur fixe
'authenticity_token': authenticity_token, # Ce paramètre est dans le contenu de réponse de la page de connexion
'login': input('EntréegithubNuméro de compte:'),
'password': input('EntréegithubNuméro de compte:')
}
# Envoyer une demande de connexion(Il n'est pas nécessaire de prêter attention à la réponse à cette demande)
session.post('https://github.com/session', headers=headers, data=data)
# Imprimer les pages auxquelles vous devez vous connecter pour accéder
response = session.get('https://github.com/1596930226', headers=headers)
print(response.text)


Point de connaissance:Maîtrise Utilisationrequests.sessionMaintenir l'état


Trois、Extraction des données

Aperçu de l'extraction des données

Point de connaissance

  • Compris. Classification du contenu de la réponse

  • Compris. xmlEthtmlLa différence entre


1. Classification du contenu de la réponse

Après avoir envoyé la demande pour obtenir une réponse,Il peut y avoir plusieurs types différents de contenu de réponse;Et beaucoup de fois,Nous n'avons besoin que de quelques données dans le contenu de la réponse

  • Contenu structuré de la réponse

    • jsonString

      • Peut être utilisére、jsonAttendre un module pour extraire des données spécifiques

    • xmlString

      • Peut être utilisére、lxmlAttendre un module pour extraire des données spécifiques

      • xmlVoici un exemple de chaîne

        <bookstore>
        <book category="COOKING">
         <title lang="en">Everyday Italian</title>
         <author>Giada De Laurentiis</author>
         <year>2005</year>
         <price>30.00</price>
        </book>
        <book category="CHILDREN">
         <title lang="en">Harry Potter</title>
         <author>J K. Rowling</author>
         <year>2005</year>
         <price>29.99</price>
        </book>
        <book category="WEB">
         <title lang="en">Learning XML</title>
         <author>Erik T. Ray</author>
         <year>2003</year>
         <price>39.95</price>
        </book>
        </bookstore>
  • Contenu de la réponse non structurée

    • htmlString

      • Peut être utilisére、lxmlAttendre un module pour extraire des données spécifiques


Point de connaissance:Compris. Classification du contenu de la réponse


2. - Oui.xmlEthtmlLa différence entre

Il faut le découvrir.htmlEtxmlLa différence entre,Il faut d'abord qu'on se rencontre.xml

2.1 - Oui.xml

xmlEst un langage de balisage extensible,Apparence ethtmlC'est très similaire.,Fonctionnalité plus axée sur la transmission et le stockage des données

<bookstore>
<book category="COOKING">
 <title lang="en">Everyday Italian</title>
 <author>Giada De Laurentiis</author>
 <year>2005</year>
 <price>30.00</price>
</book>
<book category="CHILDREN">
 <title lang="en">Harry Potter</title>
 <author>J K. Rowling</author>
 <year>2005</year>
 <price>29.99</price>
</book>
<book category="WEB">
 <title lang="en">Learning XML</title>
 <author>Erik T. Ray</author>
 <year>2003</year>
 <price>39.95</price>
</book>
</bookstore>

2.2 xmlEthtmlLa différence entre

Les différences sont les suivantes:

  • html:

    • Langage de balisage hypertexte

    • Pour mieux afficher les données,L'accent est mis sur l'affichage

  • xml:

    • Langage de balisage extensible

    • Pour le transfert et le stockage des données,L'accent est mis sur le contenu des données elles - mêmes.


Point de connaissance:Compris. xmlEthtmlLa différence entre


2.3 Méthodes courantes d'analyse des données

Extraction des données-jsonpathModule

Point de connaissance

  • Compris. jsonpathScénarios d'utilisation des modules

  • Maîtrise jsonpathUtilisation du module


1. jsonpathScénarios d'utilisation des modules

S'il y a un dictionnaire complexe imbriqué à plusieurs niveaux,Je veux me baser surkeyEt l'indice pour l'extraction en vracvalue,C'est plus difficile.jsonpathLe module résout cette douleur,Ensuite, nous allons étudierjsonpathModule

jsonpathPeut suivrekeyC'est exact.pythonDictionnaire pour l'extraction de données par lots


Point de connaissance:Compris. jsonpathScénarios d'utilisation des modules


2. jsonpathComment utiliser le module

2.1 jsonpathInstallation du module

jsonpathC'est un module tiers,Installation supplémentaire requise

pip install jsonpath

2.2 jsonpathMéthode d'extraction des données par module

from jsonpath import jsonpath
ret = jsonpath(a, 'jsonpathChaîne de règles de syntaxe')

2.4 jsonpathExemple d'utilisation

book_dict = {
"store": {
  "book": [
    { "category": "reference",
      "author": "Nigel Rees",
      "title": "Sayings of the Century",
      "price": 8.95
    },
    { "category": "fiction",
      "author": "Evelyn Waugh",
      "title": "Sword of Honour",
      "price": 12.99
    },
    { "category": "fiction",
      "author": "Herman Melville",
      "title": "Moby Dick",
      "isbn": "0-553-21311-3",
      "price": 8.99
    },
    { "category": "fiction",
      "author": "J. R. R. Tolkien",
      "title": "The Lord of the Rings",
      "isbn": "0-395-19395-8",
      "price": 22.99
    }
  ],
  "bicycle": {
    "color": "red",
    "price": 19.95
  }
}
}
​
from jsonpath import jsonpath
​
print(jsonpath(book_dict, '$..author')) # Si elle n'est pas récupérée, elle retourneraFalse # Retour à la Liste,Si elle n'est pas récupérée, elle retourneraFalse

Point de connaissance:Maîtrise jsonpathUtilisation du module


Extraction des données-lxmlModule

Point de connaissance

  • Compris. lxmlModules etxpathRelations grammaticales

  • Compris. lxmlScénarios d'utilisation des modules

  • Compris. lxmlInstallation du module

  • Compris. Google explorerxpath helperInstallation et utilisation de plug - ins

  • Maîtrise xpathSyntaxe-Syntaxe de sélection des noeuds de base

  • Maîtrise xpathSyntaxe-Syntaxe de modification des noeuds

  • Maîtrise xpathSyntaxe-Autres syntaxe couramment utilisée

  • Maîtrise lxmlUtilisé dans le modulexpathÉlément de positionnement syntaxique extraire la valeur de l'attribut ou le contenu du texte

  • Maîtrise lxmlDans le moduleetree.tostringUtilisation des fonctions


1. Compris. lxmlModules etxpathSyntaxe

C'est exact.htmlOuxmlLe texte formel extrait un contenu spécifique,Il faut qu'on maîtrise.lxmlUtilisation des modules etxpathSyntaxe.

  • lxmlModule disponibleXPathSyntaxe des règles,Pour un positionnement rapideHTML\XML Éléments spécifiques du document et obtention d'informations sur les noeuds(Contenu du texte、Valeur de l'attribut)

  • XPath (XML Path Language) C'est une porte HTML\XML Recherche d'informations dans un documentLangues,Peut être utilisé dans HTML\XML Dans le documentÉléments et attributs traversant

  • Extractionxml、htmlBesoins en donnéeslxmlModules etxpathSyntaxe utilisée avec


Point de connaissance:Compris. lxmlModules etxpathSyntaxe


2. Google explorerxpath helperInstallation et utilisation de plug - ins

Pour en profiterlxmlModule extraire les données,Il faut qu'on maîtrisexpathRègles de grammaire.Ensuite, nous allons voirxpath helperPlug - in,Ça peut nous aider à pratiquerxpathSyntaxe

2.1 Google explorerxpath helperLe rôle du plugin

Tester la page actuelle dans Google explorerxpathRègles de grammaire

2.2 Google explorerxpath helperInstallation et utilisation de plug - ins

Nous avonswindosPar exemplexpath helperInstallation

2.2.1 xpath helperInstallation du plug - in

  1. TéléchargerChromePlug - in XPath Helper

    • Ça pourrait être danschromeApp Mall à télécharger,Si vous ne pouvez pas télécharger,Vous pouvez également télécharger à partir du lien ci - dessous

  2. Nom du suffixe du fichiercrxLire comme suit:rar,Puis décompresser dans un dossier du même nom

  3. Faites glisser le dossier extrait dans celui où le mode développeur est déjà activéchromeInterface d'extension du navigateur

  4. Après le redémarrage du navigateur,Accès àurlCliquez ensuite sur la pagexpathIcônes,C'est prêt.

  5. Si ouilinuxOumacOSSystème d'exploitation,Il n'est pas nécessaire d'effectuer les étapes ci - dessus2,Va directementcrx.Glisser le fichier dans celui qui est déjà en mode développeurchromeInterface d'extension du navigateur


Point de connaissance:Compris. Google explorerxpath helperInstallation et utilisation de plug - ins


3. xpathRelations nodales pour

ApprendrexpathLa syntaxe doit être comprisexpathRelations nodales dans

3.1 xpathQuel est le noeud dans

Chaquehtml、xmlOn appelle ça un noeud.,Le noeud le plus haut est appelé le noeud racine.Nous avonsxmlPar exemple,htmlC'est pareil

4. xpathSyntaxe-Syntaxe de sélection des noeuds de base

  1. XPath Utilisez une expression de chemin pour sélectionner XML Noeud ou ensemble de noeuds dans le document.

  2. Ces expressions de cheminExpressions vues dans le système de fichiers PCTrès similaire.

  3. UtiliserchromeLorsque le plug - in sélectionne l'étiquette,Lorsque sélectionné,L'étiquette sélectionnée ajoute des attributsclass="xh-highlight"

4.1 xpathSyntaxe pour localiser les noeuds et extraire les propriétés ou le contenu du texte

Expression Description
nodename Sélectionnez cet élément.
/ Sélectionner à partir du noeud racine、Ou la transition entre les éléments.
// Sélectionnez un noeud dans le document à partir du noeud courant qui correspond à la sélection,Quel que soit leur emplacement.
. Sélectionnez le noeud actuel.
.. Sélectionnez le parent du noeud courant.
@ Sélectionner les propriétés.
text() Sélectionner le texte.

4.2 Exercices de grammaire

  • Sélectionner toush2Texte sous

    • //h2/text()

  • Obtenir tousaÉtiquettehref

    • //a/@href

  • AccèshtmlEn basheadEn bastitleTexte de

    • /html/head/title/text()

  • AccèshtmlEn basheadEn baslinkÉtiquettehref

    • /html/head/link/@href


Point de connaissance:Maîtrise xpathSyntaxe-Syntaxe pour sélectionner les noeuds et extraire les propriétés ou le contenu du texte


5. xpathSyntaxe-Syntaxe de modification des noeuds

Peut être basé sur la valeur de propriété de l'étiquette、Indices, etc. pour obtenir des noeuds spécifiques

5.1 Syntaxe de modification des noeuds

Expression du chemin Résultats
//title[@lang="eng"] SélectionnerlangLa valeur de la propriété estengTous lestitleÉlément
/bookstore/book[1] Choisissez parmi bookstore Premier élément enfant book Élément.
/bookstore/book[last()] Choisissez parmi bookstore Dernier élément enfant book Élément.
/bookstore/book[last()-1] Choisissez parmi bookstore L'avant - dernier de l'élément enfant book Élément.
/bookstore/book[position()>1] SélectionnerbookstoreEn bas.bookÉlément,Sélectionner à partir du deuxième
//book/title[text()='Harry Potter'] Sélectionner tousbookEn bastitleÉlément,Sélectionnez simplement le texte commeHarry PotterDetitleÉlément
/bookstore/book[price>35.00]/title Choisissez bookstore Dans l'élément book Tous les éléments title Élément,Et parmi eux price La valeur de l'élément doit être supérieure à 35.00.

5.2 À propos dexpathIndice

  • InxpathMoyenne,L'emplacement du premier élément est1

  • L'emplacement du dernier élément estlast()

  • L'avant - dernière estlast()-1

5.3 Exercices de grammaire

  • Nom de toutes les disciplines

    • //div[@class="nav_txt"]//a[@class="a_gd"]

  • Liens vers la première discipline

    • //div[@class="nav_txt"]/ul/li[1]/a/@href

  • Liens vers la dernière discipline

    • //div[@class="nav_txt"]/ul/li[last()]/a/@href


Point de connaissance:Maîtrise xpathSyntaxe-Sélectionner la syntaxe d'un noeud spécifique


6. xpathSyntaxe-Autres syntaxe de sélection de noeuds couramment utilisée

Peut passerJokersPour choisir un inconnuhtml、xmlÉléments de

6.1 Choisissez la syntaxe du noeud inconnu

Jokers Description
* Correspond à n'importe quel noeud d'élément.
node() Correspond à n'importe quel type de noeud.

6.2 Exercices de grammaire

  • Toutes les étiquettes

    • //*

  • Toutes les propriétés

    • //node()


Point de connaissance:Maîtrise xpathSyntaxe-Sélectionner la syntaxe du noeud de position 

7. lxmlExemple d'installation et d'utilisation du module

lxmlLe module est un module tiers,Utiliser après l'installation

7.1 lxmlInstallation du module

Obtenu pour la demande d'envoixmlOuhtmlForme du contenu de la réponse à extraire

pip/pip3 install lxml

Point de connaissance:Compris. lxmlInstallation du module

7.2 Oui, les reptiles.htmlContenu extrait

  • Extraire de l'étiquetteContenu du texte

  • Extraire de l'étiquetteValeur de la propriété

    • Par exemple,,ExtractionaDans l'étiquettehrefValeur de la propriété,Accèsurl,Continuer à demander

7.3 lxmlUtilisation du module

  1. Importerlxml De etree Bibliothèque

    from lxml import etree

  2. Utilisationetree.HTML,Oui.htmlString(bytesType oustrType)Convertir enElementObjet,ElementObjet avecxpathMéthode,Retour à la liste des résultats

    html = etree.HTML(text)
    ret_list = html.xpath("xpathChaîne de règles de syntaxe")
  3. xpathTrois cas où la méthode renvoie la Liste

    • Retour à la liste vide:SelonxpathChaîne de règles de syntaxe,Aucun élément n'a été localisé

    • Renvoie une liste de chaînes:xpathLes règles de chaîne doivent correspondre au contenu du texte ou à la valeur d'une propriété

    • Retour parElementListe des objets:xpathLa chaîne de règles correspond à l'étiquette,Dans la ListeElementL'objet peut continuerxpath

7.4 lxmlExemple d'utilisation du module

Exécuter le code suivant,Voir les résultats imprimés

from lxml import etree
text = '''
<div>
<ul>
  <li class="item-1">
    <a href="link1.html">first item</a>
  </li>
  <li class="item-1">
    <a href="link2.html">second item</a>
  </li>
  <li class="item-inactive">
    <a href="link3.html">third item</a>
  </li>
  <li class="item-1">
    <a href="link4.html">fourth item</a>
  </li>
  <li class="item-0">
    a href="link5.html">fifth item</a>
</ul>
</div>
'''
​
html = etree.HTML(text)
​
#AccèshrefListe ettitleListe de
href_list = html.xpath("//li[@class='item-1']/a/@href")
title_list = html.xpath("//li[@class='item-1']/a/text()")
​
#Assembler dans un dictionnaire
for href in href_list:
   item = {}
   item["href"] = href
   item["title"] = title_list[href_list.index(href)]
   print(item)

8 Exercice

Mettez ce qui suithtmlDans la chaîne de documents,ChaqueclassPouritem-1DeliLabel as1Nouvelles.ExtractionaContenu textuel de l'étiquette et liens,Assembler dans un dictionnaire.

text = ''' <div> <ul>
      <li class="item-1"><a>first item</a></li>
      <li class="item-1"><a href="link2.html">second item</a></li>
      <li class="item-inactive"><a href="link3.html">third item</a></li>
      <li class="item-1"><a href="link4.html">fourth item</a></li>
      <li class="item-0"><a href="link5.html">fifth item</a>
      </ul> </div> '''
  • Attention!:

    • Premier groupe,Extraire les données,Peut éviter la confusion des données

    • Les valeurs nulles doivent être jugées


Point de connaissance:Maîtrise lxmlDans le moduleetree.tostringUtilisation des fonctions


Quatre、seleniumUtilisation de

seleniumIntroduction

Point de connaissance:

  • Compris. seleniumComment ça marche?

  • Compris. seleniumEtchromedriverInstallation

  • Maîtrise Objet de l'étiquetteclickCliquez etsend_keysEntrée


1. seleniumDémonstration de l'effet de fonctionnement

SeleniumC'est unWebOutils d'essai automatisés pour,Conçu à l'origine pour l'automatisation des tests sur le site,Selenium Le navigateur peut être appelé directement,Il prend en charge tous les navigateurs grand public(Y compris:PhantomJSCes navigateurs sans interface),Peut recevoir des instructions,Laisser le navigateur charger automatiquement la page,Obtenir les données requises,Même des captures d'écran, etc.On peut utiliserseleniumC'est facile de finir le crawler écrit avant,Ensuite, regardonsseleniumL'effet de fonctionnement de

1.1 chromeEffets de fonctionnement du navigateur

En téléchargementchromedriverEt bien installéseleniumModule arrière,Exécutez le code suivant et observez le processus d'exécution

from selenium import webdriver
​
# Sidriver.Non ajouté à la variable d'environnement,Vous devezdriverLe chemin absolu versexecutable_pathParamètres
# driver = webdriver.Chrome(executable_path='/home/worker/Desktop/driver/chromedriver')
​
# SidriverLes variables d'environnement ajoutées n'ont pas besoin d'être définiesexecutable_path
driver = webdriver.Chrome()
​
# Vers unurlDemande d'initiation
driver.get("http://www.itcast.cn/")
​
# Enregistrer la page sous forme d'image,69La fonction capture d'écran ne sera pas disponible pour les navigateurs Google de plus de
# driver.save_screenshot("itcast.png")
​
print(driver.title) # Imprimer le titre de la page
​
# Quitter le navigateur analogique
driver.quit() # Assurez - vous de quitter!Il y aura des processus résiduels sans quitter!

1.2 phantomjsEffets de fonctionnement d'un navigateur sans interface

PhantomJS Est basé surWebkitDe“Sans interface”(headless)Navigateur,Il chargera le site en mémoire et exécutera la page JavaScript.

from selenium import webdriver
​
# DésignationdriverLe chemin absolu de
driver = webdriver.PhantomJS(executable_path='/home/worker/Desktop/driver/phantomjs')
# driver = webdriver.Chrome(executable_path='/home/worker/Desktop/driver/chromedriver')
​
# Vers unurlDemande d'initiation
driver.get("http://www.itcast.cn/")
​
# Enregistrer la page sous forme d'image
driver.save_screenshot("itcast.png")
​
# Quitter le navigateur analogique
driver.quit() # Assurez - vous de quitter!Il y aura des processus résiduels sans quitter!

1.3 Observer l'effet de fonctionnement

  • pythonLe Code peut automatiquement appeler Google browse ouphantomjsNavigateur sans interface,Contrôle son accès automatique au site

1.4 Scénario d'utilisation d'un navigateur sans tête et d'un navigateur avec tête

  • Habituellement, au cours du développement, nous avons besoin de voir toutes sortes de choses en cours d'exécution, donc nous utilisons habituellement un navigateur avec en - tête

  • .Quand le projet sera terminé et déployé,.En général, les plates - formes utilisent des systèmes d'exploitation de version serveur,La version serveur du système d'exploitation doit utiliser un navigateur sans en - tête pour fonctionner correctement

2. seleniumLe rôle et le fonctionnement de

En utilisant le navigateur natifAPI,Encapsulé dans un ensemble plus orienté objetSelenium WebDriver API,Manipulation directe des éléments de la page du navigateur,Même en manipulant le navigateur lui - même(Capture d'écran,Taille de la fenêtre,Démarrage,Fermer,Installer le plug - in,Configurer un certificat ou quelque chose comme ça)

  • webdriverL'essence est unweb-server,Disponible à l'extérieurwebapi,Qui encapsule les différentes fonctions du navigateur

  • Différents navigateurs utilisent différentswebdriver


Point de connaissance:Compris. seleniumComment ça marche?


3. selenium.Installation et utilisation simple de

Nous utilisons Google explorerchromedriverPar exemple

3.1 InpythonInstallation dans un environnement virtuelseleniumModule

pip/pip3 install selenium

3.2 La version téléchargée correspond àwebdriver


Point de connaissance:Compris. seleniumEtchromedriverInstallation


4. seleniumUtilisation simple de

Ensuite, nous allons simuler la recherche Baidu à travers le Code

import time
from selenium import webdriver
​
# Par désignationchromedriverPour instancierdriverObjet,chromedriverDans le répertoire courant.
# driver = webdriver.Chrome(executable_path='./chromedriver')
# chromedriverVariable d'environnement ajoutée
driver = webdriver.Chrome()
​
# Contrôle de l'accès au navigateururlAdresse
driver.get("https://www.baidu.com/")
​
# Recherche dans la boîte de recherche Baidu'python'
driver.find_element_by_id('kw').send_keys('python')
# Cliquez sur'Baidu Search'
driver.find_element_by_id('su').click()
​
time.sleep(6)
# Quitter le navigateur
driver.quit()
  • webdriver.Chrome(executable_path='./chromedriver')MoyenneexecutableLe paramètre spécifié est téléchargéchromedriverChemin du fichier

  • driver.find_element_by_id('kw').send_keys('python')PositionnementidLa valeur de l'attribut est'kw'Étiquette de,Et saisissez la chaîne'python'

  • driver.find_element_by_id('su').click()PositionnementidLa valeur de l'attribut estsuÉtiquette de,Et cliquez sur

    • clickLa fonction est:Qui a déclenché l'étiquettejsDeclickÉvénements


Point de connaissance:Maîtrise Objet de l'étiquetteclickCliquez etsend_keysEntrée


seleniumExtraire les données

Point de connaissance:

  • Compris. driverPropriétés et méthodes communes pour les objets

  • Maîtrise driverObjet localiser l'élément d'étiquette méthode d'obtention de l'objet d'étiquette

  • Maîtrise Étiquette objet méthode d'extraction du texte et des valeurs d'attribut


1. driverPropriétés et méthodes communes pour les objets

En serviceseleniumEn cours,InstanciationdriverAprès l'objet,driverLes objets ont quelques propriétés et méthodes communes

  1. driver.page_source Code source de la page Web après le rendu actuel du navigateur d'onglets

  2. driver.current_url De l'onglet actuelurl

  3. driver.close() Fermez l'onglet courant,Fermez tout le navigateur s'il n'y a qu'un onglet

  4. driver.quit() Fermer le navigateur

  5. driver.forward() Page en avant

  6. driver.back() Page précédente

  7. driver.screen_shot(img_name) Capture d'écran de la page


Point de connaissance:Compris. driverPropriétés et méthodes communes pour les objets


2. driverObjet localiser l'élément d'étiquette méthode d'obtention de l'objet d'étiquette

InseleniumLes étiquettes peuvent être positionnées de plusieurs façons,Renvoie l'objet de l'élément d'étiquette

find_element_by_id (Renvoie un élément)
find_element(s)_by_class_name (Obtenir la liste des éléments par nom de classe)
find_element(s)_by_name (Selon l'étiquettenameLa valeur de l'attribut renvoie une liste contenant les éléments de l'objet de l'étiquette)
find_element(s)_by_xpath (Retour à la liste des éléments)
find_element(s)_by_link_text (Obtenir la liste des éléments à partir du texte de connexion)
find_element(s)_by_partial_link_text (Obtenir la liste des éléments à partir du texte contenu dans le lien)
find_element(s)_by_tag_name (Obtenir la liste des éléments par nom d'étiquette)
find_element(s)_by_css_selector (SeloncssSélecteur pour obtenir la liste des éléments)
  • Attention!:

    • find_elementEtfind_elementsLa différence entre:

      • Il y en a plus.sRetour à la liste,Non.sRenvoie le premier objet d'étiquette correspondant

      • find_elementLancer une exception si elle ne correspond pas,find_elementsRenvoie une liste vide si elle ne correspond pas

    • by_link_textEtby_partial_link_texLa différence entre:Texte complet et contenant un texte

    • Comment utiliser les fonctions ci - dessus

      • driver.find_element_by_id('id_str')


Point de connaissance:Maîtrise driverObjet localiser l'élément d'étiquette méthode d'obtention de l'objet d'étiquette


3. Étiquette objet extraire le contenu du texte et les valeurs des attributs

find_elementIl suffit d'obtenir l'élément,Impossible d'accéder directement aux données,Si vous devez obtenir des données, utilisez les méthodes suivantes

  • Cliquez sur l'élémentelement.click()

    • Cliquez sur l'objet de l'étiquette que vous avez localisé

  • Saisissez les données dans la zone d'entréeelement.send_keys(data)

    • Saisissez les données de l'objet d'étiquette ancré à

  • Obtenir du texteelement.text

    • Objet de l'étiquette obtenu en localisanttextPropriétés,Obtenir le contenu du texte

  • Obtenir la valeur de l'attributelement.get_attribute("Nom de la propriété")

    • Objet de l'étiquette obtenu en localisantget_attributeFonctions,Nom de la propriété entrante,Pour obtenir la valeur de la propriété

  • Mise en œuvre du Code,Comme suit:

    from selenium import webdriver
    ​
    driver = webdriver.Chrome()
    ​
    driver.get('http://www.itcast.cn/')
    ​
    ret = driver.find_elements_by_tag_name('h2')
    print(ret[0].text) #
    ​
    ret = driver.find_elements_by_link_text('Programmeur de cheval noir')
    print(ret[0].get_attribute('href'))
    ​
    driver.quit()

Point de connaissance:Maîtrise Méthode de fonctionnement de l'objet élément


seleniumAutres utilisations de

Point de connaissance:

  • Maîtrise seleniumContrôle de la commutation des onglets

  • Maîtrise seleniumContrôleiframeChangement de

  • Maîtrise UtilisationseleniumAccèscookieMéthode

  • Maîtrise Mise en œuvre manuelle de la page en attente

  • Maîtrise seleniumContrôle l'exécution du navigateurjsLa méthode du Code

  • Maîtrise seleniumActiver le mode sans interface

  • Compris. seleniumUtiliser un mandataireip

  • Compris. seleniumRemplaceruser-agent


1. seleniumChangement d'onglet

QuandseleniumContrôle lorsque le navigateur ouvre plusieurs onglets,Comment contrôler le Navigateur pour passer d'un onglet à l'autre?Nous devons faire les deux étapes suivantes:

  • Obtenir les poignées de fenêtre pour tous les onglets

  • Utilisez le mot de poignée de fenêtre pour passer à l'onglet pointé par la poignée

    • La poignée de fenêtre ici signifie:Identification de l'objet de l'onglet

  • Méthodes spécifiques

    # 1. Obtient la liste des poignées de tous les onglets actuels
    current_windows = driver.window_handles
    ​
    # 2. Basculer en fonction de l'index index de la liste des poignées d'onglets
    driver.switch_to.window(current_windows[0])
  • Exemple de code de référence:

    import time
    from selenium import webdriver
    ​
    driver = webdriver.Chrome()
    driver.get("https://www.baidu.com/")
    ​
    time.sleep(1)
    driver.find_element_by_id('kw').send_keys('python')
    time.sleep(1)
    driver.find_element_by_id('su').click()
    time.sleep(1)
    ​
    # Par la mise en œuvrejsPour ouvrir un nouvel onglet
    js = 'window.open("https://www.sogou.com");'
    driver.execute_script(js)
    time.sleep(1)
    ​
    # 1. Obtenez toutes les fenêtres actuelles
    windows = driver.window_handles
    ​
    time.sleep(2)
    # 2. Basculer selon l'index de la fenêtre
    driver.switch_to.window(windows[0])
    time.sleep(2)
    driver.switch_to.window(windows[1])
    ​
    time.sleep(6)
    driver.quit()

Point de connaissance:Maîtrise seleniumContrôle de la commutation des onglets


2. switch_toBasculerframeÉtiquettes

iframe- Oui.htmlUne technique couramment utilisée dans,C'est - à - dire qu'une page est imbriquée d'une autre page,seleniumLa valeur par défaut est inaccessibleframeContenu de,La solution correspondante estdriver.switch_to.frame(frame_element).Ensuite, nous passons à traversqqLa boîte aux lettres simule un login pour apprendre ce point de connaissance

  • Code de référence:

    import time
    from selenium import webdriver
    ​
    driver = webdriver.Chrome()
    ​
    url = 'https://mail.qq.com/cgi-bin/loginpage'
    driver.get(url)
    time.sleep(2)
    ​
    login_frame = driver.find_element_by_id('login_frame') # SelonidPositionnement frameÉlément
    driver.switch_to.frame(login_frame) # Tournez - vous versframeMoyenne
    ​
    driver.find_element_by_xpath('//*[@id="u"]').send_keys('[email protected]')
    time.sleep(2)
    ​
    driver.find_element_by_xpath('//*[@id="p"]').send_keys('hahamimashicuode')
    time.sleep(2)
    ​
    driver.find_element_by_xpath('//*[@id="login_button"]').click()
    time.sleep(2)
    ​
    """FonctionnementframeLes éléments extérieurs doivent être commutés"""
    windows = driver.window_handles
    driver.switch_to.window(windows[0])
    ​
    content = driver.find_element_by_class_name('login_pictures_title').text
    print(content)
    ​
    driver.quit()

  • Résumé:

    • Passer au positionnementframeÉtiquette imbriquée dans la page

      • driver.switch_to.frame(Adoptionfind_element_byFonction positionnéeframe、iframeObjet de l'étiquette)

    • Utilisez la méthode de commutation des onglets pour couperframeÉtiquettes

      • windows = driver.window_handles
        driver.switch_to.window(windows[0])

Point de connaissance:Maîtrise seleniumContrôleframeChangement d'étiquette


3. seleniumC'est exact.cookieTraitement

seleniumPeut nous aider à gérercookie,Comme obtenir、Supprimer,Ensuite, nous apprendrons cette partie de la connaissance

3.1 Accèscookie

driver.get_cookies()Retour à la Liste,Il contient toutcookieInformation!Pas seulement.name、value,EtdomainAttendez.cookieInformations sur d'autres dimensions.Donc si vous voulez obtenircookieInformation etrequestsSi le module est utilisé ensemble,Doit être converti enname、valueComme paire de valeurs cléscookieDictionnaire

# Obtenez tous les onglets actuelscookieInformation
print(driver.get_cookies())
# Prends ça.cookieConvertir en Dictionnaire
cookies_dict = {cookie[‘name’]: cookie[‘value’] for cookie in driver.get_cookies()}

3.2 Supprimercookie

#Supprimer uncookie
driver.delete_cookie("CookieName")
​
# Supprimer tous lescookie
driver.delete_all_cookies()

Point de connaissance:Maîtrise UtilisationseleniumAccèscookieMéthode


4. seleniumContrôle l'exécution du navigateurjsCode

seleniumPermet au navigateur d'exécuter ce que nous avons spécifiéjsCode,Exécuter le code suivant pour voir l'effet d'exécution

import time
from selenium import webdriver
​
driver = webdriver.Chrome()
driver.get("http://www.itcast.cn/")
time.sleep(1)
​
js = 'window.scrollTo(0,document.body.scrollHeight)' # jsDéclarations
driver.execute_script(js) # Mise en œuvrejsMéthode
​
time.sleep(5)
driver.quit()
  • Mise en œuvrejsMéthode:driver.execute_script(js)


Point de connaissance:Maîtrise seleniumContrôle l'exécution du navigateurjsLa méthode du Code


5. Page en attente

La page prend du temps à attendre la réponse du serveur du site pendant le chargement,Il est possible que l'élément d'étiquette n'ait pas été chargé dans ce processus,Est invisible,Comment gérer cette situation?

  1. Page en attente de classification

  2. Forcer l'attente de l'introduction

  3. Attendre explicitement l'introduction

  4. Attente implicite de l'introduction

  5. Mise en œuvre manuelle de la page en attente

5.1 Classification des pages en attente

Commençons par comprendre ce qui suitseleniumClassification des pages en attente

  1. Attente forcée

  2. Attente implicite

  3. Attente explicite

5.2 Attente forcée(Compris.)

  • En fait, c'esttime.sleep()

  • Les défauts ne sont pas intelligents,Le temps de réglage est trop court,L'élément n'a pas encore été chargé;Le temps de réglage est trop long,Ce serait une perte de temps

5.3 Attente implicite

  • L'attente implicite vise le positionnement des éléments,L'attente implicite est réglée pour un temps,Basculer par index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index index indexDéterminer si l'élément a été positionné avec succès pendant un certain temps,Si c'est fait,Passons à l'étape suivante

  • Pas de positionnement réussi dans le temps fixé,Un délai de chargement est indiqué

  • Exemple de code

    from selenium import webdriver
    ​
    driver = webdriver.Chrome()  
    ​
    driver.implicitly_wait(10) # Attente implicite,La plus longue attente20Secondes  
    ​
    driver.get('https://www.baidu.com')
    ​
    driver.find_element_by_xpath()
    ​

5.4 Attente explicite(Compris.)

  • Vérifiez si les conditions d'attente sont remplies toutes les secondes après,Si les réalisations cessent d'attendre,Continuer avec les codes suivants

  • Si aucune réalisation n'est atteinte, continuez d'attendre jusqu'à ce que le délai prescrit soit dépassé,Signaler une exception de délai

  • Exemple de code

    from selenium import webdriver
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    driver = webdriver.Chrome()
    driver.get('https://www.baidu.com')
    # Attente explicite
    WebDriverWait(driver, 20, 0.5).until(
    EC.presence_of_element_located((By.LINK_TEXT, 'D'accord.123')))
    # Paramètres20Indique la plus longue attente20Secondes
    # Paramètres0.5Représentation0.5Vérifier l'existence de l'étiquette spécifiée une fois par seconde
    # EC.presence_of_element_located((By.LINK_TEXT, 'D'accord.123')) Indique que l'étiquette est positionnée par le contenu du texte lié
    # Chaque0.5Un contrôle par seconde,Localiser si l'étiquette existe en reliant le contenu du texte,S'il y en a, continuez vers le bas;S'il n'existe pas,Jusqu'à20La limite supérieure de secondes lance une exception
    print(driver.find_element_by_link_text('D'accord.123').get_attribute('href'))
    driver.quit() 

5.5 Mise en œuvre manuelle de la page en attente

Après avoir appris l'attente implicite et explicite et l'attente forcée,Nous avons constaté qu'il n'existe pas de solution universelle au problème de l'attente des pages,Par exemple,“La page a besoin de glisser pour se déclencherajaxChargement asynchrone”Scènes, Ensuite, prenons l'exemple de la page d'accueil de Taobao. ,Mise en œuvre manuelle de la page en attente.

  • Principes:

    • Mise en œuvre manuelle à l'aide de l'idée d'attente forcée et explicite

    • Un jugement constant ou limité dans le nombre de fois pour déterminer si un objet d'étiquette est chargé ou non(Existe - t - il?)

  • Le Code d'implémentation est le suivant:

import time
from selenium import webdriver
driver = webdriver.Chrome('/home/worker/Desktop/driver/chromedriver')
driver.get('https://www.taobao.com/')
time.sleep(1)
# i = 0
# while True:
for i in range(10):
i += 1
try:
time.sleep(3)
element = driver.find_element_by_xpath('//div[@class="shop-inner"]/h3[1]/a')
print(element.get_attribute('href'))
break
except:
js = 'window.scrollTo(0, {})'.format(i*500) # jsDéclarations
driver.execute_script(js) # Mise en œuvrejsMéthode
driver.quit()

Point de connaissance:Maîtrise Mise en œuvre manuelle de la page en attente


6. seleniumActiver le mode sans interface

La grande majorité des serveurs n'ont pas d'interface,seleniumLe contrôle de google browser existe également en mode sans interface,Dans cette section, nous allons apprendre à activer le mode sans interface(Aussi connu sous le nom de mode sans tête)

  • Comment activer le mode sans interface

    • Instancier l'objet de configuration

      • options = webdriver.ChromeOptions()

    • Configurer l'objet ajouter une commande pour activer le mode sans interface

      • options.add_argument("--headless")

    • Configurer l'ajout d'objets désactivergpuOrdre de

      • options.add_argument("--disable-gpu")

    • Instancier avec l'objet de configurationdriverObjet

      • driver = webdriver.Chrome(chrome_options=options)

  • Attention!:macosMoyennechromeNavigateur59+Version,LinuxMoyenne57+Version pour utiliser le mode sans interface!

  • Les codes de référence sont les suivants::

from selenium import webdriver
options = webdriver.ChromeOptions() # Créer un objet de configuration
options.add_argument("--headless") # Activer le mode sans interface
options.add_argument("--disable-gpu") # Désactivergpu
# options.set_headles() # Une autre façon d'ouvrir le mode sans interface
driver = webdriver.Chrome(chrome_options=options) # Instanciation avec configurationdriverObjet
driver.get('http://www.itcast.cn')
print(driver.title)
driver.quit()

Point de connaissance:Maîtrise seleniumActiver le mode sans interface


7. seleniumUtiliser un mandataireip

seleniumLe navigateur de contrôle peut également utiliser des agentsipDe!

  • Utiliser un mandataireipMéthode

    • Instancier l'objet de configuration

      • options = webdriver.ChromeOptions()

    • Configurer l'ajout d'objets en utilisant proxyipOrdre de

      • options.add_argument('--proxy-server=http://202.20.16.82:9527')

    • Instancier avec l'objet de configurationdriverObjet

      • driver = webdriver.Chrome('./chromedriver', chrome_options=options)

  • Les codes de référence sont les suivants::

    from selenium import webdriver
    options = webdriver.ChromeOptions() # Créer un objet de configuration
    options.add_argument('--proxy-server=http://202.20.16.82:9527') # Utiliser un mandataireip
    driver = webdriver.Chrome(chrome_options=options) # Instanciation avec configurationdriverObjet
    driver.get('http://www.itcast.cn')
    print(driver.title)
    driver.quit()

Point de connaissance:Compris. seleniumUtiliser un mandataireip


8. seleniumRemplaceruser-agent

seleniumEn contrôlant Google explorer,User-AgentLa valeur par défaut est Google explorer,Dans cette section, nous allons apprendre à utiliser différentsUser-Agent

  • Remplaceruser-agentMéthode

    • Instancier l'objet de configuration

      • options = webdriver.ChromeOptions()

    • Configurer l'objet ajouter une substitutionUAOrdre de

      • options.add_argument('--user-agent=Mozilla/5.0 HAHA')

    • Instancier avec l'objet de configurationdriverObjet

      • driver = webdriver.Chrome('./chromedriver', chrome_options=options)

  • Les codes de référence sont les suivants::

    from selenium import webdriver
    options = webdriver.ChromeOptions() # Créer un objet de configuration
    options.add_argument('--user-agent=Mozilla/5.0 HAHA') # RemplacerUser-Agent
    driver = webdriver.Chrome('./chromedriver', chrome_options=options)
    driver.get('http://www.itcast.cn')
    print(driver.title)
    driver.quit()

Point de connaissance:Compris. seleniumRemplaceruser-agent


Cinq、 Solution de préhension et de contre - escalade

Contre - escalade commune et solutions

Objectifs d'apprentissage

  1. Compris. Raison de l'anti - escalade du serveur

  2. Compris. Quel genre de crawler le serveur a - t - il tendance à combattre?

  3. Compris. Quelques concepts communs dans le domaine anti - reptile

  4. Compris. Les trois directions de l'anti - escalade

  5. Compris. Anti - escalade commune basée sur l'identification

  6. Compris. Contre - escalade commune basée sur le comportement des reptiles

  7. Compris. Anti - escalade commune basée sur le chiffrement des données


1 Raison de l'anti - escalade du serveur

  • Nombre total de reptilesPV(PV Est le nombre de visites de la page ,Chaque fois que vous ouvrez ou Rafraîchissez une page, Même si c'est un pv) Pourcentage élevé , C'est un gaspillage d'argent. ( Surtout les reptiles de mars. ).

    Qu'est - ce qu'un reptile en mars? ? En mars de chaque année, nous rencontrons un pic de reptiles , Il y a un grand nombre de Masters qui choisissent de ramper vers le site Web pendant qu'ils écrivent leur thèse. , Analyse de l'opinion publique . Parce que j'ai remis mon papier en mai. ,Alors..., Tout le monde a lu des livres. ,Vous savez, Divers DotA,LOL, C'est en mars. ,C'est trop tard., Prenez les données. , Analyse en avril , Présentation des documents en mai , C'est le rythme. .

  • Les ressources que l'entreprise peut interroger gratuitement sont saisies par lots , Perte de compétitivité , Moins d'argent. .

    Les données peuvent être directement questionnées dans un état non connecté . En cas de connexion forcée , Alors vous pouvez faire payer l'autre partie en fermant le compte , C'est ce que font de nombreux sites Web. . Mais ne pas forcer l'autre partie à se connecter . Donc s'il n'y a pas d'anti - crawler , L'autre partie peut copier des informations en vrac , La compétitivité des entreprises diminuera considérablement . Les concurrents peuvent saisir les données , Au fil du temps, les utilisateurs sauront , Il suffit d'aller chez un concurrent. , Pas besoin de venir sur notre site , C'est mauvais pour nous. .

  • Il y a peu de chances que les reptiles réussissent.

    Le reptile est toujours une boule de frottement en Chine , Est qu'il est possible de poursuivre avec succès , Ou peut - être pas du tout. . C'est pourquoi nous avons encore besoin de la technologie comme dernière garantie. .

2 Quel genre de crawler le serveur a - t - il tendance à combattre?

  • Diplômés très jeunes

    Les reptiles des nouveaux diplômés sont généralement simples et rudes , Peu importe la pression du serveur , Plus le nombre de personnes est imprévisible , Il est facile d'accrocher le site .

  • Une petite start - up de très bas niveau

    De plus en plus de START - up , Je ne sais pas qui m'a trompé, puis tout le monde a commencé à travailler et a découvert qu'il ne savait pas quoi faire. , Je pense que les mégadonnées sont assez chaudes , Commencez à faire des mégadonnées. . Le Programme d'analyse est presque écrit. , Je n'ai pas de données. .Comment faire?? Écrivez crawler crawler crawler crawler crawler crawler crawler crawler crawler crawler crawler crawler crawler crawler crawler crawler crawler . Et il y a d'innombrables petits reptiles , Pour la survie de l'entreprise , Ramper dans les données .

  • C'est une erreur d'écriture. Personne ne s'arrête.

    Certains sites Web ont fait l'anti - escalade correspondante , Mais les reptiles continuent à ramper sans relâche .Qu'est - ce que ça veut dire?C'est - à - dire, Ils n'ont pas accès aux données. ,Sauf quehttpcode- Oui.200À l'extérieur, Tout est faux. , Mais le crawler ne s'arrête pas, et c'est probablement un petit crawler hébergé sur certains serveurs. , Non réclamé. , Je travaille encore dur. .

  • Contreparties formées

    C'est le plus grand adversaire. , Ils ont la technologie. ,De l'argent.,Ce que vous voulez, ce que vous avez, Si je me cogne contre toi, , Tu vas devoir te cogner la tête contre lui. .

  • Moteur de recherche aspirant

    Ne croyez pas que les moteurs de recherche sont bons. , Ils ont aussi des moments d'aspiration. , Et une seule prise d'air peut entraîner une dégradation des performances du serveur , Il n'y a pas de différence entre les demandes et les cyberattaques .

3 Quelques concepts communs dans le domaine anti - reptile

Parce que l'anti - reptile est temporairement un nouveau domaine , Donc certaines définitions doivent être faites par vous - même :

  • Crawler:Utiliser n'importe quel moyen technique, Une façon d'obtenir des informations sur le site Web en vrac .La clé est le lot.

  • Anti - crawler:Utiliser n'importe quel moyen technique, Une façon d'empêcher les autres d'obtenir des informations sur leur site Web en vrac .La clé est aussi le lot.

  • Blessures accidentelles: Dans le processus anti - crawler ,Erreur d'identification de l'utilisateur moyen comme un crawler.Stratégie anti - reptile avec un taux élevé de blessures par erreur,Ça ne marchera jamais..

  • Interception: Accès au crawler bloqué avec succès .Il y a un concept de taux d'interception ici..En général,, Stratégie anti - crawler avec un taux d'interception plus élevé ,Plus le risque de blessure accidentelle est élevé. Il faut donc faire un compromis. .

  • Ressources:Somme du coût de la machine et du coût de la main - d'oeuvre.

N'oublie pas ça. , Les coûts de main - d'oeuvre sont également des ressources , Et plus important que la machine .Parce que,Selon la loi de Moore, Les machines deviennent moins chères .Et selonIT Évolution de l'industrie , Les programmeurs paient de plus en plus cher .Donc,, En général, le serveur anti - rampant fait que les ingénieurs rampants travaillent des heures supplémentaires. , Le coût de la machine n'est pas particulièrement précieux .

4 Les trois directions de l'anti - escalade

  • Anti - escalade basée sur l'identification

  • Contre - escalade basée sur le comportement des reptiles

  • Anti - escalade basée sur le chiffrement des données

5 Anti - escalade commune basée sur l'identification

1 AdoptionheadersChamp pour inverser la rampe

headers Il y a beaucoup de champs dans , Ces champs peuvent être récupérés par le serveur adverse pour déterminer s'il s'agit d'un crawler.

1.1 AdoptionheadersDansUser-AgentChamp pour inverser la rampe

  • Principe de l'anti - escalade:Crawler par défaut nonUser-Agent,Au lieu de cela, utilisez les paramètres par défaut du module

  • Solutions:Ajouter avant la demandeUser-AgentC'est tout.;Une meilleure façon est d'utiliserUser-AgentLa piscine résout ça.( Recueillir un tas User-AgentDe la façon dont, Ou au hasard. User-Agent)

1.2 AdoptionrefererChamp ou autre champ pour inverser la rampe

  • Principe de l'anti - escalade:Les Crawlers ne sont pas pris par défautrefererChamp, Le côté serveur détermine la source de la demande ,Pour déterminer si la demande est légale

  • Solutions:AjouterrefererChamp

1.3 AdoptioncookieAllez, grimpe.

  • Cause de l'anti - escalade :Par inspectioncookies Pour voir si l'utilisateur qui a lancé la demande a les permissions appropriées ,C'est comme ça qu'on fait l'anti - escalade.

  • Solutions: Effectuer un atterrissage simulé ,Acquis avec succèscookiesAprès cela, les données sont rampées

2 Ramper à l'envers en demandant des paramètres

Il existe de nombreuses façons d'obtenir les paramètres de la requête ,Envoyer une demande au serveur, La plupart du temps, vous devez apporter les paramètres de la demande , Habituellement, le côté serveur peut déterminer s'il s'agit d'un crawler en vérifiant si les paramètres de la requête sont corrects.

2.1 ParhtmlObtenir les données demandées dans un fichier statique(githubDonnées de connexion)

  • Cause de l'anti - escalade :Contre - escalade en augmentant la difficulté d'obtenir les paramètres demandés

  • Solutions:Analyser soigneusement chaque paquet capturé, Clarifier les liens entre les demandes

2.2 Obtenir les données de la demande en envoyant la demande

  • Cause de l'anti - escalade :Contre - escalade en augmentant la difficulté d'obtenir les paramètres demandés

  • Solutions:Analyser soigneusement chaque paquet capturé, Clarifier les liens entre les demandes ,Identifier la source des paramètres de la demande

2.3 AdoptionjsGénérer les paramètres de la requête

  • Principe de l'anti - escalade:jsParamètre de demande généré

  • Solutions:Analysejs,Observer la mise en œuvre du chiffrement,Adoptionjs2pyAccèsjsRésultats de la mise en œuvre,Ou utiliserseleniumPour réaliser

2.4 Anti - fluage par Code de vérification

  • Principe de l'anti - escalade:Le serveur opposé a forcé l'authentification du comportement de navigation de l'utilisateur par un code de vérification pop - up

  • Solutions:Plate - forme de codage ou méthode d'apprentissage par machine pour identifier le Code de vérification,Où la plate - forme de codage est bon marché et facile à utiliser,Plus recommandé

6 Contre - escalade commune basée sur le comportement des reptiles

1 Sur la base de la fréquence des demandes ou du nombre total de demandes

Le comportement du crawler est très différent de celui de l'utilisateur moyen , La fréquence et le nombre de demandes du crawler sont beaucoup plus élevés que ceux de l'utilisateur moyen

1.1 Adoption de la demandeip/ Nombre total de demandes de rampe inversée dans le temps de l'unit é de compte

  • Principe de l'anti - escalade:Site de demande de navigateur normal,Pas trop vite.,Le mêmeip/Le compte a demandé un grand nombre de serveurs opposés, Il y a plus de chances qu'ils soient reconnus comme des reptiles.

  • Solutions:En achetant des produits de haute qualitéipPour résoudre les problèmes/ Acheter plusieurs comptes

1.2 Par le mêmeip/L'intervalle entre les demandes de compte est inversé

  • Principe de l'anti - escalade:Navigateur d'exploitation normal parcourir le site Web,L'intervalle de temps entre les demandes est aléatoire, L'intervalle de temps entre les demandes avant et après le crawler est généralement plus court que l'intervalle de temps fixe. ,Il peut donc être utilisé comme anti - escalade

  • Solutions:Attente aléatoire entre les demandes,Simuler l'action réelle de l'utilisateur, Après avoir ajouté un intervalle de temps ,Pour obtenir des données à grande vitesse, Essayez d'utiliser le pool d'agents ,Si c'est un compte,Définir l'hibernation aléatoire entre les demandes de compte

1.3 Par la demandeip/ Nombre de demandes par jour

  • Principe de l'anti - escalade: Comportement normal de navigation ,Le nombre de demandes par jour est limité, Généralement plus d'une valeur ,Le serveur refusera de répondre

  • Solutions:En achetant des produits de haute qualitéipMéthode/Comptes multiples,En même temps, réglez l'hibernation aléatoire entre les demandes

2 Contre - escalade selon le comportement de montée, L'analyse est habituellement effectuée sur les étapes de montée

2.1 AdoptionjsRéaliser le saut à l'envers

  • Principe de l'anti - escalade:jsRéaliser le saut de page,Impossible d'obtenir la page suivante dans le code sourceurl

  • Solutions: Capture multiple de paquets pour obtenir des barres url,Règles d'analyse

2.2 Par le pot de miel(Un piège.)Get crawlerip(Ou agentip),Contre - escalade

  • Principe de l'anti - escalade: Pendant que le crawler obtient le lien pour la demande ,Les reptiles sont programmés,xpath,cssExtraire les liens suivants de la même manière,Le côté serveur peut maintenant définir un piègeurl,Sera récupéré par la règle d'extraction,Mais l'utilisateur normal ne peut pas obtenir,Cela permet de distinguer efficacement les Crawlers des utilisateurs normaux

  • Solutions: Après avoir écrit le crawler,Essai de rampe par lots avec agent/Analyser soigneusement la structure du contenu de la réponse,Trouver les pièges dans la page

2.3 Ramper à travers de fausses données

  • Principe de l'anti - escalade:Ajouter de fausses données pour polluer la base de données à la réponse retournée, Normalement, les familles ne sont pas vues par les utilisateurs normaux.

  • Solutions: Fonctionnement à long terme,Vérifier si les données de la base de données correspondent aux données de la page réelle,S'il y a un problème/ Analyser soigneusement le contenu de la réponse

2.4 Bloquer la file d'attente des tâches

  • Principe de l'anti - escalade:En générant de grandes quantités de déchetsurl,Cela bloque la file d'attente des tâches,Réduire l'efficacité réelle des reptiles

  • Solutions: Observer l'état de la réponse à la demande pendant l'exécution/ Analyser soigneusement les déchets d'acquisition de code source urlRègles de construction,C'est exact.URLFiltrer

2.5 Réseau de blocageIO

  • Principe de l'anti - escalade:Le processus d'envoi d'une demande pour obtenir une réponse est en fait le processus de téléchargement,Mélanger un grand fichier dans la file d'attente des tâchesurl,Lorsque le crawler fait la demande, il prend le réseauio, S'il y a plus d'un thread, le thread est utilisé

  • Solutions: Observer l'état de fonctionnement du crawler/ Multithread pair request thread timing / Envoyer l'argent demandé

2.6 Audit complet de la plate - forme o & M

  • Principe de l'anti - escalade: Gestion intégrée par l'intermédiaire de la plate - forme o & M ,Une stratégie anti - crawler composée est généralement utilisée,Utilisation simultanée de plusieurs moyens

  • Solutions: Observer attentivement l'analyse,Site Web de l'objectif d'essai à long terme,Vérifier la vitesse d'acquisition des données, Traitement multiforme

7 Anti - escalade commune basée sur le chiffrement des données

1 Traitement spécial des données contenues dans la réponse

La spécialisation habituelle se réfère principalement à cssDécalage des données/Polices personnalisées/Chiffrement des données/ Image des données / Formats de codage spéciaux, etc.

1.1 Anti - fluage avec polices personnalisées L'image ci - dessous est tirée du Forum autohome

  • Pensée anti - escalade: Utiliser vos propres fichiers de police

  • Solutions:Passer à la version mobile/Analyser les fichiers de police pour la traduction


1.3 AdoptionjsGénérer dynamiquement des données pour l'anti - escalade

  • Principe de l'anti - escalade:AdoptionjsGénération dynamique

  • Solutions:Clé analytiquejs,Obtenir le processus de production de données,Données générées par simulation

1.4 Anti - rampe à travers les images de données

  • 58 Location courte dans la même ville

  • Solutions: Analyser les données d'une image en utilisant le moteur de résolution d'image

1.5 Anti - fluage par format codé

  • Principe de l'anti - escalade: Sans objet format d'encodage par défaut , Habituellement utilisé par un crawler après avoir obtenu une réponse utf-8Format à décoder,Le résultat du décodage sera soit un brouillage, soit une erreur

  • Solutions:Décodage Multi - formats selon le code source, Ou un vrai format de décodage

Résumé

  • Maîtrise Contre - escalade commune 、 Principes et contre - mesures

Traitement du Code de vérification

Objectifs d'apprentissage

  1. Compris. Connaissance des codes de vérification

  2. Maîtrise Utilisation du moteur de reconnaissance d'image

  3. Compris. Plate - forme de codage commune

  4. Maîtrise Méthode de traitement du Code de vérification par plate - forme de codage


1.Code de vérification de l'image

1.1 Qu'est - ce qu'un code de vérification d'image

  • Code de vérification(CAPTCHA)- Oui.“Completely Automated Public Turing test to tell Computers and Humans Apart”(Test Turing entièrement automatisé pour distinguer les ordinateurs des humains)Abréviation de,Est un programme public entièrement automatisé qui distingue l'utilisateur d'un ordinateur ou d'une personne.

1.2 Le rôle du Code de vérification

  • Empêcher le piratage malveillant des mots de passe、Brossez les billets、Arrosage du Forum、Brossage des pages.Empêche efficacement un hacker d'essayer continuellement de se connecter à un utilisateur enregistré spécifique en utilisant des méthodes de craquage de violence de programme spécifiques,.En fait, l'utilisation de codes de vérification est une façon courante pour de nombreux sites Web(Comme la Banque personnelle en ligne de la China Merchants Bank,Baidu Community),Nous l'avons fait d'une manière plus simple.Bien que la connexion soit un peu gênante,Mais cette fonctionnalité est encore nécessaire pour la sécurité cryptographique des internautes,C'est aussi important.

1.3 Scènes d'utilisation du Code de vérification d'image dans le crawler

  • Inscription

  • Connexion

  • Lorsque les demandes sont envoyées fréquemment,Le serveur éjecte le Code de vérification pour vérifier

1.4 Schéma de traitement du Code de vérification de l'image

  • Entrée manuelle(input) Cette méthode se limite à l'utilisation durable d'une seule connexion

  • Résolution du moteur de reconnaissance d'image Traitement des données dans les images à l'aide d'un moteur de reconnaissance optique,Actuellement couramment utilisé pour l'extraction de données d'image,Moins utilisé pour le traitement des codes de vérification

  • Plate - forme de codage Les solutions de code de vérification couramment utilisées par les reptiles

2.Moteur de reconnaissance d'image

OCR(Optical Character Recognition)Est l'utilisation d'un scanner ou d'une caméra numérique pour numériser des données textuelles dans un fichier image,Le fichier image est ensuite analysé,Logiciel d'identification automatique pour obtenir des informations textuelles et de mise en page.

2.1 Qu'est - ce quetesseract

  • Tesseract,Un parHPLe laboratoire a été développé parGoogleOpen source pour la maintenanceOCRMoteur,Caractéristiques open source,Gratuit,Support multilingue,Multiplateforme.

2.2 Installation d'un environnement moteur de reconnaissance d'image

1 Installation du moteur

  • macExécution directe des commandes dans l'environnement

brew install --with-training-tools tesseract
  • windowsInstallation dans l'environnement Peut passerexeInstallation du paquet d'installation,L'adresse de téléchargement est disponible à partir deGitHubDans le projetwikiTrouver.N'oubliez pas deTesseract Le répertoire des fichiers d'exécution est ajouté àPATHMoyenne,Pour faciliter les appels ultérieurs.

  • linuxInstallation dans l'environnement

sudo apt-get install tesseract-ocr

2 PythonInstallation de la Bibliothèque

# PILPour ouvrir un fichier image
pip/pip3 install pillow
​
# pytesseractLe module est utilisé pour analyser les données de l'image
pip/pip3 install pytesseract

2.3 Utilisation du moteur de reconnaissance d'image

  • AdoptionpytesseractDu module image_to_string .La méthode extrait les données du fichier image ouvert en données de chaîne,Les méthodes spécifiques sont les suivantes

from PIL import Image
import pytesseract
​
im = Image.open()
​
result = pytesseract.image_to_string(im)
​
print(result)

2.4 Extension de l'utilisation du moteur de reconnaissance d'image

  • AutresocrPlate - forme

   MicrosoftAzure Reconnaissance d'images:https://azure.microsoft.com/zh-cn/services/cognitive-services/computer-vision/
  Reconnaissance de texte Dao Zhi Yun:http://aidemo.youdao.com/ocrdemo
  .Alibaba Cloud picture and Text Recognition:https://www.aliyun.com/product/cdi/
  TencentOCRReconnaissance de texte:https://cloud.tencent.com/product/ocr

3 Plate - forme de codage

1.Pourquoi faut - il comprendre l'utilisation de la plate - forme de codage

Aujourd'hui, de nombreux sites Web utilisent des codes de vérification pour l'anti - escalade,Donc pour avoir un meilleur accès aux données,Besoin de savoir comment utiliser le Code de vérification dans le crawler de plate - forme de codage

2 Plate - forme de codage commune

  1. Code Cloud:http://www.yundama.com/

    Capable de résoudre l'identification universelle des codes de vérification

  2. Code de vérification polaire aide à l'identification intelligente:http://jiyandoc.c2567.com/

    Identification capable de résoudre des codes de vérification complexes

3 Utilisation du Code Cloud

Voici un exemple de code Cloud,C'est quoi ce truc?Apprenez comment utiliser la plateforme de codage

3.1 Interface officielle de codage Cloud

Le code suivant est fourni par la plateforme de codage Cloud,J'ai fait un simple changement,Deux méthodes ont été mises en œuvre:

  1. indetify:Le binaire de réponse de l'image entrante est juste

  2. indetify_by_filepath:Le chemin de l'image entrante est reconnu

Ce qu'il faut configurer, c'est:

username = 'whoarewe' # Nom d'utilisateur
​
password = '***' # Mot de passe
​
appid = 4283 # appid
​
appkey = '02074c64f0d0bb9efb2df455537b01c3' # appkey
​
codetype = 1004 # Type de code de vérification

Cloud Code Official providedapiComme suit:

#yundama.py
import requests
import json
import time
​
class YDMHttp:
   apiurl = 'http://api.yundama.com/api.php'
   username = ''
   password = ''
   appid = ''
   appkey = ''
​
   def __init__(self, username, password, appid, appkey):
       self.username = username
       self.password = password
       self.appid = str(appid)
       self.appkey = appkey
​
   def request(self, fields, files=[]):
       response = self.post_url(self.apiurl, fields, files)
       response = json.loads(response)
       return response
​
   def balance(self):
       data = {'method': 'balance', 'username': self.username, 'password': self.password, 'appid': self.appid,
               'appkey': self.appkey}
       response = self.request(data)
       if (response):
           if (response['ret'] and response['ret'] < 0):
               return response['ret']
           else:
               return response['balance']
       else:
           return -9001
​
   def login(self):
       data = {'method': 'login', 'username': self.username, 'password': self.password, 'appid': self.appid,
               'appkey': self.appkey}
       response = self.request(data)
       if (response):
           if (response['ret'] and response['ret'] < 0):
               return response['ret']
           else:
               return response['uid']
       else:
           return -9001
​
   def upload(self, filename, codetype, timeout):
       data = {'method': 'upload', 'username': self.username, 'password': self.password, 'appid': self.appid,
               'appkey': self.appkey, 'codetype': str(codetype), 'timeout': str(timeout)}
       file = {'file': filename}
       response = self.request(data, file)
       if (response):
           if (response['ret'] and response['ret'] < 0):
               return response['ret']
           else:
               return response['cid']
       else:
           return -9001
​
   def result(self, cid):
       data = {'method': 'result', 'username': self.username, 'password': self.password, 'appid': self.appid,
               'appkey': self.appkey, 'cid': str(cid)}
       response = self.request(data)
       return response and response['text'] or ''
​
   def decode(self, filename, codetype, timeout):
       cid = self.upload(filename, codetype, timeout)
       if (cid > 0):
           for i in range(0, timeout):
               result = self.result(cid)
               if (result != ''):
                   return cid, result
               else:
                   time.sleep(1)
           return -3003, ''
       else:
           return cid, ''
​
   def post_url(self, url, fields, files=[]):
       # for key in files:
       #     files[key] = open(files[key], 'rb');
       res = requests.post(url, files=files, data=fields)
       return res.text
       
username = 'whoarewe' # Nom d'utilisateur
​
password = '***' # Mot de passe
​
appid = 4283 # appid
​
appkey = '02074c64f0d0bb9efb2df455537b01c3' # appkey
​
filename = 'getimage.jpg' # Emplacement du fichier
​
codetype = 1004 # Type de code de vérification
​
# Temps mort
timeout = 60
​
def indetify(response_content):
   if (username == 'username'):
       print(' Veuillez définir les paramètres pertinents avant le test. ')
   else:
       # Initialisation
       yundama = YDMHttp(username, password, appid, appkey)
​
       # Connectez - vous au Code Cloud
       uid = yundama.login();
       print('uid: %s' % uid)
​
       # Rechercher le solde
       balance = yundama.balance();
       print('balance: %s' % balance)
​
       # Commencez à reconnaître,Chemin de l'image,Type de code de vérificationID,Temps mort(Secondes),Résultats de l'identification
       cid, result = yundama.decode(response_content, codetype, timeout)
       print('cid: %s, result: %s' % (cid, result))
       return result
​
def indetify_by_filepath(file_path):
   if (username == 'username'):
       print(' Veuillez définir les paramètres pertinents avant le test. ')
   else:
       # Initialisation
       yundama = YDMHttp(username, password, appid, appkey)
​
       # Connectez - vous au Code Cloud
       uid = yundama.login();
       print('uid: %s' % uid)
​
       # Rechercher le solde
       balance = yundama.balance();
       print('balance: %s' % balance)
​
       # Commencez à reconnaître,Chemin de l'image,Type de code de vérificationID,Temps mort(Secondes),Résultats de l'identification
       cid, result = yundama.decode(file_path, codetype, timeout)
       print('cid: %s, result: %s' % (cid, result))
       return result
​
if __name__ == '__main__':
   pass

4 Types de codes de vérification communs

4.1 urlAdresse inchangée,Le Code de vérification est inchangé

C'est un type très simple de code de vérification,L'adresse correspondante n'a besoin que d'un code de vérification,Et demande,Identifié par la plate - forme de codage

4.2 urlAdresse inchangée,Changement de code de vérification

Ce type de code de vérification est plus courant,Pour ce code de vérification,Tout le monde doit réfléchir:

Pendant la connexion,Supposons que le Code de vérification que j'ai entré soit correct,Comment le serveur opposé juge - t - il que le Code de vérification que j'ai entré est celui qui apparaît sur mon écran,Au lieu des autres codes de vérification?

En accédant à la page web,Demander un code de vérification,Et quand le Code de vérification est soumis,Le serveur opposé a dû vérifier que le Code de vérification que j'ai obtenu précédemment et le dernier Code de vérification soumis étaient le même Code de vérification,Veuillez définir les paramètres pertinents avant le test?

C'est évident,C'est parcookiePour y arriver.,Donc la correspondance,Sur la page de demande,Demander un code de vérification,Une garantie est requise pour la soumission du Code de vérificationcookieCohérence,Peut être utilisé pour celarequests.sessionC'est réglé.


Résumé

  1. Compris. Connaissance des codes de vérification

  2. Maîtrise Utilisation du moteur de reconnaissance d'image

  3. Compris. Plate - forme de codage commune

  4. Maîtrise Méthode de traitement du Code de vérification par plate - forme de codage

chromeIntroduction à l'utilisation du navigateur

Objectifs d'apprentissage

  1. Compris. Objet de la nouvelle fenêtre furtive

  2. Compris. chromeMoyennenetworkUtilisation de

  3. Compris. .Comment trouver l'interface de connexion


1 Nouvelle fenêtre invisible

Ouvrir le site directement dans le navigateur,Il sera automatiquement sauvegardé lors de la mise sur le site précédentcookie,Mais pour la première fois dans crawler, la page n'est pas prisecookieDe,Comment résoudre cette situation?

Utilisation de fenêtres invisibles,Ouverture du site pour la première fois,Non.cookie,Possibilité d'observer l'accès à la page,Y compris comment configurer le serveur opposécookieAu niveau local

2 chromeMoyennenetworkPlus de fonctionnalités pour

2.1 Perserve log

Par défaut,Après le saut de page,Demandes antérieuresurlL'adresse et d'autres informations disparaîtront.,Cocherperserve logLes demandes antérieures seront conservées.

2.2 filterFiltration

InurlQuand il y a beaucoup d'adresses,Ça pourrait être dansfilterEntrée moyenneurlAdresse,Pour tousurlL'adresse a un certain effet de filtrage,L'emplacement est indiqué dans la deuxième image ci - dessus.2Emplacement

2.3 Observer un type particulier de demande

Dans la deuxième image ci - dessus,3Emplacement,Il y a beaucoup d'options,La valeur par défaut est sélectionnéeall,Tous les types de demandes sont observés

Il y a beaucoup de choix à faire à ses propres fins.allAutres options à droite,Comme les options communes:

  • XHR:Dans la plupart des cas,ajaxDemande

  • JS:jsDemande

  • CSS:cssDemande

Mais la plupart du temps, nous ne pouvons pas garantir le type de demande dont nous avons besoin.,En particulier, nous ne savons pas si une demande estajaxSur demande,Sélection directeall,Regarde de l'avant vers l'arrière.,Parmi euxjs,css,L'image ne peut pas attendre d'être observée

Ne soyez pas effrayé par un tas de requêtes dans votre navigateur,Parmi ces demandes, on peut citer:js,css,En dehors de la demande d'image,Il n'y a pas beaucoup d'autres demandes

3 Trouver l'interface de connexion

En regardant en arrière les anciens reptiles de Renren, nous avons trouvé une interface de connexion,D'où vient cette interface??

3.1 RechercheactionC'est vrai.urlAdresse

On peut le découvrir.,Cette adresse est connectéeformDans le formulaireactionCorrespondanturlAdresse,Examiner les points de connaissance à l'avant,Vous pouvez trouver l'adresse à laquelle le formulaire est soumis,Correspondant,Données soumises,Juste besoin:Nom d'utilisateurinputDans l'étiquette,nameLa valeur de,Nom d'utilisateur comme valeur,Mot de passeinputDans l'étiquette,nameLa valeur de,Mot de passe comme valeur

Penser:

SiactionNon.urlQue faire à l'adresse?

3.2 Rechercher les logins en saisissant des paquetsurlAdresse

Vous pouvez le trouver en saisissant le paquet,IciurlParamètres dans l'adresse et le corps de la requête,Par exemple,uniqueTimestampEtrkeyEt après cryptagepassword

À ce stade, nous pouvons regarder l'interface de connexion de la version mobile,Est - ce la même chose?

Peut être trouvé dans la version mobile,Paramètre toujours présent,Mais il y a moins d'arguments,À ce moment - là.,On peut.Utiliser la version mobile comme référence,La section suivante explique comment analyserjs


Résumé

  1. L'objectif principal de l'utilisation de fenêtres furtives est d'éviter la première ouverture du sitecookieLa question de

  2. chromeDenetworkMoyenne,perserve logL'option permet d'observer les requêtes précédentes après un saut de page

  3. Il y a deux façons de déterminer l'adresse de connexion:

    • RecherchefromFormulaireactionDeurlAdresse

    • Obtenir par capture de paquets

JSAnalyse de

Objectifs d'apprentissage:

  1. Compris. PositionnementjsMéthode

  2. Compris. Ajouter une observation de point d'arrêtjsComment exécuter le processus

  3. Application js2pyAccèsjsMéthode

1 C'est sûr.jsEmplacement

Pour le cas précédent de Renren,On a comprisurlIl y a des paramètres partiels dans l'adresse,Mais comment les paramètres sont - ils générés?

Sans aucun doute,Le paramètre doit êtrejsProduit,Comment obtenir les règles de ces paramètres?Pour en savoir plus

1.1 Voir la liaison du boutonjsÉvénements

En cliquant sur le bouton,Puis cliquez surEvent Listener,Certains sites Web peuvent trouver des événements liés,Correspondant,Il suffit de cliquer pour passer àjsEmplacement

1.2 Adoptionsearch all file Pour chercher

Certains boutons du site Web peuvent ne pas être liésjsSurveillance des événements,Vous pouvez alors le trouver en recherchant les mots clés dans la requêtejsEmplacement,Par exemple,livecell

Cliquez sur embellir les options de sortie

Vous pouvez continuer à rechercher des mots clés

2 ObservationjsProcessus de mise en œuvre

TrouverjsAprès la position de,Nous pouvons venir à travers l'observationjsEmplacement,TrouverjsEn particulier sur la façon dont,Ensuite, nous pouvons passer parpythonPour simulerjsMise en œuvre,Ou utiliser quelque chose commejs2pyAllez - y.jsLe Code est converti enpythonProgramme à exécuter

ObservationjsLa façon la plus simple de le faire est d'ajouter des points d'arrêt

Comment ajouter un point d'arrêt:Cliquez sur le numéro de ligne à gauche pour ajouter,À droiteBreakPointsTous les points d'arrêt existants apparaîtront dans

Cliquez sur login après avoir ajouté un point d'arrêt,Chaque fois que le programme s'arrête au point d'arrêt,En générant des variables sur cette ligne,Les résultats des variables sont présentés dansScoopeMoyenne

Dans le coin supérieur droit de l'image ci - dessus1,2,3Trois fonctions,Représente séparément: - 1:Continuez jusqu'au point d'arrêt suivant - 2:Dans la fonction appelée - 3:Sauter d'une fonction appelée

3 js2pyUtilisation de

J'ai comprisjsComment générer les données que nous voulons,Ensuite, nous devons utiliser le programme pour obtenirjsLes résultats après l'exécution

3.1 js2pyIntroduction

js2pyC'est unjsUn outil de traduction pour,C'est aussi un passage purpythonRéaliséjsInterpréteur pour.

3.2 jsLa mise en œuvre de la pensée

jsLes modes d'exécution sont généralement divisés en deux:

  1. J'ai compris.jsAprès le contenu et l'ordre d'exécution,AdoptionpythonPour finirjsProcessus de mise en œuvre,Obtenir des résultats

  2. J'ai compris.jsAprès le contenu et l'ordre d'exécution,Utilisation similairejs2pyLe module dejsCode,Obtenir des résultats

Mais en utilisantpythonMise en oeuvre du programmejsEn cours d'exécution,Besoin d'observationjsChaque étape de,C'est très gênant.,Donc plus souvent nous choisissons d'utiliser quelque chose commejs2pyPour exécuterjs,Ensuite, nous allons utiliserjs2pyRéaliser l'acquisition des paramètres de connexion de Renren

3.3 Réalisation concrète

Localiser pour se connecterjsCode

formSubmit: function() {
       var e, t = {};
       $(".login").addEventListener("click", function() {
           t.phoneNum = $(".phonenum").value,
           t.password = $(".password").value,
           e = loginValidate(t),
           t.c1 = c1 || 0,
           e.flag ? ajaxFunc("get", "http://activity.renren.com/livecell/rKey", "", function(e) {
               var n = JSON.parse(e).data;
               if (0 == n.code) {
                   t.password = t.password.split("").reverse().join(""),
                   setMaxDigits(130);
                   var o = new RSAKeyPair(n.e,"",n.n)
                    , r = encryptedString(o, t.password);
                   t.password = r,
                   t.rKey = n.rkey
              } else
                   toast("Impossible d'obtenir la clé publique"),
                   t.rKey = "";
               ajaxFunc("post", "http://activity.renren.com/livecell/ajax/clog", t, function(e) {
                   var e = JSON.parse(e).logInfo;
                   0 == e.code ? location.href = localStorage.getItem("url") || "" : toast(e.msg || "Erreur de connexion")
              })
          }) : toast(e.msg)
      })
  }

D'après le Code:

  1. Pour nous connecter, nous devons chiffrer et obtenir le mot de passerkeyValeur du champ

  2. rkeyValeur du champ nous envoyons la demande directementrkeyLa demande est disponible

  3. Le mot de passe est d'abord inversé puis utiliséRSACryptage, jsLe Code est compliqué, Nous espérons pouvoir passer à traverspythonExécution intermédiairejsPour réaliser

Idées de réalisation:

  1. UtilisersessionEnvoyerrKeyBesoin d'informations pour se connecter

    • url

    • Méthodes: get

  2. Chiffrer le mot de passe en fonction des informations obtenues 2.1 Préparer le nom d'utilisateur et le mot de passe

    2.2 Utiliserjs2pyGénérerjsEnvironnement d'exécution pour:context

    2.3 Copie utilisée pourjsContenu du document dans ce projet

    2.4 LirejsContenu du document,UtilisercontextPour les exécuter

    2.5 VerscontextAjouter les données nécessaires à l'environnement

    2.6 UtilisercontextExécuter le mot de passe chiffréjsString

    2.7 AdoptioncontextObtenir des informations chiffrées sur le mot de passe

  3. UtilisersessionEnvoyer une demande de connexion

    • URL

    • Méthode de demande: POST

    • Données:

      phoneNum: xxxxxxx
      password: (Produit après cryptage)
      c1: 0
      rKey: rkeyDemande d'acquisition

Code spécifique

Plusieurs téléchargements sont nécessaires à l'avancejsFile to Local:

BigInt.js

RSA.js

Barrett.js

import requests
import json
import js2py
​
# - Idées de réalisation:
#   - UtilisersessionEnvoyerrKeyBesoin d'informations pour se connecter
#     - url: http://activity.renren.com/livecell/rKey
#     - Méthodes: get
# AccèssessionObjet
session = requests.session()
headers = {
   "User-Agent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Mobile Safari/537.36",
   "X-Requested-With": "XMLHttpRequest",
   "Content-Type":"application/x-www-form-urlencoded"
}
# ParamètressessionEn - tête de demande pour
session.headers = headers
​
response = session.get("http://activity.renren.com/livecell/rKey")
# print(response.content.decode())
n = json.loads(response.content)['data']
​
#   - Chiffrer le mot de passe en fonction des informations obtenues
#     - Préparer le nom d'utilisateur et le mot de passe
phoneNum = "131..."
password = "****"
#     - Utiliserjs2pyGénérerjsEnvironnement d'exécution pour:context
context = js2py.EvalJs()
#     - Copie utilisée pourjsContenu du document dans ce projet
#     - LirejsContenu du document,UtilisercontextPour les exécuter
with open("BigInt.js", 'r', encoding='utf8') as f:
   context.execute(f.read())
​
with open("RSA.js", 'r', encoding='utf8') as f:
   context.execute(f.read())
with open("Barrett.js", 'r', encoding='utf8') as f:
   context.execute(f.read())
​
​
# - VerscontextAjouter les données nécessaires à l'environnement
context.t = {'password': password}
context.n = n
#     - Exécuter le mot de passe chiffréjsLes caractères
js = '''
      t.password = t.password.split("").reverse().join(""),
      setMaxDigits(130);
      var o = new RSAKeyPair(n.e,"",n.n)
      , r = encryptedString(o, t.password);
    '''
context.execute(js)
# - AdoptioncontextObtenir des informations chiffrées sur le mot de passe
# print(context.r)
password = context.r
#   - UtilisersessionEnvoyer une demande de connexion
#     - URL: http://activity.renren.com/livecell/ajax/clog
#     - Méthode de demande: POST
#     - Données:
#       - phoneNum: 15565280933
#       - password: (Produit après cryptage)
#       - c1: 0
#       - rKey: rkeyDemande d'acquisition
data = {
   'phoneNum': '131....',
   'password': password,
   'c1':0,
   'rKey':n['rkey']
}
​
# print(session.headers)
response = session.post("http://activity.renren.com/livecell/ajax/clog", data=data)
print(response.content.decode())
​
# Accès aux ressources connectées
response = session.get("http://activity.renren.com/home#profile")
print(response.content.decode())

Résumé

  1. EnchromeL'événement de liaison de l'élément d'observation dans peut déterminerjs

  2. EnchromeMoyennesearch all file Les mots clés de recherche peuvent être déterminésjsEmplacement

  3. ObservationjsLe processus de génération de données peut être observé en ajoutant des points d'arrêt

  4. js2pyUtilisation de

    • Besoin de préparationjsLe contenu de

    • GénérerjsEnvironnement d'exécution pour

    • Exécution dans un environnement d'exécutionjsLa chaîne de,Données entrantes,Obtenir les résultats

 Bonjour tout le monde,Je suis hottie..

Aujourd'hui, je vais vous montrer la prochaine partie du tutoriel. ,Le texte complet est assez long, Peut être collecté et regardé lentement .

Six、mongodbBase de données

MongodbIntroduction et installation

Objectifs d'apprentissage

  1. Compris. Avantages des bases de données non relationnelles

  2. Compris. mongodbInstallation


1. mongodbIntroduction

1.1 Qu'est - ce quemongodb

  • mongodb C'est l'un desNoSQLBase de données non relationnelle.Par C++ Rédaction Linguistique.

  • mongodb Disponible en soiSDonnées de stockage de bout en bout,C'est - à - dire:server;Également disponibleCTraitement des opérations de bout en bout(Comme les demandes de renseignements)Données,C'est - à - dire:client.

1.2 SQLEtNoSQLPrincipales différences

  • InSQLRelations de niveau intermédiaire: Base de données>Tableau>Données

  • EtNoSQLLe milieu est: Base de données>Ensemble>Documentation

1.2.1 Aucune corrélation entre les données

  • SQLComment ajouter des données de corrélation externe,La normalisation consiste à ajouter une clé étrangère au tableau original,Associer des tableaux de données externes.

  • NoSQLLes données externes peuvent être placées directement dans l'ensemble de données original,Pour améliorer l'efficacité des requêtes.Les inconvénients sont évidents.,Il est difficile de mettre à jour les données associées.

  • SQLLes champs de chaque donnée d'un tableau sont fixes.EtNoSQLUne collection de(Tableau)Chaque document dans(Données)Dekey(Champ)Ça peut être différent.

1.3 mongodbAvantages d'être une base de données non relationnelle par rapport à une base de données relationnelle

Facile à étendre: NoSQLUne grande variété de bases de données, Mais une caractéristique commune est de supprimer les caractéristiques relationnelles des bases de données relationnelles. Aucune relation entre les données, C'est très facile à étendre

Grande quantité de données,Haute performance: NoSQLLes bases de données sont toutes très performantes en lecture et en écriture, Excellent, surtout avec des données volumineuses. C'est grâce à son caractère non relationnel,La structure de la base de données est simple

Modèle de données flexible: NoSQLIl n'est pas nécessaire d'établir à l'avance des champs pour les données à stocker, Les formats de données personnalisés peuvent être stockés à tout moment. Et dans la base de données relationnelle, Ajouter ou supprimer des champs est une chose très gênante. S'il s'agit d'un tableau de très grandes quantités de données, Ajouter un champ est un cauchemar

2. mongodbInstallation

Parubuntu18.04Par exemple

mongodbIl existe deux modes d'installation:Commande d'installation Ou Installation du code source

2.1 Commande d'installation

InubuntuUtilisé dansapt-getInstallation d'outils

sudo apt-get install -y mongodb-org

Ou consulter les documents officiels Install MongoDB Community Edition on Ubuntu — MongoDB Manual

2.2 Installation du code source

2.2.1 Sélectionnez la version et le système d'exploitation appropriés et téléchargez

2.2.2 Décompresser

tar -zxvf mongodb-linux-x86_64-ubuntu1804-4.0.3.tgz

2.2.3 Déplacer vers/usr/local/Sous la table des matières

sudo mv -r mongodb-linux-x86_64-ubuntu1804-4.0.3/ /usr/local/mongodb

2.2.4 InshellScript d'initialisation pour.bashrcAjoutermongodbExécutable à variable d'environnementPATHMoyenne

a. Entrée.bashrcDans le document

cd ~
sudo vi .bashrc

b. In.bashrcDernier ajout au fichier:

export PATH=/usr/local/mongodb/bin:$PATH

3. mongodbDocuments officiels

Introduction to MongoDB — MongoDB Manual


Résumé

  1. Compris. Avantages des bases de données non relationnelles

    • Facile à étendre

    • Haute performance

    • Champs de données flexibles

  2. Compris. mongodbInstallation

    • sudo apt-get install -y mongodb-org

mongodbUtilisation simple de

Objectifs d'apprentissage

  1. Maîtrise Démarrage du serveur

  2. Maîtrise Utilisation du client

  3. Maîtrise mongodbCommandes de base de données et de collection pour

  4. Compris. Dans le document_idChamp


1. mongodbDémarrage du serveur

  • Port par défaut:27017

  • Emplacement du profil par défaut:/etc/mongod.conf

  • Emplacement du journal par défaut:/var/log/mongodb/mongod.log

mongodbLe serveur démarre de deux façons:

  • Démarrage du mode d'essai local(Fonction d'ajout, de suppression, de modification et de recherche de données locales seulement)

  • Démarrage de l'environnement de production(Avec toutes les fonctions)

1.1 Mode d'essai activé

  • Démarrage: sudo service mongod start (sudo service mongod start)

  • Arrêtez!: sudo service mongod stop

  • Redémarrer: sudo service mongod restart

1.2 Mode de démarrage officiel de l'environnement de production

Démarrage: sudo mongod [--auth --dbpath=dbpath --logpath=logpath --append --fork] [-–f logfile ]

  • Seulement avec sudo mongod Au démarrage de la commande,Par défaut, les données sont stockées dans /data/db Sous la table des matières,Besoin de créer manuellement

  • --dbpath: Spécifiez le chemin de stockage de la base de données

  • --logpath: Spécifiez le chemin de stockage du Journal

  • --append: Ou--logappend Définissez la forme d'écriture du journal en mode ajout

  • --fork: Ou-fork Démarrer un nouveau processusmongodbServices

  • --f: Ou-f Chemin du profil(Les informations de configuration ci - dessus peuvent être écrites dans un fichier et chargées à partir des paramètres du fichier)

  • --auth: Démarrage par authentification des droits,Nous en apprendrons plus tard dans le cours

1.3 Voir si le démarrage a réussi

ps aux | grep mongod

2. DémarragemongodbLe client de:Entréemongo shell

  • Démarrer le client local: mongo

  • Voir l'aide:mongo –help

  • Sortie:exitOuctrl+c

3. mongodbUtilisation simple de

Ouvertmongodb serverDans le cas de,En entrantmongo shellAprès,Pour une utilisation facile

3.1 mongodbCommandes pour la base de données

  • Voir la base de données actuelle:db(Utilisé par défaut sans basculer la base de donnéestestBase de données)

  • Voir toutes les bases de données:show dbs /show databases

  • Basculer la base de données:use db_name

    • db_namePourshow dbsNom de la base de données retournée après

  • Supprimer la base de données actuelle:db.dropDatabase()

3.2 mongodbLes commandes de la collection

  • Il n'est pas nécessaire de créer manuellement une collection: La première fois que vous ajoutez des données à une collection qui n'existe pas,La collection est créée automatiquement

  • Création manuelle d'une collection:

    • db.createCollection(name,options)

    • db.createCollection("stu")

    • db.createCollection("sub", { capped : true, size : 10 } )

    • Paramètrescapped:La valeur par défaut estfalseIndique qu'aucune limite supérieure n'est fixée,La valeur est:trueIndique le réglage de la limite supérieure

    • Paramètressize:Nombre d'octets utilisés par la collection. QuandcappedLa valeur est:trueHeure,Ce paramètre doit être spécifié,Indique la taille maximale,Lorsque le document atteint la limite supérieure, Les données précédentes seront écrasées,En octets

  • Voir la collection:show collections

  • Supprimer la collection:db.Nom de la collection.drop()

  • Vérifier si l'ensemble fixe une limite supérieure: db.Nom de la collection.isCapped()

3.3 Exercices simples

Inmongo shellSaisissez la commande suivante,Voir les résultats

show dbs
use test
show collections
db
db.stu.insert({'name':'Guo Jing', 'age':22})
show dbs
show collections
db.stu.find()
db.stu.drop()
show collections
db.dropDatabase()
show dbs
exit

3.3 mongodbTypes de données communs dans(Compris.)

3.3.1 Types courants

  • Object ID: DocumentationID/Les donnéesID,Clé primaire des données

  • String: String,Le plus souvent utilisé,Doit être valideUTF-8

  • Boolean: Stocke une valeur booléenne,trueOufalse

  • Integer: Un entier peut être32Bits ou64Bits,Ça dépend du serveur

  • Double: Nombre de points flottants

  • Arrays: Tableau/Liste

  • Object: mongodbUne des données/Documentation,C'est - à - dire que les documents sont imbriqués

  • Null: StockagenullValeur

  • Timestamp: Horodatage,De1970-1-1Nombre total de secondes à ce jour

  • Date: Pour stocker la date ou l'heure actuelleUNIXFormat temporel

3.3.2 Attention

  • Chaque document a une propriété,Pourid,Garantir l'unicité de chaque document,mongodbUtilisation par défautidComme clé primaire

    • Peut être réglé manuellementidValeur de,Si ce n'est pas le cas,AlorsMongoDBChaque document dispose d'unid, Le type estobjectID

  • objectIDC'est un12Nombre hexadécimal d'octets,Deux bits par octet,C'est tout.24Chaîne de bits:

    • Avant4Octets pour l'horodatage actuel

    • Et puis...3Machine à octetsID

    • La suite.2En octetsMongoDBProcessus de service pourid

    • Enfin3Les octets sont des valeurs incrémentales simples

Résumé

  1. Démarrage du serveur

    • sudo mongod --dbpath=Chemin de la base de données

  2. Entréemongo shellClient

    • mongo

  3. mongodbCommandes de base de données et de collection pour

    • show dbs

    • use db_name

    • show collections

    • db

    • db.Nom de la collection.drop()

    • db.dropDatabase()

    • exit

  4. En savoir plus sur_idChamp


MongodbAjouter, supprimer, modifier et vérifier

1. mongodbInsérer des données

Les ordres:db.Nom de la collection.insert(document)

db.stu.insert({name:'gj', gender:1})
db.stu.insert({_id:"20170101", name:'gj', gender:1})

Lors de l'insertion d'un document,Si non spécifié_idParamètres,MongoDBUn document unique est automatiquement attribuéObjectId

2. mongodbPour sauver

Les ordres:db.Nom de la collection.save(document)

db.stu.save({_id:'20170101', name:'gj', gender:2})
db.stu.save({name:'gj', gender:2})
db.stu.find()

Si le documentidModifier s'il existe déjà,SiidS'il n'existe pas, ajouter

3 mongodbDemandes de renseignements

Les ordres:db.Nom de la collection.find()

Les données suivantes peuvent être utilisées pour l'exercice

db.stu.insert([{"name" : "Guo Jing", "hometown" : "Mongolie", "age" : 20, "gender" : true },
{"name" : "Huang Rong", "hometown" : "Peach Blossom Island", "age" : 18, "gender" : false },
{"name" : "Huazheng", "hometown" : "Mongolie", "age" : 18, "gender" : false },
{"name" : "Herboriste jaune", "hometown" : "Peach Blossom Island", "age" : 40, "gender" : true },
{"name" : "Duan Yu", "hometown" : "Dali.", "age" : 16, "gender" : true },
{"name" : "Seigneur Duan", "hometown" : "Dali.", "age" : 45, "gender" : true },
{"name" : "Hong Qigong", "hometown" : "Huazheng", "age" : 18, "gender" : true }])

3.1 Simple requête

  • Méthodesfind(): Requête

    db.Nom de la collection.find({Documents conditionnels})

  • MéthodesfindOne():Requête,Renvoie seulement le premier

    db.Nom de la collection.findOne({Documents conditionnels})

  • Méthodespretty(): Formater les résultats;Pas avecfindOne()À utiliser ensemble!

    db.Nom de la collection.find({Documents conditionnels}).pretty()

3.2 Comparer les opérateurs

  • égal à: La valeur par défaut est égale au jugement, Pas d'opérateur

  • Moins de:$lt (less than)

  • Jusqu'à:$lte (less than equal)

  • Plus grand que:$gt (greater than)

  • Supérieur ou égal à:$gte

  • Pas égal à:$ne

L'âge de la requête est supérieur à18Tous les étudiants de
db.stu.find({age:{$gte:18}})

3.3 Opérateurs logiques

Les opérateurs logiques se réfèrent principalement à、Ou logique

  • and:InjsonIl suffit d'écrire plus d'une condition

L'âge de la requête est supérieur ou égal à18, Et le sexe esttrueÉtudiants
db.stu.find({age:{$gte:18},gender:true})
  • or:Utiliser$or, La valeur est un tableau, Chaque élément du tableau estjson

L'âge de la requête est supérieur à18, Ou le sexe estfalseÉtudiants
db.stu.find({$or:[{age:{$gt:18}},{gender:false}]})
​
L'âge de la requête est supérieur à18Ou de sexe masculin, Et son nom est Guo Jing
db.stu.find({$or:[{age:{$gte:18}},{gender:true}],name:'gj'})

3.4 Opérateur de plage

Utiliser$in, $nin Déterminer si les données sont dans un tableau

L'âge de la requête est18、 28Étudiants
db.stu.find({age:{$in:[18,28,38]}})

3.5 Prise en charge des expressions régulières

Utiliser$regexÉcrire des expressions régulières

RequêtenamePar'Jaune'Données initiales
db.stu.find({name:{$regex:'^Jaune'}})

3.6 Requête personnalisée

mongo shell C'est unjsEnvironnement d'exécution pour Utiliser$where Écrivez une fonction, Renvoie les données qui remplissent les conditions

L'âge de la requête est supérieur à30Étudiants
db.stu.find({
$where:function() {
    return this.age>30;}
})

3.7 skipEtlimit

  • Méthodeslimit(): Pour lire un nombre spécifié de documents

db.Nom de la collection.find().limit(NUMBER)
Requête2Message de l'étudiant
db.stu.find().limit(2)
  • Méthodesskip(): Utilisé pour sauter le nombre spécifié de⽂Rapport

db.Nom de la collection.find().skip(NUMBER)
db.stu.find().skip(2)
  • Utilisation simultanée

db.stu.find().limit(4).skip(5)
db.stu.find().skip(5).limit(4)

Attention!:Utilisez d'abordskipEn servicelimitEst plus efficace que le premier

3.8 Projection

Dans les résultats de retour de la requête, Sélectionnez seulement les champs nécessaires

Les ordres:db.Nom de la collection.find({},{Nom du champ:1,...})

Les paramètres sont les champs et les valeurs, La valeur est:1Indique l'affichage, La valeur est:0Ne pas montrer Faites attention à:

  • Pour_idLes colonnes sont affichées par défaut, Si l'affichage ne doit pas être explicitement défini à0

  • Vous ne pouvez pas définir à0

db.stu.find({},{_id:0,name:1,gender:1})

3.9 Trier

Méthodessort(), Utilisé pour trier les résultats de la requête par les champs spécifiés

Les ordres:db.Nom de la collection.find().sort({Champ:1,...})

Paramètres1Ordre croissant Paramètres-1Ordre décroissant

Par ordre décroissant de sexe, Par ordre croissant d'âge
db.stu.find().sort({gender:-1,age:1})

3.10 Nombre de statistiques

Méthodescount()Utilisé pour compter le nombre de documents dans l'ensemble de résultats

Les ordres:db.Nom de la collection.find({Conditions}).count() Les ordres:db.Nom de la collection.count({Conditions})

db.stu.find({gender:true}).count()
db.stu.count({age:{$gt:20},gender:true})

4 mongodbMise à jour de

db.Nom de la collection.update({query}, {update}, {multi: boolean})
  • Paramètresquery:Critères de requête

  • Paramètresupdate:Mettre à jour l'opérateur

  • Paramètresmulti:Facultatif,Par défautfalse,Indique que seules les premières données trouvées sont mises à jour,La valeur est:trueIndique la mise à jour de toutes les données qui remplissent les conditions

db.stu.update({name:'hr'},{name:'mnc'})           # Fichier texte complet pour la mise à jour de l'écrasement
db.stu.update({name:'hr'},{$set:{name:'hys'}})   # Spécifier l'opération de mise à jour de la valeur de la clé
db.stu.update({},{$set:{gender:0}},{multi:true}) # Mettre à jour tout

Attention!:"multi update only works with $ operators"

  • multiLes paramètres doivent être et$setÀ utiliser ensemble!

5 mongodbSuppression de

db.Nom de la collection.remove({query}, {justOne: boolean})
- Paramètresquery:Facultatif,Supprimé⽂Conditions du rapport
- ParamètresjustOne:Facultatif, Si elle est réglée àtrueOu1,Supprimer un seul,Par défautfalse,Indique que tout est supprimé

mongodbOpérations d'agrégation pour

1 mongodbQu'est - ce que l'agrégation de

Agrégation(aggregate)C'est un tuyau d'agrégation basé sur le traitement des données,Chaque document passe par plusieurs étapes(stage)Tuyauterie composée,Les tuyaux peuvent être groupés à chaque étape、Fonctions telles que le filtrage,Et après une série de traitements,Résultats correspondants.

Syntaxe:db.Nom de la collection.aggregate({Tuyauterie:{Expression}})

2 mongodbTuyaux et expressions couramment utilisés pour

Point de connaissance:

  • MaîtrisemongodbSyntaxe du tuyau

  • MaîtrisemongodbCommandes de tuyauterie moyenne

2.1 Commandes courantes de tuyauterie

InmongodbMoyenne,⽂Après le traitement du rapport, Par canalisation⾏En bas.⼀Traitement secondaire Les commandes courantes de tuyauterie sont les suivantes:

  • $group: Va rassembler⽂Groupe de rapports, Mais⽤Sur les résultats statistiques

  • $match: Filtrer les données, Seules les sorties admissibles⽂Rapport

  • $project: Modifier la sortie⼊⽂Structure du rapport, Comme renommer、 Ajouter、 Supprimer le champ、 Créer des résultats de calcul

  • $sort: Va perdre.⼊⽂Sortie après tri des rapports

  • $limit: Limiter le retour du tuyau d'agrégation⽂Nombre de rapports

  • $skip: Sauter le nombre spécifié de⽂Rapport, Et renvoie le reste⽂Rapport

2.2 Expressions courantes

Expression:Traitement des entrées⼊⽂Rapport et sortie Syntaxe:Expression:'$Nom de la colonne' Souvent⽤Expression:

  • $sum: Calculer la somme, $sum:1 Exprimé par⼀Nombre de fois

  • $avg: Calculer la moyenne

  • $min: Obtenir le plus⼩Valeur

  • $max: Obtenir le plus⼤Valeur

  • $push: Dans les résultats⽂Insertion dans le rapport⼊Valeur à⼀Des tableaux

3 Commande de tuyauterie$group

3.1 Grouper par un champ

$groupEst la commande la plus utilisée de toutes les commandes agrégées,Utilisé pour grouper des documents dans une collection,Disponible pour les résultats statistiques

Voici un exemple d'utilisation

db.stu.aggregate(
  {$group:
      {
           _id:"$gender",
           counter:{$sum:1}
      }
  }
)

Il y a quelques points à noter:

  • db.db_name.aggregateC'est la syntaxe,Toutes les commandes de tuyauterie doivent être écrites

  • _id Indique la base du regroupement,Par quels champs sont groupés,À utiliser$genderIndique que ce champ est sélectionné pour le regroupement

  • $sum:1 Indique que chaque donnée est considérée comme1Faire des statistiques,Les statistiques sont le nombre d'entrées de données sous ce groupe

3.2 group by null

Quand nous avons besoin de compter l'ensemble du document,$group Une autre utilisation est de diviser l'ensemble du document en groupes pour les statistiques

Voici quelques exemples d'utilisation:

db.stu.aggregate(
  {$group:
      {
           _id:null,
           counter:{$sum:1}
      }
  }
)

Il y a quelques points à noter:

  • _id:null Représente un champ sans Groupe spécifié,C'est - à - dire compter l'ensemble du document,Acquis en ce momentcounterReprésente le nombre de documents entiers

3.3 Pivot

La situation normale dans les statistiques ventilées par sexe,J'ai besoin de tout savoirname,Une observation article par article est nécessaire,Si, d'une façon ou d'une autrenameEnsemble.,Cela peut alors être interprété comme un pivot

Voici un exemple d'utilisation:

  1. Statistiques sur les étudiants de sexe différent

    db.stu.aggregate(
      {$group:
          {
               _id:null,
               name:{$push:"$name"}
          }
      }
    )
  2. Utiliser$$ROOTVous pouvez placer l'ensemble du document dans un tableau

    db.stu.aggregate(
      {$group:
          {
               _id:null,
               name:{$push:"$$ROOT"}
          }
      }
    )

3.4 Vas - y.

Pour les données suivantes,Il faut compter chaquecountry/provinceEn basuseridNombre de(Le mêmeuseridNe comptez qu'une seule fois)

{ "country" : "china", "province" : "sh", "userid" : "a" }  
{  "country" : "china", "province" : "sh", "userid" : "b" }  
{  "country" : "china", "province" : "sh", "userid" : "a" }  
{  "country" : "china", "province" : "sh", "userid" : "c" }  
{  "country" : "china", "province" : "bj", "userid" : "da" }  
{  "country" : "china", "province" : "bj", "userid" : "fa" }

Voir la réponse

db.tv3.aggregate(
{$group:{_id:{country:'$country',province:'$province',userid:'$userid'}}},
{$group:{_id:{country:'$_id.country',province:'$_id.province'},count:{$sum:1}}}
​

4 Commande de tuyauterie$match

$matchPour filtrer les données,Est une commande qui peut être utilisée dans une opération d'agrégation,EtfindLa différence est que$match L'opération peut donner les résultats au prochain Pipeline,EtfindJe ne peux pas.

5 Commande de tuyauterie$project

$projectPour modifier la structure d'entrée / sortie d'un document,Par exemple, renommer,Ajouter,Supprimer le champ

6 Commande de tuyauterie$sort

$sortUtilisé pour trier les documents d'entrée et de sortie

7 Commande de tuyauterie$skip Et $limit

  • $limitLimiter le nombre de données retournées

  • $skip Sauter le nombre spécifié de documents,Et renvoie le nombre de documents restants

  • Utiliser en même tempsskipEn servicelimit

1. PourquoimongdbBesoin de créer un index

  • Accélérer les requêtes

  • Effectuer la déduplication des données

2. mongodbCréer une méthode d'indexation simple

  • Syntaxe:db.Nom de la collection.ensureIndex({Propriétés:1}),1Indique l'ordre croissant, -1Indique un ordre décroissant

3. Comparaison de la vitesse de requête avant et après la création de l'index

Tests:Insérer10Dix mille données dans la base de données

Insérer des données:

for(i=0;i<100000;i++){db.t1.insert({name:'test'+i,age:i})}

Avant de créer l'index:

db.t1.find({name:'test10000'})
db.t1.find({name:'test10000'}).explain('executionStats') # Afficher les détails de l'opération de requête

Créer un index:

db.t1.ensureIndex({name:1})

Après la création de l'index:

db.t1.find({name:'test10000'}).explain('executionStats')

Comparaison des vitesses avant et arrière

4. Affichage de l'index

Par défaut_idEst l'index de la collection Mode de visualisation:db.Nom de la collection.getIndexes()

5. Supprimer l'index

Syntaxe:db.Nom de la collection.dropIndex({'Nom de l'index':1})

db.t1.dropIndex({name:1})
db.t1.getIndexes()

6. mongodbCréer un index unique

Par défautmongdbLa valeur du champ index pour peut être la même,Après avoir créé un index unique,La base de données vérifie si la valeur du champ d'index créé existe lors de l'insertion des données,Si elle existe, elle n'est pas insérée,Mais la création d'index ne fait qu'accélérer les requêtes,Tout en réduisant la vitesse d'insertion de la base de données.

6.1 Syntaxe pour ajouter un index unique:

db.Nom de la collection.ensureIndex({"Nom du champ":1}, {"unique":true})

6.2 Déduplication des données à l'aide d'un index unique

Valeur du champ spécifiée par un index unique,Si c'est pareil,Impossible d'insérer les données

db.t1.ensureIndex({"name":1}, {"unique":true})
db.t1.insert({name: 'test10000'})

7. Créer un index composé

Lors de la déduplication des données,Un champ peut être utilisé pour garantir l'unicité des données,À ce moment - là, on pourrait envisager d'établir des indices composites pour.

Par exemple:Prenez tous les messages,Il n'est pas souhaitable de supprimer la duplication des données en utilisant le nom du poste comme index unique,Parce qu'il peut y avoir beaucoup de messages portant le même nom

Syntaxe pour l'établissement d'un index composé:db.collection_name.ensureIndex({Champ1:1,Champ2:1})

8. Mise en place d'un point d'attention indexé

  • Choisissez si un index unique doit être établi au besoin

  • La question de savoir si un champ d'index est ascendant ou descendant n'affecte pas l'efficacité de la requête dans le cas d'un seul index,Mais avec un index composé, il y a un impact

  • La création d'index n'est nécessaire que lorsque la quantité de données est importante et que les opérations de lecture de la base de données sont fréquentes,Si l'écriture est très fréquente,La création d'index affecte la vitesse d'écriture

    Par exemple:Si le champ1La sortie doit être triée de façon ascendante,Champ2La sortie doit être triée par ordre décroissant,Ensuite, l'établissement de l'index composé exige que le champ1Set to1,Champ2Set to-1

MongodbGestion des droits pour

1. Pourquoi définir la gestion des droits

Qui vient d'être installémongodbPar défaut, l'authentification des droits n'est pas utilisée pour démarrer,AvecMySQLC'est différent.,mongodbIl n'y a pas de permissions définies lors de l'installation,Cependant, le système d'exploitation du réseau public doit définir les permissions pour assurer la sécurité des données,Alors on va étudiermongodbGestion des droits pour

2. mongodbSystème de gestion des droits pour

  • MongoDBIl n'y a pas de compte Administrateur par défaut,Ajoutez d'abord le compte Administrateur,EtmongodbLe serveur doit activer le mode d'authentification au moment de l'exécution

    • L'utilisateur ne peut se connecter qu'à la base de données dans laquelle il réside(Créer une base de données pour l'utilisateur),Inclure le numéro de compte de l'Administrateur.

    • L'Administrateur peut gérer toutes les bases de données,Mais vous ne pouvez pas gérer directement d'autres bases de données,Avant de pouvoir.

3. mongodbCréation d'un compte super administrateur

3.1 Créer un superutilisateur

Entréemongo shell

sudo mongod

UtiliseradminBase de données(Le compte superadmin doit être créé sur cette base de données)

use admin

Créer un superutilisateur

db.createUser({"user":"python","pwd":"python","roles":["root"]})

Le succès de la création affiche les informations suivantes

Successfully added user: { "user" : "python", "roles" : [ "root" ] }

Sortiemongo shell

exit

3.2 Démarrage par authentification des droitsmongodbBase de données

sudo mongod --auth

Après le démarrage, il y aura les informations suivantes dans le message de démarrage,DescriptionmongodbDémarrage réussi avec authentification des droits

[initandlisten] options: { security: { authorization: "enabled" } }

3.3 Vérification de connexion

Une erreur de permission est signalée lors de l'utilisation des commandes de la base de données,Une certification est nécessaire pour effectuer l'opération correspondante、

use admin
db.auth('python','python')
  • pythonL'utilisateur est créé àadminLa base de données doit donc veniradminAuthentification dans la base de données

  • Une certification réussie renvoie1,Échec retourné0

4. Créer un utilisateur normal

4.1 Créer un utilisateur normal sur la base de données utilisée

1.Sélectionnez la base de données pour laquelle vous souhaitez créer un utilisateur

use test1
  1. Créer un utilisateur

db.createUser("user":"user1", "pwd":"pwd1", roles:["read"])
Créer un utilisateur normaluser1,L'utilisateur esttest1Les permissions sur sont en lecture seule
db.createUser("user":"user1", "pwd":"pwd1", roles:["readWrite"])
Créer un utilisateur normaluser1,L'utilisateur esttest1La permission sur est de lire et d'écrire

4.2 InadminCréer un utilisateur normal sur la base de données utilisateur

use admin
db.createUser({"user":"python1", "pwd":"python1", roles:[{"role":"read","db":"dbname1"},{"role":"readWrite","db":"dbname2"}
]})

InadminCréer surpython1Utilisateurs,python1L'utilisateur a deux permissions,Encore une.dbname1Lire seulement sur,L'autre estdbname2Lire et écrire sur

5. Voir les utilisateurs créés

show users
{
"_id" : "admin.python",
"user" : "python",
"db" : "admin",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}

6. Supprimer l'utilisateur

6.1 Entrez dans la base de données où se trouvent les données du compte

use db_name

6.2 Supprimer l'utilisateur

db.dropUser('python')

mongodbEtpythonInteraction

1. mongdbEtpythonModules interactifs

pymongo OffremongdbEtpythonToutes les méthodes d'interaction Mode d'installation: pip install pymongo

2. Utiliserpymongo

2.1 ImporterpymongoEt sélectionnez la collection à utiliser

Les bases de données et les collections peuvent être créées automatiquement

2.1.1 Créer des objets de connexion et des opérandes de collection sans autorisation

from pymongo import MongoClient
​
client = MongoClient(host,port) # S'il s'agit d'une connexion localehost,portLes paramètres peuvent être omis
​
collection = client[dbNom][Nom de la collection]
# collection = client.dbNom.Nom de la collection # Même utilisation que ci - dessus

2.1.2 Créer des objets de connexion et des opérandes de collection d'une manière qui nécessite l'authentification des permissions

from pymongo import MongoClient
from urllib.parse import quote_plus
​
user = 'python' # Numéro de compte
password = 'python' # Mot de passe
host = '127.0.0.1' # host
port = 27017 # port
uri = "mongodb://%s:%[email protected]%s" % (quote_plus(user),
                             quote_plus(password),
                             host)
# quote_plusFonctions:C'est exact.urlCodage
# uri = mongodb://python:[email protected]
client = MongoClient(uri, port=port)
collection = client.dbNom.Nom de la collection

2.2 insert()Ajouter des données

insertPeut insérer une liste de données en vrac,Vous pouvez également insérer une donnée

collection.insert({Une donnée})
collection.insert([{Données I},{Données II}])

2.2.1 Ajouter une donnée

Renvoie les données insérées_id

ret = collection.insert({"name":"test10010","age":33})
print(ret)

2.2.2 Ajouter plusieurs données

RetourObjectIdListe des objets

item_list = [{"name":"test1000{}".format(i)} for i in range(10)]
rets = collection.insert(item_list)
print(rets)
for ret in rets:
   print(ret)

2.3 find_one()Trouver une donnée

Recevoir une condition sous forme de dictionnaire,Renvoie l'ensemble des données sous forme de dictionnaire Si la condition est vide,Renvoie le premier article

ret = client.test.test.find_one({'name': 'test10001'})
print(ret) # ContientmongodbDeObjectIdDictionnaire d'objets
_ = ret.pop('_id') # EffacermongodbDeObjectIdObjetk,v
print(ret) 

2.4 find()Trouver toutes les données

Renvoie les résultats de toutes les conditions remplies,Si la condition est vide,Renvoie tout Il en résulte unCursorObjet curseur,Est un objet itérable,Peut ressembler à un pointeur pour lire un fichier,Mais il ne peut être lu qu'une seule fois

rets = collection.find({"name":"test10005"}),
for ret in rets:
   print(ret)
for ret in rets: #En ce momentretsRien dans
   print(ret)

2.5 update()Mise à jour des données(Écraser le fichier texte complet ou spécifier la valeur de la clé,Mettre à jour un ou plusieurs)

  • Syntaxe:collection.update({Conditions}, {'$set':{DésignationkvOu une donnée complète}}, multi=False/True, upsert=False/True)

  • multiParamètres:Par défautFalse,Indique une mise à jour; multi=TrueMettre à jour plusieurs; multiLes paramètres doivent être et$setÀ utiliser ensemble

  • upsertParamètres:Par défautFalse; upsert=TrueDemande d'abord s'il existe,Mise à jour si elle existe;Insérer s'il n'existe pas

  • $setIndique que le champ spécifié est mis à jour

2.5.1 Mettre à jour une donnée;Couverture complète du fichier;Mise à jour si elle existe,Insérer s'il n'existe pas

data = {'msg':'C'est une donnée complète.1','name':'Ha Ha!'}
client.test.test.update({'haha': 'heihei'}, {'$set':data}, upsert=True)

2.5.2 Mettre à jour plusieurs données;Couverture complète du fichier;Mise à jour si elle existe,Insérer s'il n'existe pas

data = {'msg':'C'est une donnée complète.2','name':'Ha Ha!'} # Les données complètes sont obtenues après la première requête
client.test.test.update({}, {'$set':data}, multi=True, upsert=True)

2.5.3 Mettre à jour une donnée;Spécifier la valeur de la clé;Mise à jour si elle existe,Insérer s'il n'existe pas

data = {'msg':'Spécifier uniquement les mises à jourmsg___1'}
client.test.test.update({}, {'$set':data}, upsert=True)

2.5.4 Mettre à jour plusieurs données;Spécifier la valeur de la clé;Mise à jour si elle existe,Insérer s'il n'existe pas

data = {'msg':'Spécifier uniquement les mises à jourmsg___2'}
client.test.test.update({}, {'$set':data}, multi=True, upsert=True)

2.6 delete_one()Supprimer une donnée

collection.delete_one({"name":"test10010"})

2.7 delete_many()Supprimer toutes les données

collection.delete_many({"name":"test10010"})

3. pymongoModule diversapi

VoirpymongoDocument officiel ou code source http://api.mongodb.com/python/current/

Sept、scrapyCadre crawler

scrapyConcepts et processus

Objectifs d'apprentissage:

  1. Compris. scrapyLe concept de

  2. Compris. scrapyRôle du cadre

  3. Maîtrise scrapyProcessus de fonctionnement du cadre

  4. Maîtrise scrapyRôle de chaque module


1. scrapyLe concept de

ScrapyC'est unPythonCadre de crawler Web Open Source écrit.Il est conçu pour accéder aux données du réseau、Cadre d'extraction des données structurelles.

Scrapy UtiliséTwisted['twɪstɪd]Cadre de réseau asynchrone,Peut accélérer nos téléchargements.

2. scrapyRôle du cadre

Un petit nombre de codes,Pour une prise rapide

3. scrapyFlux de travail pour

Le processus peut être décrit comme suit::

  1. Début du reptileurlTectoniquerequestObjet-->Crawler Middleware-->Moteur-->Scheduler

  2. Poignée du régulateurrequest-->Moteur-->Télécharger le Middleware--->Téléchargeur

  3. Télécharger envoyer la demande,AccèsresponseRéponse---->Télécharger le Middleware---->Moteur--->Crawler Middleware--->Crawler

  4. Extraction des reptilesurlAdresse,Assemblé enrequestObjet---->Crawler Middleware--->Moteur--->Scheduler,Répéter l'étape2

  5. Données d'extraction des Crawlers--->Moteur--->Traitement et conservation des données par Pipeline

Attention!:

  • Le chinois est ajouté pour faciliter la compréhension

  • Représentation de la Ligne verte dans la figure transfert de données

  • Notez l'emplacement de l'intergiciel dans l'illustration,Détermine son rôle

  • Notez la position du moteur.,Tous les modules étaient auparavant indépendants les uns des autres,Interagir uniquement avec le moteur

3.4 scrapyTrois objets intégrés pour

  • requestObjet de la demande:Parurl method post_data headersComposition égale

  • responseObjet de la réponse:Parurl body status headersComposition égale

  • itemObjet de données:L'essence est un dictionnaire

Attention!:

  • L'intergiciel crawler et l'intergiciel Download ne sont que des endroits différents pour exécuter la logique,L'action est répétée:RemplacerUAAttendez.


Résumé

  1. scrapyLe concept de:ScrapyC'est pour accéder aux données du site.,Cadre d'application pour l'extraction de données structurelles

  2. scrapyProcessus opérationnel du cadre et processus de transfert des données:

    1. Début du reptileurlTectoniquerequestObjet-->Crawler Middleware-->Moteur-->Scheduler

    2. Poignée du régulateurrequest-->Moteur-->Télécharger le Middleware--->Téléchargeur

    3. Télécharger envoyer la demande,AccèsresponseRéponse---->Télécharger le Middleware---->Moteur--->Crawler Middleware--->Crawler

    4. Extraction des reptilesurlAdresse,Assemblé enrequestObjet---->Crawler Middleware--->Moteur--->Scheduler,Répéter l'étape2

    5. Données d'extraction des Crawlers--->Moteur--->Traitement et conservation des données par Pipeline

  3. scrapyRôle du cadre:Capture rapide avec un peu de code

  4. MaîtrisescrapyRôle de chaque module: Moteur(engine):Responsable de la transmission des données et des signaux entre les modules sans douleur lombaire Scheduler(scheduler):Mettre en place une file d'attente,Le moteur de stockage l'a envoyé.requestObjet de la demande Téléchargeur(downloader):Envoyé par le moteur d'envoirequestDemande,Obtenir une réponse,Et donne la réponse au moteur Crawler(spider):C'est le moteur de traitement.response,Extraire les données,Extractionurl,Et au moteur Tuyauterie(pipeline):Traitement des données transmises par le moteur,Comme le stockage Télécharger le Middleware(downloader middleware):Extensions de téléchargement personnalisables,Par exemple, configurer un agentip Crawler Middleware(spider middleware):Peut être personnalisérequestDemande et exécutionresponseFiltration,Dupliquer le rôle de l'intergiciel de téléchargement

scrapyPour commencer à utiliser

Objectifs d'apprentissage:

  1. Maîtrise scrapyInstallation

  2. Application CréationscrapyProjets pour

  3. Application CréationscrapyCrawler

  4. Application ExécutionscrapyCrawler

  5. Application scrapyMéthodes de localisation et d'extraction des valeurs de données ou d'attributs

  6. Maîtrise responsePropriétés communes de l'objet de réponse


1 Installationscrapy

Les ordres: sudo apt-get install scrapy Ou: pip/pip3 install scrapy

2 scrapyProcessus d'élaboration du projet

  1. Créer un projet: scrapy startproject mySpider

  2. Générer un crawler: scrapy genspider itcast itcast.cn

  3. Extraire les données: Selon la structure du sitespiderMise en œuvre de la collecte de données

  4. Enregistrer les données: UtiliserpipelineTraitement et enregistrement ultérieurs des données

4. Créer un crawler

Créer un fichier crawler par commande,Les fichiers crawler sont les principaux fichiers de travail de code,Habituellement, les rampes d'un site Web sont écrites dans un fichier crawler.

Les ordres: Exécuter sous le chemin du projet: scrapy genspider <Nom du reptile> <Nom de domaine autorisé à ramper>

Nom du reptile: Comme paramètre d'exécution du crawler Nom de domaine autorisé à ramper: Plage de rampe définie pour les rampes,Utilisé après le réglage pour filtrerurl,Si vous avez rampéurlLes champs qui ne sont pas valides sont filtrés.

Exemple:

   cd myspider
  scrapy genspider itcast itcast.cn

Les résultats des répertoires et des fichiers générés sont les suivants::

5. Perfect crawler

Écrivez l'opération de collecte de données pour le site Web spécifié dans le fichier crawler généré à l'étape précédente,Réalisation de l'extraction des données

5.1 In/myspider/myspider/spiders/itcast.pyModifier comme suit::

import scrapy
​
class ItcastSpider(scrapy.Spider): # Successionscrapy.spider
# Nom du reptile
  name = 'itcast'
  # Plage de rampe admissible
  allowed_domains = ['itcast.cn']
  # J'ai commencé à ramper.urlAdresse
  start_urls = ['http://www.itcast.cn/channel/teacher.shtml']
   
  # Méthodes d'extraction des données,Accepter le téléchargement de l'intergicielresponse
  def parse(self, response):
  # scrapyDeresponseLes objets peuvent être exécutés directementxpath
  names = response.xpath('//div[@class="tea_con"]//li/div/h3/text()')
  print(names)
​
  # Le texte des données spécifiques est obtenu de la manière suivante:
      # Groupe
  li_list = response.xpath('//div[@class="tea_con"]//li')
      for li in li_list:
      # Créer un dictionnaire de données
          item = {}
          # UtilisationscrapyEncapsuléxpathÉlément de positionnement du sélecteur,Et à traversextract()Ouextract_first()Pour obtenir des résultats
          item['name'] = li.xpath('.//h3/text()').extract_first() # Nom du professeur
          item['level'] = li.xpath('.//h4/text()').extract_first() # Niveau de l'enseignant
          item['text'] = li.xpath('.//p/text()').extract_first() # Introduction du professeur
          print(item)

Attention!:

  • scrapy.SpiderDoit être nommé dans la classe crawlerparseAnalyse de

  • Si la hiérarchie de la structure du site est complexe,Vous pouvez également personnaliser d'autres fonctions d'analyse

  • Extrait de la fonction analytiqueurlAdresse si vous souhaitez envoyer une demande,Doit appartenir àallowed_domainsDans le champ d'application,Maisstart_urlsDansurlL'adresse n'est pas soumise à cette restriction,Nous apprendrons plus tard Comment construire une demande d'envoi dans une fonction d'analyse

  • Attention à la position de démarrage lorsque vous démarrez le crawler,Est lancé sous le chemin du projet

  • parse()Utilisé en fonctionyieldRetour des données,Attention!:Dans la fonction analytiqueyieldLes objets qui peuvent être transmis ne peuvent être que:BaseItem, Request, dict, None

5.2 Localiser les éléments et extraire les données、Méthode de la valeur de l'attribut

Analyser et obtenirscrapyDonnées dans le crawler: UtilisationxpathLa chaîne de règles est positionnée et extraite

  1. response.xpathLa méthode renvoie un résultat similairelistType de,Il contient:selectorObjet,Fonctionne comme une liste,Mais il y a d'autres façons

  2. Méthodes supplémentairesextract():Renvoie une liste contenant une chaîne

  3. Méthodes supplémentairesextract_first():Renvoie la première chaîne de la Liste,Liste vide non retournéeNone

5.3 responsePropriétés communes de l'objet de réponse

  • response.url:Réponse actuelleurlAdresse

  • response.request.url:Réponse actuelle à la demande correspondanteurlAdresse

  • response.headers:En - tête de réponse

  • response.requests.headers:En - tête de la demande pour la réponse actuelle

  • response.body:Corps de réponse,C'est - à - direhtmlCode,byteType

  • response.status:Code d'état de réponse

6 Enregistrer les données

Utilisation du pipelinepipelinePour s'en occuper.(Enregistrer)Données

6.1 Inpipelines.pyLes actions sur les données sont définies dans le fichier

  1. Définir une classe de tuyaux

  2. Outrepasser la classe pipeprocess_itemMéthodes

  3. process_itemLa méthode est terminée.itemDoit ensuite être retourné au moteur

import json
​
class ItcastPipeline():
  # Méthode d'extraction des données dans le fichier crawleryieldUne fois.item,Ça va marcher une fois.
  # La méthode est une fonction à nom fixe
  def process_item(self, item, spider):
      print(item)
      return item

6.2 Insettings.pyConfigurer pour activer le pipeline

ITEM_PIPELINES = {
  'myspider.pipelines.ItcastPipeline': 400
}

Classe de tuyauterie utilisée pour la clé dans l'élément de configuration,Utilisation du type de tuyauterie.Diviser,Le premier est le répertoire des projets,Le deuxième est le fichier,Le troisième est la classe de tuyauterie définie. La valeur dans l'élément de configuration est l'ordre d'utilisation du tuyau,Plus la valeur est petite, plus elle est prioritaire.,Cette valeur est généralement définie à1000À l'intérieur.

7. Exécutionscrapy

Les ordres:Exécuter dans le répertoire des projetsscrapy crawl <Nom du reptile>

Exemple:scrapy crawl itcast


Résumé

  1. scrapyInstallation:pip install scrapy

  2. CréationscrapyProjets pour: scrapy startproject myspider

  3. CréationscrapyCrawler:Exécuter dans le répertoire des projets scrapy genspider itcast itcast.cn

  4. ExécutionscrapyCrawler:Exécuter dans le répertoire des projets scrapy crawl itcast

  5. Analyser et obtenirscrapyDonnées dans le crawler:

    1. response.xpathLa méthode renvoie un résultat similairelistType de,Il contient:selectorObjet,Fonctionne comme une liste,Mais il y a d'autres façons

    2. extract() Renvoie une liste contenant une chaîne

    3. extract_first() Renvoie la première chaîne de la Liste,Liste vide non retournéeNone

  6. scrapyUtilisation de base des tuyaux:

    1. Parfait.pipelines.pyDansprocess_itemFonctions

    2. Insettings.pyRéglage moyen allumépipeline

  7. responsePropriétés communes de l'objet de réponse

    1. response.url:Réponse actuelleurlAdresse

    2. response.request.url:Réponse actuelle à la demande correspondanteurlAdresse

    3. response.headers:En - tête de réponse

    4. response.requests.headers:En - tête de la demande pour la réponse actuelle

    5. response.body:Corps de réponse,C'est - à - direhtmlCode,byteType

    6. response.status:Code d'état de réponse

scrapyModélisation des données et demandes

Objectifs d'apprentissage:

  1. Application InscrapyModélisation dans un projet

  2. Application StructureRequestObjet,Et envoyer la demande

  3. Application UtilisationmetaLe paramètre passe les données dans différentes fonctions d'analyse


1. Modélisation des données

En général, dans le cadre d'un projet,Initems.pyPour modéliser les données

1.1 Pourquoi la modélisation

  1. DéfinitionitemC'est - à - dire planifier à l'avance quels champs doivent être saisis,Prévenir les erreurs de mains,Parce qu'après la définition,Pendant le fonctionnement,Le système vérifie automatiquement

  2. Avec les commentaires, vous pouvez clairement savoir quels champs saisir,Les champs non définis ne peuvent pas être saisis,Vous pouvez utiliser un dictionnaire au lieu de

  3. UtiliserscrapyCertains composants spécifiques deItemPour soutenir,Par exemple:scrapyDeImagesPipelineClasse de tuyauterie,Baidu Search pour en savoir plus

1.2 Comment modéliser

Initems.pyLes champs à extraire sont définis dans le fichier:

class MyspiderItem(scrapy.Item):
  name = scrapy.Field()   # Nom de l'instructeur
  title = scrapy.Field() # Titre du conférencier
  desc = scrapy.Field()   # Présentation du conférencier

1.3 Comment utiliser les classes de modèles

La définition de classe de modèle doit être importée plus tard dans le crawler et instantanée,L'utilisation ultérieure est la même que l'utilisation d'un dictionnaire

job.py:

from myspider.items import MyspiderItem   # ImporterItem,Attention au chemin
...
  def parse(self, response)
​
      item = MyspiderItem() # Peut être utilisé directement après l'Instanciation
​
      item['name'] = node.xpath('./h3/text()').extract_first()
      item['title'] = node.xpath('./h4/text()').extract_first()
      item['desc'] = node.xpath('./p/text()').extract_first()
       
      print(item)

Attention!:

  1. from myspider.items import MyspiderItemDans cette ligne de code Attention!itemChemin d'importation correct pour,IgnorerpycharmErreur marquée

  2. pythonImport path key in:Par où commencer,Par où commencer l'importation

1.4 Résumé du processus de développement

  1. Créer un projet scrapy startproject Nom du projet

  2. Des objectifs clairs Initems.pyModélisation dans un fichier

  3. Créer un crawler 3.1 Créer un crawler scrapy genspider Crawler name Domaines autorisés 3.2 Terminer le reptile Modifierstart_urls Vérifier les modificationsallowed_domains Écrivez la méthode d'analyse

  4. Enregistrer les données Inpipelines.pyLes pipelines pour le traitement des données sont définis dans le fichier Insettings.pyEnregistrer dans le fichier activer le pipeline

2. L'idée d'une demande de retournement de page

Que faire pour extraire les données de toutes les pages comme indiqué ci - dessous?

RétrospectiverequestsComment le module met - il en œuvre la demande de retournement de page:

  1. Trouver la page suivanteURLAdresse

  2. Appelezrequests.get(url)

scrapyL'idée de tourner la page:

  1. Trouver la page suivanteurlAdresse

  2. StructureurlObjet de la demande d'adresse,Passer au moteur

3. StructureRequestObjet,Et envoyer la demande

3.1 Méthode de réalisation

  1. C'est sûr.urlAdresse

  2. Demande de construction,scrapy.Request(url,callback)

    • callback:Spécifiez le nom de la fonction de résolution,Indique quelle fonction est utilisée pour analyser la réponse retournée par la demande

  3. Donnez la demande au moteur:yield scrapy.Request(url,callback)

3.2 Netease recrute des reptiles

En accédant aux informations de recrutement sur la page de recrutement de Netease,Apprenez comment réaliser une demande de retournement de page

Analyse des idées:

  1. Obtenir les données de la page d'accueil

  2. Trouver l'adresse de la page suivante,Tourner la page,Obtenir des données

Attention!:

  1. Ça pourrait être danssettingsParamètres intermédiairesROBOTSAccord

# FalseIndique que le site Web est ignorérobots.txtAccord,Par défautTrue
ROBOTSTXT_OBEY = False
  1. Ça pourrait être danssettingsParamètres intermédiairesUser-Agent:

# scrapyPar défaut pour chaque demande envoyéeUAC'est tout ce qui a été mis en placeUser-Agent
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'

3.3 Mise en œuvre du Code

Dans le fichier crawlerparseDans la méthode:

......
# Extrait de la page suivantehref
next_url = response.xpath('//a[contains(text(),">")]/@href').extract_first()
​
# Déterminer si c'est la dernière page
if next_url != 'javascript:void(0)':
​
      # Construction complèteurl
      url = 'https://hr.163.com/position/list.do' + next_url
​
# Structurescrapy.RequestObjet,EtyieldAu moteur.
# UtilisationcallbackLe paramètre spécifie queRequestQuelle fonction est utilisée pour analyser la réponse obtenue après l'objet
  yield scrapy.Request(url, callback=self.parse)
......

3.4 scrapy.RequestPlus de paramètres pour

scrapy.Request(url[,callback,method="GET",headers,body,cookies,meta,dont_filter=False])

Interprétation des paramètres

  1. Les paramètres entre parenthèses sont optionnels

  2. callback:Représente le couranturlQuelle fonction est chargée de traiter la réponse de

  3. meta:Les données d'implémentation sont transmises dans différentes fonctions d'analyse,metaPar défaut avec des données partielles,Comme les retards de téléchargement,Demande de profondeur, etc

  4. dont_filter:Par défautFalse,Les demandes seront filtréesurlAdresse,C'est - à - dire demandéurlL'adresse ne sera plus demandée,Pour les demandes répétéesurlL'adresse peut être réglée àTure,Par exemple, la demande de retournement de page d'un post - bar,Les données de la page changent toujours;start_urlsL'adresse est demandée à plusieurs reprises,Sinon, le programme ne démarrera pas

  5. method:DésignationPOSTOuGETDemande

  6. headers:Recevoir un dictionnaire,Cela ne comprend pascookies

  7. cookies:Recevoir un dictionnaire,Spécialement placé pourcookies

  8. body:RéceptionjsonString,PourPOSTDonnées,Envoyerpayload_postUtiliser sur demande(Le chapitre suivant décritpostDemande)

4. metaUtilisation des paramètres

metaLe rôle de:metaLe transfert de données dans différentes fonctions d'analyse peut être réalisé

Dans le fichier crawlerparseDans la méthode,Extraire la page de détails avant d'ajoutercallbackDésignationparse_detailFonctions:

def parse(self,response):
  ...
  yield scrapy.Request(detail_url, callback=self.parse_detail,meta={"item":item})
...
​
def parse_detail(self,response):
  #Obtenir lesitem
  item = resposne.meta["item"]

Faites attention à

  1. metaLe paramètre est un dictionnaire

  2. metaIl y a une clé fixe dans le Dictionnaireproxy,Représente l'agentip,À propos de proxyipNous utiliseronsscrapyLe téléchargement de l'intergiciel est introduit dans l'apprentissage


Résumé

  1. Parfait et utiliséItemClasse de données:

  2. Initems.pyPerfection des champs à ramper

  3. Importer d'abord dans le fichier crawlerItem

  4. RenforcementItemAprès l'objet,Utiliser directement comme un dictionnaire

  5. StructureRequestObjet,Et envoyer la demande:

  6. Importerscrapy.RequestCatégorie

  7. Extrait de la fonction d'analyseurl

  8. yield scrapy.Request(url, callback=self.parse_detail, meta={})

  9. UtilisationmetaLe paramètre passe les données dans différentes fonctions d'analyse:

  10. Par la fonction d'analyse précédente yield scrapy.Request(url, callback=self.xxx, meta={}) Pour passermeta

  11. Inself.xxxEn fonction response.meta.get('key', '') Ou response.meta['key'] Pour extraire les données transmises


Code de référence

wangyi/spiders/job.py

import scrapy
​
​
class JobSpider(scrapy.Spider):
  name = 'job'
  # 2.Vérifier les noms de domaine autorisés
  allowed_domains = ['163.com']
  # 1 Définir le débuturl
  start_urls = ['https://hr.163.com/position/list.do']
​
  def parse(self, response):
      # Obtenir une liste de tous les noeuds de position
      node_list = response.xpath('//*[@class="position-tb"]/tbody/tr')
      # print(len(node_list))
​
      # Parcourir la liste de tous les noeuds de position
      for num, node in enumerate(node_list):
          # L'index est divisé par la valeur2Prenez le reste comme0C'est le noeud qui contient les données,Dépistage par jugement
          if num % 2 == 0:
              item = {}
​
              item['name'] = node.xpath('./td[1]/a/text()').extract_first()
              item['link'] = node.xpath('./td[1]/a/@href').extract_first()
              item['depart'] = node.xpath('./td[2]/text()').extract_first()
              item['category'] = node.xpath('./td[3]/text()').extract_first()
              item['type'] = node.xpath('./td[4]/text()').extract_first()
              item['address'] = node.xpath('./td[5]/text()').extract_first()
              item['num'] = node.xpath('./td[6]/text()').extract_first().strip()
              item['date'] = node.xpath('./td[7]/text()').extract_first()
              yield item
​
      # Traitement du retournement de page
      # Obtenir un retournement de pageurl
      part_url = response.xpath('//a[contains(text(),">")]/@href').extract_first()
​
      # Déterminer si c'est la dernière page,.Si ce n'est pas la dernière page, retournez la page
      if part_url != 'javascript:void(0)':
          # Splice full Flipurl
          next_url = 'https://hr.163.com/position/list.do' + part_url
​
          yield scrapy.Request(
              url=next_url,
              callback=self.parse
          )

wangyi/items.py

class WangyiItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field()
link = scrapy.Field()
depart = scrapy.Field()
category = scrapy.Field()
type = scrapy.Field()
address = scrapy.Field()
num = scrapy.Field()
date = scrapy.Field()

scrapyConnexion analogique

Objectifs d'apprentissage:

  1. Application Objet de la demandecookiesUtilisation des paramètres

  2. Compris. start_requestsRôle de la fonction

  3. Application Construire et envoyerpostDemande


1. Revoir les méthodes antérieures de simulation des logins

1.1 requestsComment le module implémente - t - il un login analogique?

  1. Transport directcookiesPage de demande

  2. Cherche.urlAdresse,EnvoyerpostDemande de stockagecookie

1.2 seleniumComment simuler un atterrissage?

  1. Trouver la correspondanceinputÉtiquettes,Saisissez le texte et cliquez sur connexion

1.3 scrapyConnexion analogique

  1. Transport directcookies

  2. Cherche.urlAdresse,EnvoyerpostDemande de stockagecookie

2. scrapyTransportcookiesObtenez directement les pages qui nécessitent une connexion

Scénario d'application

  1. cookieLe délai d'expiration est long,Fréquent sur certains sites Web non standard

  2. Oui.cookieObtenez toutes les données avant l'expiration

  3. Utilisation avec d'autres programmes,Comme son utilisationseleniumAprès l'atterrissagecookieObtenir à enregistrer localement,scrapyLire local avant d'envoyer la demandecookie

2.1 Réalisation:RefactoringscrapyDestarte_rquestsMéthodes

scrapyMoyennestart_urlC'est parstart_requestsPour s'occuper de,En fait, le Code de mise en oeuvre est le suivant

# C'est le code source
def start_requests(self):
  cls = self.__class__
  if method_is_overridden(cls, Spider, 'make_requests_from_url'):
      warnings.warn(
          "Spider.make_requests_from_url method is deprecated; it "
          "won't be called in future Scrapy releases. Please "
          "override Spider.start_requests method instead (see %s.%s)." % (
              cls.__module__, cls.__name__
          ),
      )
      for url in self.start_urls:
          yield self.make_requests_from_url(url)
  else:
      for url in self.start_urls:
          yield Request(url, dont_filter=True)

Donc la correspondance,Sistart_urlDans l'adresseurlEst nécessaire pour accéder àurlAdresse,Doit être réécritstart_request.Méthode et ajouter manuellementcookie

2.2 TransportcookiesDébarquementgithub

Numéro de compte d'essai noobpythoner zhoudawei123

import scrapy
import re
​
class Login1Spider(scrapy.Spider):
   name = 'login1'
   allowed_domains = ['github.com']
   start_urls = ['https://github.com/NoobPythoner'] # Il s'agit d'une page à visiter après la connexion
​
   def start_requests(self): # Refactoringstart_requestsMéthodes
       # C'estcookies_strC'est une prise de sac
       cookies_str = '...' # Capture de paquets
       # Oui.cookies_strConvertir encookies_dict
       cookies_dict = {i.split('=')[0]:i.split('=')[1] for i in cookies_str.split('; ')}
       yield scrapy.Request(
           self.start_urls[0],
           callback=self.parse,
           cookies=cookies_dict
      )
​
   def parse(self, response): # Vérifier le succès de la connexion en faisant correspondre le nom d'utilisateur à une expression régulière
       # La correspondance régulière estgithubNom d'utilisateur pour
       result_list = re.findall(r'noobpythoner|NoobPythoner', response.body.decode())
       print(result_list)
       pass

Attention!:

  1. scrapyMoyennecookieNe peut pas être placé surheadersMoyenne,Au moment de la construction de la demande, il y avait uncookiesParamètres,Capable d'accepter la forme du Dictionnairecoookie

  2. InsettingParamètres intermédiairesROBOTSAccord、USER_AGENT

3. scrapy.RequestEnvoyerpostDemande

On sait que ça peut passer parscrapy.Request()Désignationmethod、bodyParamètres pour envoyerpostDemande;Mais en général, on utilisescrapy.FormRequest()Pour envoyerpostDemande

3.1 EnvoyerpostDemande

Attention!:scrapy.FormRequest()Capable d'envoyer des formulaires etajaxDemande

3.1.1 Analyse des idées

  1. TrouverpostDeurlAdresse:Cliquez sur le bouton login pour saisir le paquet,Et ensuite positionnerurlL'adresse est

  2. Trouver la loi du corps demandeur:AnalysepostCorps de la requête demandée,Tous les paramètres inclus dans la réponse précédente

  3. Non connecté avec succès :En demandant une page d'accueil personnelle,Observez si le nom d'utilisateur est inclus

3.1.2 Le Code est implémenté comme suit:

import scrapy
import re
​
class Login2Spider(scrapy.Spider):
  name = 'login2'
  allowed_domains = ['github.com']
  start_urls = ['https://github.com/login']
​
  def parse(self, response):
      authenticity_token = response.xpath("//input[@name='authenticity_token']/@value").extract_first()
      utf8 = response.xpath("//input[@name='utf8']/@value").extract_first()
      commit = response.xpath("//input[@name='commit']/@value").extract_first()
       
      #StructurePOSTDemande,Passer au moteur
      yield scrapy.FormRequest(
          "https://github.com/session",
          formdata={
              "authenticity_token":authenticity_token,
              "utf8":utf8,
              "commit":commit,
              "login":"noobpythoner",
              "password":"***"
          },
          callback=self.parse_login
      )
​
  def parse_login(self,response):
      ret = re.findall(r"noobpythoner|NoobPythoner",response.text)
      print(ret)

Petit conseil

Insettings.pyRéglage de passage moyenCOOKIES_DEBUG=TRUE Capable de voir au terminalcookieProcessus de transfert pour


Résumé

  1. start_urlsDansurlL'adresse est donnée àstart_requestTraitement,Si nécessaire,Peut être réécritstart_requestFonctions

  2. Transport directcookieDébarquement:cookieNe peut être transmis qu'àcookiesRéception des paramètres

  3. scrapy.Request()EnvoyerpostDemande

scrapyUtilisation de tuyaux

Objectifs d'apprentissage:

  1. Maîtrise scrapyTuyauterie(pipelines.py)Utilisation de


Avant, nous étionsscrapyL'utilisation de base des tuyaux est étudiée dans la section Introduction à l'utilisation,Ensuite, nous étudions en profondeurscrapyUtilisation de tuyaux

1. pipelineMéthodes couramment utilisées dans:

  1. process_item(self,item,spider):

    • Fonctions obligatoires dans la classe pipe

    • Paire de mise en œuvreitemTraitement des données

    • Il fautreturn item

  2. open_spider(self, spider): Effectuer une seule fois lorsque le crawler est allumé

  3. close_spider(self, spider): Effectuer une seule fois lorsque le crawler est éteint

2. Modification des fichiers de tuyauterie

Continuer à améliorerwangyiCrawler,Inpipelines.pyParfait dans le Code

import json
from pymongo import MongoClient
​
class WangyiFilePipeline(object):
  def open_spider(self, spider): # Effectuer une seule fois lorsque le crawler est allumé
      if spider.name == 'itcast':
          self.f = open('json.txt', 'a', encoding='utf-8')
​
  def close_spider(self, spider): # Effectuer une seule fois lorsque le crawler est éteint
      if spider.name == 'itcast':
          self.f.close()
​
  def process_item(self, item, spider):
      if spider.name == 'itcast':
          self.f.write(json.dumps(dict(item), ensure_ascii=False, indent=2) + ',\n')
      # - Non.returnDans le cas de,L'autre est moins pondérépipelineN'obtiendra pasitem
      return item  
​
class WangyiMongoPipeline(object):
  def open_spider(self, spider): # Effectuer une seule fois lorsque le crawler est allumé
      if spider.name == 'itcast':
      # Peut également être utiliséisinstancFonction pour distinguer les reptiles:
          con = MongoClient(host='127.0.0.1', port=27017) # Instanciationmongoclient
          self.collection = con.itcast.teachers # Créer une base de données nomméeitcast,Collection nameteachersOpérande de collection pour
​
  def process_item(self, item, spider):
      if spider.name == 'itcast':
          self.collection.insert(item)
          # En ce momentitemL'objet doit être un dictionnaire,Insérer à nouveau
          # Siitem- Oui.BaseItemDoit d'abord être converti en dictionnaire:dict(BaseItem)
      # - Non.returnDans le cas de,L'autre est moins pondérépipelineN'obtiendra pasitem
      return item  

3. Ouvrir le tuyau

Insettings.pySet onpipeline

......
ITEM_PIPELINES = {
  'myspider.pipelines.ItcastFilePipeline': 400, # 400Poids de représentation
  'myspider.pipelines.ItcastMongoPipeline': 500, # Plus le poids est faible,Plus la priorité est accordée à la mise en œuvre!
}
......

N'oublie pas de l'ouvrir.mongodbBase de données sudo service mongodb start Et dansmongodbAffichage dans la base de données mongo

Penser:InsettingsPeut ouvrir plusieurs tuyaux,Pourquoi ouvrir plusieurs?

  1. DifférentpipelinePeut traiter les données de différents reptiles,Adoptionspider.nameAttributs pour distinguer

  2. DifférentpipelineOpérations permettant un traitement différent des données pour un ou plusieurs reptiles,Comme le nettoyage des données,Un pour enregistrer les données

  3. La même classe de pipeline peut également traiter les données de différents reptiles,Adoptionspider.nameAttributs pour distinguer

4. pipelineAttention à l'utilisation

  1. Doit être utilisé avantsettingsOuverture moyenne

  2. pipelineInsettingLa clé centrale indique la position(C'est - à - dire:pipelineL'emplacement dans le projet peut être personnalisé),La valeur indique la distance par rapport au moteur,Plus les données sont rapprochées, plus elles passent en premier.:Exécution prioritaire avec un faible poids

  3. Il y en a plusieurs.pipelineQuand,process_itemLa méthode doit êtrereturn item,Sinon, le dernierpipelineLes données obtenues sont:NoneValeur

  4. pipelineMoyenneprocess_itemIl doit y avoir,SinonitemIl n'y a aucun moyen de l'accepter et de l'éliminer.

  5. process_itemAcceptation de la méthodeitemEtspider,Parmi euxspiderReprésente la livraison actuelleitemViens ici.spider

  6. open_spider(spider) :Peut être exécuté une fois que le crawler est allumé

  7. close_spider(spider) :Peut être exécuté une fois que le crawler est éteint

  8. Les deux méthodes ci - dessus sont souvent utilisées pour l'interaction entre les rampes et les bases de données.,Établir une connexion à la base de données lorsque le crawler est allumé,Déconnecter de la base de données lorsque le crawler est éteint


Résumé

  • Le pipeline permet le nettoyage et le stockage des données,Capacité de définir plusieurs pipelines pour différentes fonctions,Il y a trois façons

    • process_item(self,item,spider):Paire de mise en œuvreitemTraitement des données

    • open_spider(self, spider): Effectuer une seule fois lorsque le crawler est allumé

    • close_spider(self, spider): Effectuer une seule fois lorsque le crawler est éteint

scrapyUtilisation des intergiciels

Objectifs d'apprentissage:

  1. Application scrapyUtilisation de pièces intermédiaires aléatoiresUAMéthode

  2. Application scrapyUtilisation de proxyipLa méthode de

  3. Application scrapyAvecseleniumEn association avec


1. scrapyClassification et rôle des intergiciels

1.1 scrapyClassification des intergiciels

SelonscrapyLes différents emplacements dans le processus d'exécution sont divisés en:

  1. Télécharger le Middleware

  2. Crawler Middleware

1.2 scrapyLe rôle du milieu:PrétraitementrequestEtresponseObjet

  1. C'est exact.headerEtcookieRemplacement et élimination

  2. Utiliser un mandataireipAttendez.

  3. Personnaliser la demande,

Mais dansscrapyPar défaut Les deux intergiciels sontmiddlewares.pyDans un fichier

L'intergiciel crawler est utilisé de la même façon que l'intergiciel de téléchargement,Et la fonction est répétée,En général, l'intergiciel de téléchargement est utilisé

2. Télécharger l'utilisation de l'intergiciel:

Ensuite, nous modifions et perfectionnons Tencent Recruitment crawler,Apprenez comment utiliser l'intergiciel en téléchargeant l'intergiciel Écrivez unDownloader MiddlewaresEt nous écrire unpipelineC'est pareil,Définir une classe,Et aprèssettingOuverture moyenne

Downloader MiddlewaresMéthode par défaut:

  • process_request(self, request, spider):

    1. Quand chaquerequestEn téléchargeant l'intergiciel,La méthode est appelée.

      1. RetourNoneValeur:Non.returnRetour aussiNone,LerequestObjet transmis au téléchargeur,Ou passer par le moteur à d'autresprocess_requestMéthodes

      2. RetourResponseObjet:Ne demande plus,Prends ça.responseRetour au moteur

      3. RetourRequestObjet:Prends ça.requestL'objet est livré à l'ordonnanceur par le moteur,Pour le moment, il ne passera pas par d'autresprocess_requestMéthodes

  • process_response(self, request, response, spider):

    1. Quand le téléchargeur sera terminéhttpDemande,Appelé lorsque la réponse est passée au moteur

      1. RetourResposne:Livré par le moteur à crawler ou à d'autres intergiciels de téléchargement moins lourdsprocess_responseMéthodes

      2. RetourRequestObjet:Passez le moteur à l'appelant pour continuer la demande,Pour le moment, il ne passera pas par d'autresprocess_requestMéthodes

  • Insettings.pyConfiguration de l'intergiciel d'ouverture,Plus le poids est faible, plus la priorité est accordée à l'exécution

3. Définir la mise en œuvre aléatoireUser-AgentMiddleware de téléchargement pour

3.1 Inmiddlewares.pyCode de perfection moyen

import random
from Tencent.settings import USER_AGENTS_LIST # Notez le chemin d'importation,Veuillez ignorerpycharmConseils d'erreur pour
​
class UserAgentMiddleware(object):
  def process_request(self, request, spider):
      user_agent = random.choice(USER_AGENTS_LIST)
      request.headers['User-Agent'] = user_agent
      # Non.return
​
class CheckUA:
  def process_response(self,request,response,spider):
      print(request.headers['User-Agent'])
      return response # Pas moins.!

3.2 InsettingsParamètres pour activer le téléchargement personnalisé de l'intergiciel,La méthode de réglage est la même que celle du pipeline

DOWNLOADER_MIDDLEWARES = {
  'Tencent.middlewares.UserAgentMiddleware': 543, # 543Est la valeur du poids
  'Tencent.middlewares.CheckUA': 600, # Exécution en premier543Middleware of weights,Re - exécution600Middleware for
}

3.3 InsettingsAjouterUAListe de

USER_AGENTS_LIST = [
  "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
  "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
  "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
  "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
  "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
  "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
  "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
  "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5"
]

Observation des reptiles

4. AgentsipUtilisation de

4.1 Analyse des idées

  1. Emplacement ajouté par l'agent:request.metaAjouterproxyChamp

  2. Obtenir un agentip,Assigner une valeur àrequest.meta['proxy']

    • Sélection aléatoire des agents dans le pool d'agentsip

    • AgentsipDewebapiEnvoyer une demande pour obtenir un agentip

4.2 Réalisation concrète

Agence gratuiteip:

class ProxyMiddleware(object):
  def process_request(self,request,spider):
      # proxiesÇa pourrait être danssettings.pyMoyenne,Peut également provenir d'un agentipDewebapi
      # proxy = random.choice(proxies)
​
      # La gratuité sera invalidée,Le journal 111 connection refused Information!Retrouver un agentipEssaie encore.
      proxy = 'https://1.71.188.37:3128'
​
      request.meta['proxy'] = proxy
      return None # Peut ne pas écrirereturn

Agent de facturationip:

# Code du joueur RMB(UtiliserabuyunAgent fourniip)
import base64
​
# Informations de validation du tunnel de l'agent Ceci a été demandé sur ce site
proxyServer = 'http://proxy.abuyun.com:9010' # Agent payantipAdresse du serveur,Ici.abuyun
proxyUser = Nom d'utilisateur
proxyPass = Mot de passe
proxyAuth = "Basic " + base64.b64encode(proxyUser + ":" + proxyPass)
​
class ProxyMiddleware(object):
  def process_request(self, request, spider):
      # Définir l'agent
      request.meta["proxy"] = proxyServer
      # Mise en place de la certification
      request.headers["Proxy-Authorization"] = proxyAuth

4.3 Agent de détectionipDisponible ou non

En utilisant un agentipVous pouvez télécharger l'intergicielprocess_response()Traitement des agents dans la méthodeipUtilisation de,Si l'agentipImpossible d'utiliser pour remplacer d'autres agentsip

class ProxyMiddleware(object):
  ......
  def process_response(self, request, response, spider):
      if response.status != '200':
          request.dont_filter = True # L'objet de requête retransmis peut être redirigé dans la file d'attente
          return requst

Insettings.pyOuvrez cet intergiciel

5. Utilisation dans les intergicielsselenium

PargithubExemple de connexion

5.1 Code crawler complet

import scrapy
​
class Login4Spider(scrapy.Spider):
  name = 'login4'
  allowed_domains = ['github.com']
  start_urls = ['https://github.com/1596930226'] # Directement à la validationurlEnvoyer la demande
​
  def parse(self, response):
      with open('check.html', 'w') as f:
          f.write(response.body.decode())

5.2 Inmiddlewares.pyUtilisé dansselenium

import time
from selenium import webdriver
​
​
def getCookies():
  # UtiliserseleniumConnexion analogique,Obtenir et retournercookie
  username = input('EntréegithubNuméro de compte:')
  password = input('EntréegithubMot de passe:')
  options = webdriver.ChromeOptions()
  options.add_argument('--headless')
  options.add_argument('--disable-gpu')
  driver = webdriver.Chrome('/home/worker/Desktop/driver/chromedriver',
                            chrome_options=options)
  driver.get('https://github.com/login')
  time.sleep(1)
  driver.find_element_by_xpath('//*[@id="login_field"]').send_keys(username)
  time.sleep(1)
  driver.find_element_by_xpath('//*[@id="password"]').send_keys(password)
  time.sleep(1)
  driver.find_element_by_xpath('//*[@id="login"]/form/div[3]/input[3]').click()
  time.sleep(2)
  cookies_dict = {cookie['name']: cookie['value'] for cookie in driver.get_cookies()}
  driver.quit()
  return cookies_dict
​
class LoginDownloaderMiddleware(object):
​
  def process_request(self, request, spider):
      cookies_dict = getCookies()
      print(cookies_dict)
      request.cookies = cookies_dict # Pour l'objet demandécookiesPropriétés à remplacer

Après l'ouverture de l'intergiciel dans le fichier de configuration,Exécuter le crawler peut être vu dans les informations du JournalseleniumContenu connexe


Résumé

Utilisation des intergiciels:

  1. Améliorer le Code des intergiciels:

  • process_request(self, request, spider):

    1. Quand chaquerequestEn téléchargeant l'intergiciel,La méthode est appelée.

    2. RetourNoneValeur:Non.returnRetour aussiNone,LerequestObjet transmis au téléchargeur,Ou passer par le moteur à d'autresprocess_requestMéthodes

    3. RetourResponseObjet:Ne demande plus,Prends ça.responseRetour au moteur

    4. RetourRequestObjet:Prends ça.requestL'objet est livré à l'ordonnanceur par le moteur,Pour le moment, il ne passera pas par d'autresprocess_requestMéthodes

  • process_response(self, request, response, spider):

    1. Quand le téléchargeur sera terminéhttpDemande,Appelé lorsque la réponse est passée au moteur

    2. RetourResposne:Livré par le moteur à crawler ou à d'autres intergiciels de téléchargement moins lourdsprocess_responseMéthodes

    3. RetourRequestObjet:Passez le moteur à l'appelant pour continuer la demande,Pour le moment, il ne passera pas par d'autresprocess_requestMéthodes

  1. Besoin desettings.pyMiddleware open in DOWNLOADER_MIDDLEWARES = { 'myspider.middlewares.UserAgentMiddleware': 543, }

scrapy_redisConcepts rôles et processus

Objectifs d'apprentissage

  1. Compris. Concept et caractéristiques de la distribution

  2. Compris. scarpy_redisLe concept de

  3. Compris. scrapy_redisLe rôle de

  4. Compris. scrapy_redisFlux de travail pour


À l'avant.scrapyDans le cadre, nous avons été en mesure d'utiliser le cadre pour permettre aux Crawlers d'accéder aux données du site,Si les données du site actuel sont plus volumineuses, Nous devons utiliser la distribution pour accéder plus rapidement aux données

1. Qu'est - ce que la distribution

En termes simples La distribution est un noeud différent(Serveur,ipC'est différent.)Travailler ensemble pour accomplir une tâche

2. scrapy_redisLe concept de

scrapy_redis- Oui.scrapyBase du cadreredisComposants distribués pour

3. scrapy_redisLe rôle de

Scrapy_redisInscrapySur la base de,Fonctions plus puissantes,Cela se reflète dans:

Ceci est réalisé par la persistance des files d'attente de requêtes et des collections d'empreintes digitales demandées:

  • Rampe intermittente

  • Capture rapide distribuée

4. scrapy_redisFlux de travail pour

Penser:Alors,Sur cette base,Si la distribution est nécessaire,C'est - à - dire que plus d'un serveur complète un crawler en même temps,Qu'est - ce qu'il faut faire?

4.2 scrapy_redisProcessus

  • Inscrapy_redisMoyenne,Tous lesrequestObjet et poidsrequestLes empreintes digitales de l'objet sont communes à tous les serveursredisMoyenne

  • De tous les serveursscrapyLe processus partage le mêmeredisDansrequestFile d'attente des objets

  • Tous lesrequestObjet stocké dansredisAvant,Tout va passerredisDansrequestUne collection d'empreintes digitales pour juger,Avez - vous déjà déposé

  • Par défaut, toutes les données sont sauvegardées dansredisMoyenne


Résumé

scarpy_redisComment fonctionne la distribution

  • Inscrapy_redisMoyenne,Tous les objets à saisir et les empreintes digitales dépouillées sont communsredisMoyenne

  • Tous les serveurs partagent le mêmeredisFile d'attente de l'objet de requête dans

  • Tous lesrequestObjet stocké dansredisAvant, Est jugé par l'empreinte digitale de l'objet demandé ,Avez - vous déjà déposé


scrapy_redisAnalyse de principe et réalisation de l'escalade intermittente et de l'escalade distribuée

Objectifs d'apprentissage

  1. Compris. scrapyRéaliser le principe de l'élimination du poids

  2. Compris. scrapyConditions d'admission dans l'équipe

  3. Maîtrise scrapy_redisBasé sururlIncremental Single crawler for address

  4. Maîtrise scrapy_redisDistributed crawler


1. TéléchargergithubDedemoCode

  1. clone github scrapy-redisFichier source

    git clone https://github.com/rolando/scrapy-redis.git

  2. Le projet de recherche lui - mêmedemo

    mv scrapy-redis/example-project ~/scrapyredis-project

2. ObservationdmozDocumentation

IndomzDans le fichier crawler,La mise en œuvre est comme avantcrawlspiderType de reptile

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
​
​
class DmozSpider(CrawlSpider):
  """Follow categories and extract links."""
  name = 'dmoz'
  allowed_domains = ['dmoztools.net']
  start_urls = ['http://dmoztools.net/'] # Modifié iciurl
   
  # Définir les règles d'extraction des données,UtilisécssSélecteur
  rules = [
      Rule(LinkExtractor(
          restrict_css=('.top-cat', '.sub-cat', '.cat-item')
      ), callback='parse_directory', follow=True),
  ]
​
  def parse_directory(self, response):
      for div in response.css('.title-and-desc'):
          yield {
              'name': div.css('.site-title::text').extract_first(),
              'description': div.css('.site-descr::text').extract_first().strip(),
              'link': div.css('a::attr(href)').extract_first(),
          }
​

Mais danssettings.pyIl y a plus de,Ces lignes indiquentscrapy_redisUne classe qui a été re - implémentée dans,Et le régulateur,Et utiliserRedisPipelineClasse de tuyauterie

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
​
ITEM_PIPELINES = {
  'example.pipelines.ExamplePipeline': 300,
  'scrapy_redis.pipelines.RedisPipeline': 400,
}

3. ExécutiondmozCrawler,Phénomènes observés

  1. Nous devons d'abord ajouterredisAdresse,Pour que le programme puisse être utiliséredis

REDIS_URL = "redis://127.0.0.1:6379"
#Ou utilisez la méthode suivante
# REDIS_HOST = "127.0.0.1"
# REDIS_PORT = 6379
  1. Nous appliquonsdomzDes reptiles,On verra.redisTrois touches de plus:

  1. Exécuter à nouveau après avoir interrompu le processusdmozCrawler

Poursuivre la procédure,Vous constaterez que le programme continue sur la base de l'exécution précédente,Alors...domzLe crawler est basé sururlLe crawler incrémental de l'adresse

4. scrapy_redisAnalyse des principes de

Desettings.pyTrois configurations pour l'analyse Respectivement.:

  • RedisPipeline # Classe de tuyauterie

  • RFPDupeFilter # Les empreintes digitales sont déclassées

  • Scheduler # Classe d'ordonnanceur

  • SCHEDULER_PERSIST # Si la file d'attente des demandes et la collection d'empreintes digitales sont persistantes

4.1 Scrapy_redisDeRedisPipeline

RedisPipelineMoyenne observationprocess_item,Enregistrer les données,DéposéredisMoyenne

4.2 Scrapy_redisDeRFPDupeFilter

RFPDupeFilter C'est vrairequestChiffrement de l'objet

4.3 Scrapy_redisDeScheduler

scrapy_redisL'implémentation de l'ordonnanceur détermine quandrequestL'objet rejoint la file d'attente avec la capture,En même temps, j'ai demandérequestObjet filtré

4.4 On peut donc conclure querequestConditions d'entrée de l'objet dans l'équipe

  • requestL'empreinte n'est pas dans la collection

  • requestDedont_filterPourTrue,C'est - à - dire ne pas filtrer

    • start_urlsDansurlL'adresse sera dans l'équipe,Parce qu'ils ne filtrent pas par défaut

4.5 Réalisation d'un point d'arrêt unique et d'une montée continue

Réécrire Netease Recruitment crawler,Le crawler est un classique basé sururlLe crawler incrémental de l'adresse

5. Implémenter des rampes distribuées

5.1 AnalysedemoCode moyen

Ouvre.example-projectDans le projetmyspider_redis.pyDocumentation

En observant le Code:

  1. Hériter du parent estRedisSpider

  2. Unredis_keyLa clé de,Non.start_urls,Parce que dans la distribution,Si chaque ordinateur demande une foisstart_urlEt ça se répète

  3. Beaucoup.__init__Méthodes,Cette méthode n'est pas nécessaire,Peut être spécifié manuellementallow_domains

  4. Méthode de démarrage:

    1. Exécuter dans le répertoire correct pour chaque noeudscrapy crawl Crawler name,Faire ce noeudscrapy_redisCrawler en place

    2. En communredisMoyenne lpush redis_key 'start_url',Pour que tous les noeuds commencent vraiment à fonctionner

  5. settings.pyConfiguration critique dans

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
​
ITEM_PIPELINES = {
  'example.pipelines.ExamplePipeline': 300,
  'scrapy_redis.pipelines.RedisPipeline': 400,
}
REDIS_URL = "redis://127.0.0.1:6379"

5.2 Mise en place d'un crawler distribué

RéécrituretencentLe crawler est distribué

Attention!:Changement de mode de démarrage


Résumé

  1. scrapy_redisLa signification et la fonction réalisable de

    1. scrapyC'est le cadre

    2. scrapy_redis- Oui.scrapyComposants de

    3. scrapy_redisCapable de réaliser des rampes intermittentes et distribuées

  2. scrapy_redisProcessus et principes de mise en oeuvre

    1. InscrapySur la base du processus - cadre,StockagerequestL'objet est placé dansredisDans une collection ordonnée de,La file d'attente des demandes est implémentée avec cette collection ordonnée

    2. Et oui.requestObjet générer des empreintes digitales objet,Aussi stocké dans le mêmeredisDans la collection,UtilisationrequestLes empreintes digitales évitent d'envoyer des demandes en double

  3. requestConditions d'entrée de l'objet dans la file d'attente

    1. requestL'empreinte n'est pas dans la collection

    2. requestDedont_filterPourTrue,C'est - à - dire ne pas filtrer

  4. requestLa réalisation des empreintes digitales

    • Méthode de demande

    • Adresse de la demande triée

    • Corps de requête trié et traité ou chaîne vide

    • Avechashlib.sha1()Chiffrer ce qui précède

  5. scarpy_redisImplémenter incrémental crawler、Crawler en tissu

    1. C'est exact.settingEffectuer les réglages suivants:

      • DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

      • SCHEDULER = "scrapy_redis.scheduler.Scheduler"

      • SCHEDULER_PERSIST = True

      • ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline': 400,}

      • REDIS_URL = "redis://127.0.0.1:6379" # Veuillez configurer correctementREDIS_URL

    2. L'héritage de la classe crawler dans le fichier crawlerRedisSpiderCatégorie

    3. Dans les reptilesredis_keyRemplacéstart_urls

    4. Différents modes de démarrage

      • Adoptionscrapy crawl spiderAprès le démarrage du crawler,Versredis_keyPlacer un ou plusieurs points de départurl(lpushOurpushTout va bien.),Pour quescrapy_redisOpération crawler

    5. En plus des différences ci - dessus,scrapy_redisCrawler etscrapyLes reptiles sont utilisés de la même façon


scrapy_splashUtilisation des composants

Objectifs d'apprentissage

  1. Compris. scrapy_splashLe rôle des composants

  2. Compris. scrapy_splashUtilisation des composants


1. Qu'est - ce quescrapy_splash?

scrapy_splash- Oui.scrapyUn composant de

  • scrapy-splashChargementjsLes données sont basées surSplashPour y arriver..

  • SplashC'est unJavascriptServices de rendu.C'est une réalisationHTTP APINavigateur léger pour,SplashC'est avecPythonEtLuaMise en œuvre linguistique,Basé surTwistedEtQTAttendre la construction du module.

  • Utiliserscrapy-splashEt finalementresponseC'est comme ça qu'une fois que le navigateur a rendu tout le code source de la page web.

splashDocuments officiels Splash - A javascript rendering service — Splash 3.5 documentation

2. scrapy_splashLe rôle de

scrapy-splashCapacité de simuler le chargement du navigateurjs,Et revenir àjsDonnées après exécution

3. scrapy_splashInstallation environnementale pour

3.1 UtilisersplashDedockerMiroir

splashDedockerfile https://github.com/scrapinghub/splash/blob/master/Dockerfile

ObservationssplashL'environnement de dépendance est un peu compliqué,Pour qu'on puisse l'utiliser directementsplashDedockerMiroir

Si non utilisédockerMiroir voir splashDocuments officiels Installer l'environnement de dépendance approprié

3.1.1 Installer et démarrerdockerServices

3.1.2 AccèssplashMiroir de

Dans une installation correctedockerSur la base depullPrends - le.splashMiroir de

sudo docker pull scrapinghub/splash

3.1.3 Vérifier que l'installation a été réussie

ExécutionsplashDedockerServices,Et accédez à8050Port vérifier si l'installation a réussi

  • La réception tourne sudo docker run -p 8050:8050 scrapinghub/splash

  • En coulisses sudo docker run -d -p 8050:8050 scrapinghub/splash

Accès à http://127.0.0.1:8050 Voir la capture d'écran suivante pour le succès

3.1.4 Résoudre le délai d'obtention du miroir:ModifierdockerSource miroir pour

Parubuntu18.04Par exemple

  1. Créer et modifierdockerProfil pour

sudo vi /etc/docker/daemon.json

  1. Écrit à la maisondocker-cn.comEnregistrer la sortie après la configuration de l'adresse miroir pour

{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
  1. Redémarrer l'ordinateur oudockerRécupérer après le servicesplashMiroir

  2. Si c'est encore lent,Veuillez utiliser le Hotspot mobile(Fluxorz)

3.1.5 FermersplashServices

Vous devez fermer le contenant avant,Supprimer à nouveau le conteneur

sudo docker ps -a
sudo docker stop CONTAINER_ID
sudo docker rm CONTAINER_ID

3.2 InpythonInstallation dans un environnement virtuelscrapy-splashSac

pip install scrapy-splash

4. InscrapyUtilisé danssplash

ParbaiduPar exemple

4.1 Créer un projet créer un crawler

scrapy startproject test_splash
cd test_splash
scrapy genspider no_splash baidu.com
scrapy genspider with_splash baidu.com

4.2 Parfait.settings.pyProfil

Insettings.pyAjouter au fichiersplashConfiguration et modification derobotsAccord

# Pour le Service de renduurl
SPLASH_URL = 'http://127.0.0.1:8050'
# Télécharger l'intergiciel
DOWNLOADER_MIDDLEWARES = {
  'scrapy_splash.SplashCookiesMiddleware': 723,
  'scrapy_splash.SplashMiddleware': 725,
  'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
# Filtre à filtre
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
# UtiliserSplashDeHttpCache
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
​
# Obey robots.txt rules
ROBOTSTXT_OBEY = False

4.3 Non utilisésplash

Inspiders/no_splash.pyAmélioration moyenne

import scrapy
​
​
class NoSplashSpider(scrapy.Spider):
  name = 'no_splash'
  allowed_domains = ['baidu.com']
  start_urls = ['https://www.baidu.com/s?wd=13161933309']
​
  def parse(self, response):
      with open('no_splash.html', 'w') as f:
          f.write(response.body.decode())

4.4 Utilisersplash

import scrapy
from scrapy_splash import SplashRequest # Utiliserscrapy_splashFourni par le paquetrequestObjet
​
class WithSplashSpider(scrapy.Spider):
  name = 'with_splash'
  allowed_domains = ['baidu.com']
  start_urls = ['https://www.baidu.com/s?wd=13161933309']
​
  def start_requests(self):
      yield SplashRequest(self.start_urls[0],
                          callback=self.parse_splash,
                          args={'wait': 10}, # Temps d'arrêt maximal,Unité:Secondes
                          endpoint='render.html') # UtilisersplashParamètres fixes pour le service
​
  def parse_splash(self, response):
      with open('with_splash.html', 'w') as f:
          f.write(response.body.decode())
​

4.5 Deux rampants chacun,Et observer le phénomène

4.5.1 Deux rampants chacun

scrapy crawl no_splash
scrapy crawl with_splash

4.6 Conclusions

  1. splashSimilaireselenium,Capable d'accéder à l'objet demandé comme un navigateururlAdresse

  2. Capable de suivre ceurlLe contenu de la réponse correspondante envoie la demande à tour de rôle

  3. Et rendre le contenu de la réponse multiple correspondant à la demande multiple

  4. Retour final au renduresponseObjet de la réponse


Résumé

  1. scrapy_splashLe rôle des composants

    1. splashSimilaireselenium,Capable d'accéder à l'objet demandé comme un navigateururlAdresse

    2. Capable de suivre ceurlLe contenu de la réponse correspondante envoie la demande à tour de rôle

    3. Et rendre le contenu de la réponse multiple correspondant à la demande multiple

    4. Retour final au renduresponseObjet de la réponse

  2. scrapy_splashUtilisation des composants

    1. BesoinsplashLe service comme support

    2. ConstruitrequestL'objet devientsplash.SplashRequest

    3. Utilisé sous la forme d'un intergiciel de téléchargement

    4. Besoinscrapy_splashConfiguration spécifique

  3. scrapy_splashConfiguration spécifique pour

    SPLASH_URL = 'http://127.0.0.1:8050'
    DOWNLOADER_MIDDLEWARES = {
      'scrapy_splash.SplashCookiesMiddleware': 723,
      'scrapy_splash.SplashMiddleware': 725,
      'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
    }
    DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
    HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

scrapyInformations et configuration du journal pour

Objectifs d'apprentissage:

  1. Compris. scrapyInformations sur le journal de bord pour

  2. Maîtrise scrapyConfiguration commune pour

  3. Maîtrise scrapy_redisConfiguration

  4. Compris.scrapy_splashConfiguration

  5. Compris.scrapy_redisEtscrapy_splashConfiguration à utiliser avec


1. Compris.scrapyInformations sur le journal de bord pour

2. scrapyConfiguration commune pour

  • ROBOTSTXT_OBEY Conformité ou nonrobotsAccord,Par défaut est conforme

    • À propos derobotsAccord

      1. Dans la recherche de Baidu,Impossible de rechercher la page de détails d'un article spécifique sur Taobao,C'est ça.robotsLe Protocole fonctionne

      2. RobotsAccord:Le site estRobotsLe Protocole indique aux moteurs de recherche quelles pages peuvent être récupérées,Quelles pages ne peuvent pas être récupérées,Mais ce n'est qu'un accord général sur Internet

      3. Par exemple:TaobaorobotsAccord

  • USER_AGENT Paramètresua

  • DEFAULT_REQUEST_HEADERS Définir l'en - tête de requête par défaut,C'est ici queUSER_AGENTÇa ne marchera pas

  • ITEM_PIPELINES Tuyauterie,Position gauche poids droit:Plus le poids est faible,Plus la priorité est accordée à la mise en œuvre

  • SPIDER_MIDDLEWARES Crawler Middleware,Le processus de réglage est le même que pour les tuyaux

  • DOWNLOADER_MIDDLEWARES Télécharger le Middleware

  • COOKIES_ENABLED Par défautTrueIndique l'ouverturecookieFonction de transfert,C'est - à - dire que chaque demande porte la dernièrecookie,Faites - le rester

  • COOKIES_DEBUG Par défautFalseIndique quecookieLe processus de transmission de

  • LOG_LEVEL Par défautDEBUG,Niveau du Journal de contrôle

    • LOG_LEVEL = "WARNING"

  • LOG_FILE ParamètreslogChemin d'enregistrement du fichier journal,Si vous définissez ce paramètre,Les informations du Journal seront écrites dans le fichier,Le terminal n'affichera plus,Et être soumis àLOG_LEVELLimites du niveau de journalisation

    • LOG_FILE = "./test.log"

3. scrapy_redisConfiguration

  • DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # Génération d'empreintes digitales et déclassement

  • SCHEDULER = "scrapy_redis.scheduler.Scheduler" # Classe d'ordonnanceur

  • SCHEDULER_PERSIST = True # File d'attente des demandes de persistance et collection d'empreintes digitales

  • ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline': 400} # Les données sont stockées dansredisLe tuyau de

  • REDIS_URL = "redis://host:port" # redisDeurl

4. scrapy_splashConfiguration

SPLASH_URL = 'http://127.0.0.1:8050'
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

5. scrapy_redisEtscrapy_splashConfiguration à utiliser avec

5.1 Principes

  • scrapy-redisConfiguré dans”DUPEFILTER_CLASS” : “scrapy_redis.dupefilter.RFPDupeFilter”,Avecscrapy-splashConfiguréDUPEFILTER_CLASS = ‘scrapy_splash.SplashAwareDupeFilter’ Conflit!

  • J'ai regardéscrapy_splash.SplashAwareDupeFilterAprès le code source,Découvrez qu'il a héritéscrapy.dupefilter.RFPDupeFilter,Réécritrequest_fingerprint()Méthodes.

  • Comparaisonscrapy.dupefilter.RFPDupeFilterEtscrapy_redis.dupefilter.RFPDupeFilterDansrequest_fingerprint()Après la méthode,La découverte est la même,C'est pour ça queSplashAwareDupeFilter,Successionscrapy_redis.dupefilter.RFPDupeFilter,Les autres codes restent inchangés.

5.2 RéécrituredupefilterDéclassement,Et danssettings.pyUtilisé dans

5.2.1 Réécrire pour réécrire

from __future__ import absolute_import
​
from copy import deepcopy
​
from scrapy.utils.request import request_fingerprint
from scrapy.utils.url import canonicalize_url
​
from scrapy_splash.utils import dict_hash
​
from scrapy_redis.dupefilter import RFPDupeFilter
​
​
def splash_request_fingerprint(request, include_headers=None):
  """ Request fingerprint which takes 'splash' meta key into account """
​
  fp = request_fingerprint(request, include_headers=include_headers)
  if 'splash' not in request.meta:
      return fp
​
  splash_options = deepcopy(request.meta['splash'])
  args = splash_options.setdefault('args', {})
​
  if 'url' in args:
      args['url'] = canonicalize_url(args['url'], keep_fragments=True)
​
  return dict_hash(splash_options, fp)
​
​
class SplashAwareDupeFilter(RFPDupeFilter):
  """
  DupeFilter that takes 'splash' meta key in account.
  It should be used with SplashMiddleware.
  """
  def request_fingerprint(self, request):
      return splash_request_fingerprint(request)
​
​
"""Ce qui précède est réécrit pour supprimer la classe,Code crawler en bas"""
​
from scrapy_redis.spiders import RedisSpider
from scrapy_splash import SplashRequest
​
​
class SplashAndRedisSpider(RedisSpider):
  name = 'splash_and_redis'
  allowed_domains = ['baidu.com']
​
  # start_urls = ['https://www.baidu.com/s?wd=13161933309']
  redis_key = 'splash_and_redis'
  # lpush splash_and_redis 'https://www.baidu.com'
​
  # Début de la distributionurlNon disponiblesplashServices!
  # Besoin de réécriredupefilterDéclassement!
​
  def parse(self, response):
      yield SplashRequest('https://www.baidu.com/s?wd=13161933309',
                          callback=self.parse_splash,
                          args={'wait': 10}, # Temps d'arrêt maximal,Unité:Secondes
                          endpoint='render.html') # UtilisersplashParamètres fixes pour le service
​
  def parse_splash(self, response):
      with open('splash_and_redis.html', 'w') as f:
          f.write(response.body.decode())

5.2.2 scrapy_redisEtscrapy_splashConfiguration à utiliser avec

# Pour le Service de renduurl
SPLASH_URL = 'http://127.0.0.1:8050'
# Télécharger l'intergiciel
DOWNLOADER_MIDDLEWARES = {
  'scrapy_splash.SplashCookiesMiddleware': 723,
  'scrapy_splash.SplashMiddleware': 725,
  'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
# UtiliserSplashDeHttpCache
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
​
# Filtre à filtre
# DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
# DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # Génération d'empreintes digitales et déclassement
DUPEFILTER_CLASS = 'test_splash.spiders.splash_and_redis.SplashAwareDupeFilter' # Position de la classe de dégraissage mixte
​
SCHEDULER = "scrapy_redis.scheduler.Scheduler" # Classe d'ordonnanceur
SCHEDULER_PERSIST = True # File d'attente des demandes de persistance et collection d'empreintes digitales, scrapy_redisEtscrapy_splashUtilisation mixtesplashDeDupeFilter!
ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline': 400} # Les données sont stockées dansredisLe tuyau de
REDIS_URL = "redis://127.0.0.1:6379" # redisDeurl

Attention!:

  • scrapy_redisLe crawler distribué ne sort pas automatiquement après la fin de la logique d'entreprise

  • RéécritdupefilterLes classes de dé - duplication peuvent personnaliser l'emplacement,Vous devez également écrire le chemin approprié dans le fichier de configuration

6. Compris.scrapyAutres configurations pour

  • CONCURRENT_REQUESTS Définir le nombre de demandes concurrentes,Par défaut16- Oui.

  • DOWNLOAD_DELAY Téléchargement tardif,Pas de retard par défaut,En secondes


Résumé

  1. Compris.scrapyInformations sur le journal de bord pour

  2. MaîtrisescrapyConfiguration commune pour

  3. Maîtrisescrapy_redisConfiguration

  4. Compris.scrapy_splashConfiguration

  5. Compris.scrapy_redisEtscrapy_splashConfiguration à utiliser avec


scrapydDéploiementscrapyProjets

Objectifs d'apprentissage

  1. Compris. scrapydProcessus d'utilisation de


1. scrapydIntroduction

scrapyd Est un déploiement et un fonctionnement scrapy Programme crawler ,Il vous permet de passerJSON APIAllez, viens. Déployer des projets crawler et contrôler les opérations crawler ,scrapydEst un démon, Écouter les rampes et les demandes , Puis démarrez le processus pour les exécuter

Ce qu'on appellejson apiL'essence estpostDemandewebapi

2. scrapydInstallation

scrapydServices: pip install scrapyd

scrapydClient: pip install scrapyd-client

3. DémarragescrapydServices

  1. InscrapySous le chemin du projet DémarragescrapydOrdre de:sudo scrapyd Ou scrapyd

  2. Après le démarrage, vous pouvez ouvrir le scrapyd, Accès local dans le Navigateur 6800 Les ports peuvent être visualisés scrapyd Interface de surveillance pour

  • Cliquez surjob L'interface de surveillance des tâches peut être visualisée

4. scrapyDéploiement du projet

4.1 Configurer les éléments à déployer

Modifier les éléments à déployer scrapy.cfgDocumentation( Quel crawler doit être déployé à scrapydMoyenne, Configurer le fichier pour ce projet )

 [deploy: Signature du Ministère ( Les noms de déploiement peuvent être personnalisés )]
url = http://localhost:6800/
project = Nom du projet( Nom utilisé lors de la création d'un projet crawler )

4.2 Déployer le projet scrapyd

Encore une fois,scrapySous le chemin du projetMise en œuvre:

scrapyd-deploy Signature du Ministère ( Nom défini dans le profil ) -p Nom du projet

Une fois le déploiement réussi, vous pouvez voir les éléments déployés

4.3 GestionscrapyProjets

  • Lancement du projet:curl http://localhost:6800/schedule.json -d project=project_name -d spider=spider_name

  • Fermez le crawler. :curl http://localhost:6800/cancel.json -d project=project_name -d job=jobid

Attention!;curlEst un outil en ligne de commande, Sinon, une installation supplémentaire est nécessaire

4.4 UtiliserrequestsContrôle des modulesscrapyProjets

import requests
# Démarrer le crawler
url = 'http://localhost:6800/schedule.json'
data = {
'project': Nom du projet,
'spider': Crawler name,
}
resp = requests.post(url, data=data)
# Arrête de ramper
url = 'http://localhost:6800/cancel.json'
data = {
'project': Nom du projet,
'job': Retour au démarrage du crawler jobid,
}
resp = requests.post(url, data=data)

Résumé

  1. Inscrapy Exécution sur le chemin du projet sudo scrapydOuscrapyd,DémarragescrapydServices; Ou plus tard nohup scrapyd > scrapyd.log 2>&1 &

  2. DéploiementscrapyProjet crawlerscrapyd-deploy -p myspider

  3. Démarrer un crawler dans un projet crawler curl http://localhost:6800/schedule.json -d project=myspider -d spider=tencent


13.Gerapy

Objectifs d'apprentissage

  1. Compris. Qu'est - ce queGerapy

  2. Maîtrise GerapyInstallation

  3. Maîtrise GerapyDémarrage de la configuration

  4. Maîtrise AdoptionGerapyGestion de la configurationscrapyProjets

1.GerapyIntroduction:

Gerapy C'est un Cadre de gestion des reptiles distribués ,Soutien Python 3,Basé sur Scrapy、Scrapyd、Scrapyd-Client、Scrapy-Redis、Scrapyd-API、Scrapy-Splash、Jinjia2、Django、Vue.js Développement,Gerapy Ça pourrait nous aider: ​

  1. Contrôle plus facile des rampes

  2. Voir plus intuitivement l'état du crawler

  3. Voir les résultats de crawl plus en temps réel

  4. Faciliter le déploiement des projets

  5. Mise en œuvre plus uniforme de la gestion des hôtes

2.GerapyInstallation

1.Exécutez la commande suivante,Attendez que l'installation soit terminée

pip3 install gerapy

2.ValidationgerapySi l'installation a réussi

Exécution dans le terminal gerapy Le message suivant apparaît

""" ​ Usage: ​ gerapy init [--folder=<folder>] ​ gerapy migrate ​ gerapy createsuperuser ​ gerapy runserver [host:port] ​ """

3.GerapyDémarrage de la configuration

1.Créer un nouveau projet

gerapy init

Une fois la commande exécutée, un gerapyDossiers,Saisissez ce dossier, Vous trouverez un nom projectsDossier pour ​

2. Initialisation de la base de données (IngerapyActions dans le Répertoire),Exécutez la commande suivante

gerapy migrate

Une fois la base de données initialisée, un SQLiteBase de données, La base de données enregistre les informations de configuration de l'hôte, la version de déploiement, etc. ​

3.Démarrage gerapyServices

gerapy runserver

C'est parti. gerapy La machine qui sert 8000 Ouvert sur le port GerapyServices,Saisissez dans le navigateurhttp://localhost:8000On y va.GerapyInterface de gestion, La gestion de l'hôte et de l'interface peut être effectuée dans l'interface de gestion ​

4.AdoptionGerapyGestion de la configurationscrapyProjets

  1. Configurer l'hôte 1.AjouterscrapydHôte

Besoin d'ajouter IP、Port,Et le nom, Cliquez sur créer pour compléter l'ajout , Cliquez en arrière pour voir l'ajout actuel Scrapyd Liste des services,Après avoir créé avec succès, Nous pouvons voir les services ajoutés dans la Liste

2.Exécuter le crawler, Cliquez sur envoyer .Et courir. (A condition que:: Nous avons configuréscrapydMoyenne, Crawler a été publié .)

  1. ConfigurationProjects 1.Nous pouvonsscarpy Projet directement à /gerapy/projectsEn bas..

    2.Ça pourrait être dansgerapy L'arrière - plan voit un élément

    3. Cliquez sur déployer cliquez sur le bouton déployer pour emballer et déployer , Dans le coin inférieur droit, nous pouvons entrer la description de l'emballage ,Similaire à Git De commit Information, Puis cliquez sur le bouton package ,C'est évident. Gerapy Vous serez invité à emballer avec succès , Affiche les résultats de l'emballage et le nom de l'emballage à gauche .

    4. Sélectionner un site , Cliquez sur déploiement à droite , Déployer le projet sur le site

    5. La description et le temps de déploiement sont affichés après un déploiement réussi

    6.Viens.clientsInterface, Trouver le noeud pour déployer le projet , Cliquez sur Dispatch

    7. Éléments trouvés dans la liste des éléments de ce noeud ,Cliquez à droiterunExécuter le projet

Supplément:

1.Gerapy Avec scrapyd Ça a un rapport? ?

Nous utilisons simplement scrapydPeut être appeléscrapy Ramper . Il suffit d'activer le crawler en utilisant la ligne de commande ​ curl http://127.0.0.1:6800/schedule.json -d project=Nom du projet -d spider=Crawler name ​ UtiliserGreapy Est d'utiliser la ligne de commande pour activer le crawler “Plus petit.”. On est là.gerapyConfiguré dansscrapydAprès, La ligne de commande n'est pas nécessaire , Vous pouvez activer le crawler directement à travers l'interface graphique .

Résumé

  1. Compris. Qu'est - ce queGerapy

  2. Maîtrise GerapyInstallation

  3. Maîtrise GerapyDémarrage de la configuration

  4. Maîtrise AdoptionGerapyGestion de la configurationscrapyProjets

## scrapyDecrawlspiderCrawler

Objectifs d'apprentissage:

  1. Compris. crawlspiderLe rôle de

  2. Application crawlspider Méthode de création du crawler

  3. Application crawlspiderMoyennerulesUtilisation de


1 crawlspiderQu'est - ce que c'est?

Examiner le Code précédent , Nous avons passé une grande partie de notre temps à chercher url Adresse ou contenu urlAu - dessus de l'adresse, Ce processus peut - il être plus simple? ?

Idées:

  1. Deresponse Extraire toutes les règles urlAdresse

  2. Auto - Construction requestsDemande,Envoyer au moteur

Correspondantcrawlspider Pour répondre à ces exigences , Capable de faire correspondre urlAdresse,Assemblé enReuqest Envoyer automatiquement l'objet au moteur après , Peut également spécifier callbackFonctions

C'est - à - dire::crawlspider Les Crawlers obtiennent automatiquement des connexions selon les règles

2 Créationcrawlspider Crawler et observer le contenu par défaut dans crawler

2.1 CréationcrawlspiderCrawler:

scrapy genspider -t crawl job 163.com

2.2 spider Le contenu généré par défaut est le suivant: :

class JobSpider(CrawlSpider):
name = 'job'
allowed_domains = ['163.com']
start_urls = ['https://hr.163.com/position/list.do']
rules = (
Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),
)
def parse_item(self, response):
i = {}
#i['domain_id'] = response.xpath('//input[@id="sid"]/@value').extract()
#i['name'] = response.xpath('//div[@id="name"]').extract()
#i['description'] = response.xpath('//div[@id="description"]').extract()
return i

2.3 Observation et normale scrapy.spiderLa différence entre

Incrawlspider Dans les reptiles ,Non.parseFonctions

L'accent est mis sur:rulesMoyenne:

  1. rules Est un Tuple ou une liste ,Contient:RuleObjet

  2. RuleRègles de représentation,Il contientLinkExtractor,callbackEtfollowIsoparamètre

  3. LinkExtractor: Extracteur de connexion , Peut être par la régularisation ou xpathPour le faire.urlCorrespondance des adresses

  4. callback : Représente l'extrait de connexion url Fonction de rappel pour la réponse à l'adresse ,Peut - être pas, Aucune indication que la réponse ne sera pas traitée par la fonction de rappel

  5. follow: Extrait de connexion url La réponse à l'adresse continuera - t - elle d'être rules Extraction des règles ,True Oui. ,Flase Ça veut dire non.

3. crawlspiderNetease recrute des reptiles

Adoptioncrawlspider Accéder aux informations de recrutement sur la page de détails de Netease Recruitment

url:Recherche d'emploi

Analyse des idées:

  1. Définir une règle , Pour faire tourner la page de liste ,followDoit être réglé àTrue

  2. Définir une règle , Mise en œuvre de la page de liste à la page de détails , Et spécifie la fonction de rappel

  3. Extraire les données de la page de détails

Attention!: Extracteur de connexion LinkExtractorDansallow L'expression régulière correspondante correspond à hrefValeur de la propriété

4 crawlspider Précautions d'emploi :

  1. Sauf avec des ordres. scrapy genspider -t crawl <Crawler name> <allowed_domail>Créer uncrawlspiderModèle pour, Les pages peuvent être créées manuellement

  2. crawlspider Il n'y a pas d'autre moyen. parse Méthode d'extraction des données nommée ,La méthode estcrawlspider Pour mettre en œuvre la base url Fonctions telles que l'extraction

  3. RuleDans l'objetLinkExtractor Est un paramètre fixe ,Autrescallback、followEst un paramètre optionnel

  4. Ne pas spécifiercallbackEtfollowPourTrueDans le cas de,Satisfactionrules Moyenne url Sera également récupéré et demandé

  5. Si un url Satisfaire plusieurs Rule,Alors ça va commencerrules Sélectionner un RuleMise en œuvre

5 Compris.crawlspiderAutres points de connaissance

  • Extracteur de liensLinkExtractor Plus de paramètres communs pour

    • allow: Satisfaire aux exigences entre parenthèses 're'De l'expressionurl Sera extrait ,Si vide, Alors tout correspond

    • deny: Satisfaire aux exigences entre parenthèses 're'De l'expressionurl Ne sera pas extrait ,Priorité supérieure àallow

    • allow_domains: Liens à extraire domains(urlChamp d'application),Par exemple::['hr.tencent.com', 'baidu.com']

    • deny_domains: Liens qui ne seront pas extraits domains(urlChamp d'application)

    • restrict_xpaths: UtiliserxpathLes règles correspondent,Etallow Co - filtration url,C'est - à - dire:xpath Dans la mesure du possible url L'adresse sera extraite ,Par exemple::restrict_xpaths='//div[@class="pagenav"]'

  • RuleParamètres communs

    • LinkExtractor: Extracteur de liens, Peut être par la régularisation ou xpathPour le faire.urlCorrespondance des adresses

    • callback: Représente l'extrait de connexion url Fonction de rappel pour la réponse à l'adresse ,Peut - être pas, Aucune indication que la réponse ne sera pas traitée par la fonction de rappel

    • follow: Extrait de connexion url La réponse à l'adresse continuera - t - elle d'être rules Extraction des règles ,Par défautTrue Oui. ,Flase Ça veut dire non.

    • process_links: Lorsque l'extracteur de liaison LinkExtractor Appelle la méthode spécifiée par ce paramètre lors de l'obtention de la liste des liens , Cette méthode personnalisée peut être utilisée pour filtrer url, Et cette méthode ne sera pas exécutée tant qu'elle n'aura pas été exécutée callbackMéthode spécifiée

Résumé

  1. crawlspiderLe rôle de:crawlspider Les connexions peuvent être obtenues automatiquement selon les règles

  2. crawlspider Création de crawler :scrapy genspider -t crawl tencent hr.tencent.com

  3. crawlspiderMoyennerulesUtilisation de:

  4. rules Est un Tuple ou une liste ,Contient:RuleObjet

  5. RuleRègles de représentation,Il contientLinkExtractor,callbackEtfollowIsoparamètre

  6. LinkExtractor: Extracteur de connexion , Peut être par la régularisation ou xpathPour le faire.urlCorrespondance des adresses

  7. callback : Représente l'extrait de connexion url Fonction de rappel pour la réponse à l'adresse ,Peut - être pas, Aucune indication que la réponse ne sera pas traitée par la fonction de rappel

  8. follow: Extrait de connexion url La réponse à l'adresse continuera - t - elle d'être rules Extraction des règles ,True Oui. ,Flase Ça veut dire non.

  9. Terminer le recrutement de Netease crawler crawlspiderVersion

Huit、appiumUtilisation de

Utilisationappium Contrôle automatique des appareils mobiles et extraction des données

Objectifs d'apprentissage

  1. Compris. appium-python-client Un module localise les éléments et extrait leur contenu textuel

  2. Compris. appium-python-client Méthode de commande du Mouvement de glissement par module


Pour contrôler les vibrations app Glissez et obtenez des informations telles que le surnom de l'éditeur et le nombre de favoris

2.1 Installationappium-python-client Module et démarrage de l'environnement installé

2.1.1 Installationappium-python-clientModule

Inwindow Exécuté dans un environnement virtuel pip install appium-python-client

2.1.2 Activez le simulateur nightGod. , Dans le chemin d'installation du simulateur nightGod binSous la table des matières,EntréecmdTerminal,Utiliseradb Création de commandes adb server Connexion au simulateur

  1. adb devices

C:\Program Files (x86)\Nox\bin>adb devices
List of devices attached
* daemon not running; starting now at tcp:5037
* daemon started successfully
  1. nox_adb.exe connect 127.0.0.1:62001

C:\Program Files (x86)\Nox\bin>nox_adb.exe connect 127.0.0.1:62001
already connected to 127.0.0.1:62001
  1. adb devices

C:\Program Files (x86)\Nox\bin>adb devices
List of devices attached
127.0.0.1:62001 device

2.1.3 Démarrageappium-desktop,Cliquez surstart serverDémarrageappiumServices

[Appium] Welcome to Appium v1.10.0
[Appium] Appium REST http interface listener started on 0.0.0.0:4723

2.1.4 Utilisez ce que vous avez appris dans la section précédente pour obtenir Desired CapabilitiesParamètres

  1. Obtenir le modèle de l'appareil analogique

    • Ouvrir les paramètres——À propos des tablettes

    • Voir le modèle , Obtenir le modèle de l'appareil analogique

  2. AccèsappNom du paquet Et appNom du processus

    • Ouvrir une courte vidéo Shaker dans le simulateur app

    • Inadb Si la connexion est correcte , Dans le Répertoire d'installation du simulateur nightGod binSous la table des matièrescmdEntrezadb shell

    • Entréeadb shellEntrée arrière dumpsys activity | grep mFocusedActivity

    • `com.ss.android.ugc.awemeC'estappNom du paquet

    • .main.MainActivity Est le nom du processus Attention, il y a un point devant. .

2.2 Initialisation et obtention de la résolution de l'appareil mobile

Les codes d'achèvement sont les suivants, Et exécuter l'effet de visualisation de code : Si le son tremble dans le simulateur appActivé, Et imprimez la résolution de l'appareil analogique avec succès

from appium import webdriver
​
# Configuration d'initialisation,ParamètresDesired CapabilitiesParamètres
desired_caps = {
  'platformName': 'Android',
  'deviceName': 'SM-G955F',
  'appPackage': 'com.ss.android.ugc.aweme',
  'appActivity': '.main.MainActivity'
}
# DésignationAppium Server
server = 'http://localhost:4723/wd/hub'
# Créer un nouveaudriver
driver = webdriver.Remote(server, desired_caps)
# Obtenir le simulateur / Résolution du téléphone (px)
width = driver.get_window_size()['width']
height = driver.get_window_size()['height']
print(width, height)
  • Résolution des appareils mobiles

    • driver.get_window_size()['width']

    • driver.get_window_size()['height']

2.3 Localiser les éléments et extraire le texte

2.3.1 Cliquez surappium desktop Icône de la loupe en haut à droite

Remplir la configuration comme indiqué dans la figure ,Et cliquez surstart session

2.3.2 La méthode d'utilisation de l'interface de positionnement est illustrée dans la figure ci - dessous.

2.3.3 Cliquez sur le nom de l'auteur de la courte vidéo , Voir et obtenir id

2.3.4 Inpython Utiliser le Code pour passer à travers les éléments id Obtenir le contenu textuel de cet élément

Instanciationappium driver Ajouter le code suivant après l'objet , Exécuter et voir les effets

# Obtenir diverses informations sur la vidéo :Utiliserappium desktopLocaliser les éléments
print(driver.find_element_by_id('bc').text) # Nom de l'éditeur
print(driver.find_element_by_id('al9').text) # Nombre de points favorables
print(driver.find_element_by_id('al_').text) # Nombre de messages
print(driver.find_element_by_id('a23').text) # Nom de la vidéo ,Peut - être qu'il n'existe pas,Erreur signalée
  • Localiser l'élément et obtenir son contenu textuel

    • driver.find_element_by_id(Élémentid).text

    • driver.find_element_by_xpath( Localiser l'élément xpathLes règles).text

2.4 Contrôle des vibrations appGlissez

2.4.1 appium Fonction de glissement

De(start_x, start_y)Glissez vers(end_x, end_y)

  • driver.swipe(start_x, start_y, end_x, end_y)

2.4.2 Contrôle des vibrations app Mise en œuvre du Code de glissement

start_x = width // 2 # Du point de départ du glissement xCoordonnées, Largeur de l'écran point central
start_y = height // 3 * 2 # Du point de départ du glissement yCoordonnées, Hauteur de l'écran de haut en bas des deux tiers
distance = height // 2 # y Distance de glissement de l'arbre : Distance de la moitié de la hauteur de l'écran
end_x = start_x # Fin du glissement xCoordonnées
end_y = start_y-distance # Fin du glissement yCoordonnées
# Glissez
driver.swipe(start_x, start_y, end_x, end_y)

2.5 Organiser et compléter le Code de glissement automatique

import time
from appium import webdriver
​
​
class DouyinAction():
  """Glissement automatique, Et obtenir le id"""
  def __init__(self, nums:int=None):
      # Configuration d'initialisation,ParamètresDesired CapabilitiesParamètres
      self.desired_caps = {
          'platformName': 'Android',
          'deviceName': 'SM-G955F',
          'appPackage': 'com.ss.android.ugc.aweme',
          'appActivity': '.main.MainActivity'
      }
      # DésignationAppium Server
      self.server = 'http://localhost:4723/wd/hub'
      # Créer un nouveaudriver
      self.driver = webdriver.Remote(self.server, self.desired_caps)
      # Obtenir le simulateur / Résolution du téléphone (px)
      width = self.driver.get_window_size()['width']
      height = self.driver.get_window_size()['height']
      print(width, height)
      # Définir les coordonnées initiales et la distance de glissement
      self.start_x = width//2 # Largeur de l'écran point central
      self.start_y = height//3*2 # Hauteur de l'écran de haut en bas des deux tiers
      self.distance = height//2 # Distance de glissement: Distance de la moitié de la hauteur de l'écran
      # Définir les temps de glissement
      self.nums = nums
​
  def comments(self):
      # app Cliquez une fois sur l'écran après l'ouverture , Assurez - vous que la page est affichée
      time.sleep(2)
      self.driver.tap([(500, 1200)], 500)
​
  def scroll(self):
      # Glissement infini
      i = 0
      while True:
          # Glissement analogique
          print('Glissezing...')
          self.driver.swipe(self.start_x, self.start_y,
                            self.start_x, self.start_y-self.distance)
          time.sleep(1)
          self.get_infos() # Obtenir le nom de l'éditeur de vidéos
          # Définir l'attente retardée
          time.sleep(4)
          # Décider de quitter ou non
          if self.nums is not None and self.nums == i:
              break
          i += 1
​
  def get_infos(self):
      # Obtenir diverses informations sur la vidéo :Utiliserappium desktopLocaliser les éléments
      print(self.driver.find_element_by_id('bc').text) # Nom de l'éditeur
      print(self.driver.find_element_by_id('al9').text) # Nombre de points favorables
      print(self.driver.find_element_by_id('al_').text) # Nombre de messages
      print(self.driver.find_element_by_id('a23').text) # Nom de la vidéo ,Peut - être qu'il n'existe pas,Erreur signalée
​
      # # Cliquez sur【Partager】Coordonnées 671,1058
      # self.driver.tap([(671, 1058)])
      # time.sleep(2)
      # # Glissez à gauche pour révéler 【Copier le lien】 580,1100 --> 200, 1100
      # self.driver.swipe(580,1100, 20, 200, 1100)
      # # self.driver.get_screenshot_as_file('./a.png') # Capture d'écran
      # # Cliquez sur【Copier le lien】 À droite. 60 Distance du bord inférieur 170 720-60,1280-170
      # self.driver.tap([(660, 1110)])
      # # self.driver.get_screenshot_as_file('./b.png') # Capture d'écran
​
  def main(self):
      self.comments() # Cliquez une fois sur l'écran , Assurez - vous que la page est affichée
      time.sleep(2)
      self.scroll() # Glissez
​
​
if __name__ == '__main__':
​
  action = DouyinAction(nums=5)
  action.main()

Résumé

  1. Compris. appium-python-client Un module localise les éléments et extrait leur contenu textuel

  2. Compris. appium-python-client Méthode de commande du Mouvement de glissement par module

DépannageRechercher ci - dessous 

版权声明
本文为[Cinq paquets de spaghettis!]所创,转载请带上原文链接,感谢
https://pythonmana.com/2021/10/20211028191003206W.html

  1. OpenCV - Python Real play (14) - face detection details (six lignes de code seulement pour apprendre 4 méthodes de détection de visage)
  2. 你好,python开发mes系统,能分享下吗,我最近也想搞这方面的
  3. 你好,python開發mes系統,能分享下嗎,我最近也想搞這方面的
  4. Bonjour, Python a développé mon système, pouvez - vous le partager?
  5. Introduction to tuples in Python
  6. Introduction to strings in python (Part 2)
  7. Introduction to strings in python (Part 1)
  8. python关于 if 的简单操作时,输出结果不是预期所要的结果 的问题
  9. python關於 if 的簡單操作時,輸出結果不是預期所要的結果 的問題
  10. Lorsque Python fonctionne simplement sur if, la sortie n'est pas le résultat attendu
  11. Python中字典问题请求解惑
  12. Python中字典問題請求解惑
  13. Demande de résolution de problèmes de dictionnaire en python
  14. Python中字典问题请求解惑
  15. Python technique 2: advanced usage of function parameters
  16. Demande de résolution de problèmes de dictionnaire en python
  17. Preliminary Knowledge - Python Core use Common Data Analysis Library (ⅱ)
  18. 关于python的代码问题,终端打印为什么会起飞
  19. En ce qui concerne les problèmes de code Python, pourquoi l'impression du terminal décolle - t - elle?
  20. Python中种子seed的运用问题
  21. L'application de Seed en python
  22. Python functional programming series 008: Testability
  23. [must see for getting started with Python] the difference and connection between cookie and session in Python!
  24. Python Xiaobai from scratch pyqt5 project actual combat (4) basic controls
  25. Python Xiaobai starts the pyqt5 project from scratch (3) connection between signal and slot
  26. Echarts ne peut pas afficher le HTML en PDF en utilisant le pdfkit de Python
  27. 一只Python 小white 的日常提问(づ ●─● )づ
  28. 2021 tutoriel complet d'automatisation des tests d'interface python [matériel d'apprentissage joint]
  29. Décrivez ce que les connaissances pertinentes jouent dans votre travail en utilisant arduino ou Python, y compris les bibliothèques pertinentes, en conjonction avec votre travail quotidien.
  30. Une question quotidienne d'un petit morceau de Python (づ● - ●)
  31. Python中字典问题请求解惑
  32. 一只Python 小white 的日常提問(づ ●─● )づ
  33. 在python中的问题,请问如何解决
  34. Only 10 questions are needed to easily master Matplotlib graphics processing | Python skill tree
  35. 在python中的問題,請問如何解决
  36. Comment résoudre le problème en python
  37. Demande de résolution de problèmes de dictionnaire en python
  38. 使用python,在一个命名为.txt文本文档写入n m乘法表。
  39. En utilisant Python, écrivez une table de multiplication n m dans un document texte nommé.txt.
  40. 使用python,在一個命名為.txt文本文檔寫入n m乘法錶。
  41. Python,前缀后缀相同时合并
  42. 关于#python#的问题:python
  43. 關於#python#的問題:python
  44. Python,前綴後綴相同時合並
  45. Questions sur # # Python #: Python
  46. Python, préfixe et suffixe combinés en même temps
  47. python manage.py shell无法运行,
  48. python manage.py shell無法運行,
  49. Le shell Python manage.py ne fonctionne pas,
  50. python中使用vscode Import 'matplotlib.pyplot' could not be resolved from source 问题
  51. [Chapter 11 of the full version] Python advanced crawler practice - system master Po anti climbing skills challenge high salary
  52. L'utilisation de vscode Import 'matplotlib.pyplot' en python ne peut pas être résolue à partir du problème source
  53. Python fusionne les deux listes et supprime les éléments dupliqués lors de la fusion
  54. [JS Reverse AES Reverse Encryption] python crawler combat, les jours sont de plus en plus décisifs
  55. 30 jeux Python. Je peux jouer à la pêche au travail pendant une journée.
  56. J'a i collecté un nouveau hit de liste en python, donc c'est un secret que quelqu'un d'autre peut devenir un magnat des médias!
  57. J'a i utilisé Python pour ramper à travers 5000 belles photos de papier peint, un jour oublié Premier amour!
  58. [Python planting system] the best green plant for your girlfriend. Girls love it when they see it! Attachment: should be able to feed - right??!
  59. [Python love guide] two small programs for sweetness burst table are released! Afraid you can't find someone?
  60. J'ai utilisé Python pour me connecter à la plus grande plate - forme de jeu au monde, et à quel point le cryptage steam est intelligent [code source inclus]