Le robot d'exploration Web d'apprentissage Python est principalement divisé en trois sections principales : l'exploration , l'analyse et le stockage.
De plus, Scrapy, le framework de robots d'exploration le plus couramment utilisé, sera présenté en détail ici à la fin.
Tout d’abord, énumérons les articles pertinents que j’ai résumés, qui couvrent les concepts et compétences de base nécessaires pour démarrer avec les robots d’exploration Web : Ning Ge’s Small Station - Web Crawler
Lorsque nous saisissons une URL dans le navigateur et appuyons sur Entrée, que se passe-t-il en arrière-plan ? Par exemple, si vous entrez http://www.lining0806.com/, vous verrez la page d'accueil du site Web de Brother Ning.
En termes simples, ce processus se déroule en quatre étapes suivantes :
En termes simples, ce qu'un robot d'exploration Web doit faire, c'est implémenter les fonctions d'un navigateur. En spécifiant l'URL, les données requises par l'utilisateur sont directement renvoyées, sans qu'il soit nécessaire de manipuler manuellement le navigateur pour les obtenir étape par étape.
Dans cette étape, vous devez clarifier quel contenu vous souhaitez obtenir ? S'agit-il de code source HTML, ou d'une chaîne au format Json, etc.
La plupart des cas d'exploration sont des requêtes get, c'est-à-dire l'obtention de données directement à partir du serveur de l'autre partie.
Tout d'abord, Python est livré avec deux modules, urllib et urllib2, qui peuvent essentiellement satisfaire l'exploration générale des pages. De plus, les requêtes sont également un package très utile, similaire à celui-ci, il existe httplib2 et ainsi de suite.
Requests:
import requests
response = requests.get(url)
content = requests.get(url).content
print "response headers:", response.headers
print "content:", content
Urllib2:
import urllib2
response = urllib2.urlopen(url)
content = urllib2.urlopen(url).read()
print "response headers:", response.headers
print "content:", content
Httplib2:
import httplib2
http = httplib2.Http()
response_headers, content = http.request(url, 'GET')
print "response headers:", response_headers
print "content:", content
De plus, pour les URL avec des champs de requête, les requêtes get ajoutent généralement les données demandées à l'URL pour diviser l'URL et transmettre les données. Plusieurs paramètres sont connectés à &.
data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.get(url=url, params=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
full_url = url+'?'+data
response = urllib2.urlopen(full_url)
Référence connexe : Examen de l'exploration du classement NetEase News
Projet de référence : Le robot d'exploration le plus basique des robots d'exploration Web : exploration des classements d'actualités NetEase
2.1 Connectez-vous via le formulaire
Cette situation est une demande de publication, c'est-à-dire que les données du formulaire sont d'abord envoyées au serveur, et le serveur stocke ensuite le cookie renvoyé localement.
data = {'data1':'XXXXX', 'data2':'XXXXX'}
Requests:data为dict,json
import requests
response = requests.post(url=url, data=data)
Urllib2:data为string
import urllib, urllib2
data = urllib.urlencode(data)
req = urllib2.Request(url=url, data=data)
response = urllib2.urlopen(req)
2.2 Connectez-vous à l'aide de cookies
En utilisant les cookies pour vous connecter, le serveur pensera que vous êtes un utilisateur connecté et vous renverra donc le contenu connecté. Par conséquent, si un code de vérification est requis, vous pouvez utiliser un cookie pour vous connecter avec un code de vérification.
import requests
requests_session = requests.session()
response = requests_session.post(url=url_login, data=data)
S'il existe un code de vérification, il n'est pas possible d'utiliser Response = Requests_session.post(url=url_login, data=data) pour le moment. La méthode doit être la suivante :
response_captcha = requests_session.get(url=url_login, cookies=cookies)
response1 = requests.get(url_login) # 未登陆
response2 = requests_session.get(url_login) # 已登陆,因为之前拿到了Response Cookie!
response3 = requests_session.get(url_results) # 已登陆,因为之前拿到了Response Cookie!
Référence associée : Connexion par code de vérification du robot d'exploration Web
Projet de référence : Nom d'utilisateur, mot de passe et code de vérification du robot d'exploration Web. Connexion : Exploration du site Web Zhihu
3.1 Utiliser un proxy
Situation applicable : la restriction des adresses IP peut également résoudre le problème de la nécessité de saisir un code de vérification pour se connecter en raison des « clics fréquents ».
Dans ce cas, le meilleur moyen est de maintenir un pool d'adresses IP proxy. Il existe de nombreuses adresses IP proxy gratuites sur Internet, et il en existe de nombreuses bonnes et mauvaises. Vous pouvez trouver celles qui peuvent être utilisées grâce au filtrage. Pour les « clics fréquents », nous pouvons également éviter d'être bannis par le site Web en limitant la fréquence des robots visitant le site Web.
proxies = {'http':'http://XX.XX.XX.XX:XXXX'}
Requests:
import requests
response = requests.get(url=url, proxies=proxies)
Urllib2:
import urllib2
proxy_support = urllib2.ProxyHandler(proxies)
opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler)
urllib2.install_opener(opener) # 安装opener,此后调用urlopen()时都会使用安装过的opener对象
response = urllib2.urlopen(url)
3.2 Réglage de l'heure
Situation applicable : situation de fréquence limitée.
Requests et Urllib2 peuvent utiliser la fonction sleep() de la bibliothèque time :
import time
time.sleep(1)
3.3 Se déguiser en navigateur, ou lutter contre « l'anti-hotlinking »
Certains sites Web vérifient si vous y accédez réellement via un navigateur ou si une machine y accède automatiquement. Dans ce cas, plus User-Agent, cela montre que vous accédez via un navigateur. Parfois, il vérifiera également si les informations du référent sont incluses et si votre référent est légal, généralement ainsi que le référent.
headers = {'User-Agent':'XXXXX'} # 伪装成浏览器访问,适用于拒绝爬虫的网站
headers = {'Referer':'XXXXX'}
headers = {'User-Agent':'XXXXX', 'Referer':'XXXXX'}
Requests:
response = requests.get(url=url, headers=headers)
Urllib2:
import urllib, urllib2
req = urllib2.Request(url=url, headers=headers)
response = urllib2.urlopen(req)
Pas grand chose à dire.
def multi_session(session, *arg):
retryTimes = 20
while retryTimes>0:
try:
return session.post(*arg)
except:
print '.',
retryTimes -= 1
ou
def multi_open(opener, *arg):
retryTimes = 20
while retryTimes>0:
try:
return opener.open(*arg)
except:
print '.',
retryTimes -= 1
De cette façon, nous pouvons utiliser multi_session ou multi_open pour maintenir la session ou l'ouverture capturée par le robot.
Voici une comparaison expérimentale de l'exploration parallèle pour Wall Street News : l'exploration multi-processus Python et l'exploration Java mono-thread et multi-thread.
Référence associée : Comparaison des méthodes informatiques multi-processus et multi-thread en Python et Java
Pour le cas "charger plus", utilisez Ajax pour transférer beaucoup de données.
Comment cela fonctionne : après avoir chargé le code source de la page Web à partir de l'URL de la page Web, le programme JavaScript sera exécuté dans le navigateur. Ces programmes chargent davantage de contenu et « remplissent » la page Web. C'est pourquoi si vous explorez directement l'URL de la page Web elle-même, vous ne trouverez pas le contenu réel de la page.
Ici, si vous utilisez Google Chrome pour analyser le lien correspondant à « Demande » (méthode : clic droit → Inspecter l'élément → Réseau → Effacer, cliquez sur « Charger plus », le lien GET correspondant apparaîtra et cherchera le Type de texte/ html, cliquez pour afficher les paramètres d'obtention ou copiez l'URL de la demande), processus en boucle.
Selenium est un outil de test automatisé. Il peut contrôler le navigateur, y compris le remplissage des caractères, les clics de souris, l'acquisition d'éléments, le changement de page et une série d'opérations. En bref, Selenium peut faire tout ce qu'un navigateur peut faire.
Voici le code qui utilise le sélénium pour récupérer dynamiquement les informations tarifaires de Qunar.com après une liste de villes donnée.
Projet de référence : le robot d'exploration Web Selenium utilise une connexion par proxy : site Web Crawl Qunar
Pour le cas où le site Web dispose d’un code de vérification, nous disposons de trois méthodes :
L'utilisation d'un proxy et l'utilisation de cookies pour se connecter ont déjà été abordées. Parlons maintenant de l'identification du code de vérification.
Vous pouvez utiliser le système open source Tesseract-OCR pour télécharger et reconnaître les images de code de vérification, et transférer les caractères reconnus vers le système d'exploration pour une connexion simulée. Bien entendu, vous pouvez également télécharger l’image du code de vérification sur la plateforme de codage pour identification. En cas d'échec, vous pouvez mettre à jour à nouveau l'identification du code de vérification jusqu'à ce que l'opération réussisse.
Projet de référence : Projet d'identification du code de vérification version 1 : Captcha1
Il y a deux problèmes auxquels il faut prêter attention lors de l'exploration :
Après l'exploration, le contenu analysé est analysé. Quel que soit le contenu dont vous avez besoin, vous pouvez en extraire le contenu pertinent.
Les outils d'analyse courants incluent les expressions régulières, BeautifulSoup, lxml, etc.
Après avoir analysé ce dont nous avons besoin, l’étape suivante consiste à le stocker.
Nous pouvons choisir de l'enregistrer dans un fichier texte, ou dans une base de données MySQL ou MongoDB, etc.
Il y a deux problèmes auxquels il faut prêter attention lors du stockage :
Scrapy est un framework de robots d'exploration Python open source basé sur Twisted, largement utilisé dans l'industrie.
Pour le contenu connexe, vous pouvez vous référer à la construction d'un robot d'exploration Web basé sur Scrapy. Dans le même temps, le code du projet d'exploration de recherche WeChat présenté dans cet article est donné comme référence d'apprentissage.
Projet de référence : utilisez Scrapy ou Requests pour explorer de manière récursive les résultats de recherche WeChat
Un bon robot d'exploration Web doit d'abord se conformer au protocole Robots . Le nom complet du protocole Robots (également connu sous le nom de protocole d'exploration, protocole robot, etc.) est « Protocole d'exclusion de robots ». Les sites Web utilisent le protocole Robots pour indiquer aux moteurs de recherche quelles pages peuvent être explorées et quelles pages ne peuvent pas être explorées.
Placez un fichier texte robots.txt (tel que https://www.taobao.com/robots.txt) dans le répertoire racine du site Web. Dans celui-ci, vous pouvez spécifier les pages auxquelles les différents robots d'exploration Web peuvent accéder et les pages auxquelles. sont interdits d'accès. Les pages spécifiées sont déterminées par des règles régulières de représentation des expressions. Avant que le robot d'exploration Web ne collecte ce site Web, il obtient d'abord le fichier texte robots.txt, puis analyse les règles qu'il contient, puis collecte les données du site Web conformément aux règles.
User-agent: 指定对哪些爬虫生效
Disallow: 指定不允许访问的网址
Allow: 指定允许访问的网址
Remarque : Un mot anglais doit être en majuscule. Les deux points sont en anglais. Il y a un espace après les deux points « / » représente l'ensemble du site Web.
禁止所有机器人访问
User-agent: *
Disallow: /
允许所有机器人访问
User-agent: *
Disallow:
禁止特定机器人访问
User-agent: BadBot
Disallow: /
允许特定机器人访问
User-agent: GoodBot
Disallow:
禁止访问特定目录
User-agent: *
Disallow: /images/
仅允许访问特定目录
User-agent: *
Allow: /images/
Disallow: /
禁止访问特定文件
User-agent: *
Disallow: /*.html$
仅允许访问特定文件
User-agent: *
Allow: /*.html$
Disallow: /