Maison  >  Article  >  développement back-end  >  Comment un robot d'exploration Python explore-t-il les données de page demandées par get ? (avec code)

Comment un robot d'exploration Python explore-t-il les données de page demandées par get ? (avec code)

不言
不言original
2018-09-15 14:40:246484parcourir

Le contenu de cet article explique comment le robot d'exploration Python explore les données de page demandées par get (avec du code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Bibliothèque 1.urllib

urllib est une bibliothèque fournie avec Python pour les robots d'exploration. Sa fonction principale est de simuler le navigateur pour envoyer des requêtes via du code. Ses sous-modules couramment utilisés sont urllib.request et urllib.parse en Python3, et urllib et urllib2 en Python2.

2. Programme d'exploration de facile à difficile :

1. Explorez toutes les valeurs de données sur la page d'accueil de Baidu

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
#导包
import urllib.request
import urllib.parse
if __name__ == "__main__":
    #指定爬取的网页url
    url = 'http://www.baidu.com/'
    #通过urlopen函数向指定的url发起请求,返回响应对象
    reponse = urllib.request.urlopen(url=url)
    #通过调用响应对象中的read函数,返回响应回客户端的数据值(爬取到的数据)
    data = reponse.read()#返回的数据为byte类型,并非字符串
    print(data)#打印显示爬取到的数据值。

#Instructions supplémentaires
Prototype de la fonction urlopen :

urllib.request.urlopen(url, data=None, timeout=<object object at 0x10af327d0>, *, cafile=None, capath=None, cadefault=False, context=None)

Dans le cas ci-dessus, nous n'avons utilisé que le premier paramètre url de la fonction. Dans le développement quotidien, les deux seuls paramètres que nous pouvons utiliser sont l'URL et les données.

paramètre url : Spécifiez quelle url pour lancer une requête vers

paramètre data : vous pouvez encapsuler les paramètres portés dans la requête de publication dans un dictionnaire et les transmettre à ce paramètre (pas besoin de comprendre pour l'instant, nous en reparlerons plus tard) )

L'objet de réponse renvoyé par la fonction urlopen, introduction de l'appel de fonction associée :

response.headers() : Obtenez les informations d'en-tête de réponse
response.getcode() : Obtenez le code d'état de la réponse
response.geturl() : Obtenez l'URL demandée
response.read() : Obtenez la valeur des données (type d'octet) dans la réponse

2. Écrivez la valeur des données analysées sur la page d'accueil de Baidu News Entrez le fichier à stocker

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
import urllib.request
import urllib.parse
if __name__ == "__main__":
    url = &#39;http://news.baidu.com/&#39;
    reponse = urllib.request.urlopen(url=url)
    #decode()作用是将响应中字节(byte)类型的数据值转成字符串类型
    data = reponse.read().decode()
    #使用IO操作将data表示的数据值以&#39;w&#39;权限的方式写入到news.html文件中
    with open(&#39;./news.html&#39;,&#39;w&#39;) as fp:
        fp.write(data)
    print(&#39;写入文件完毕&#39;)

3. Explorez certaines données d'image sur le réseau et stockez-les localement

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
import urllib.request
import urllib.parse
#如下两行代码表示忽略https证书,因为下面请求的url为https协议的请求,如果请求不是https则该两行代码可不用。
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
if __name__ == "__main__":
    #url是https协议的
    url = &#39;https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1536918978042&di=172c5a4583ca1d17a1a49dba2914cfb9&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fimgad%2Fpic%2Fitem%2F0dd7912397dda144f04b5d9cb9b7d0a20cf48659.jpg&#39;
    reponse = urllib.request.urlopen(url=url)
    data = reponse.read()#因为爬取的是图片数据值(二进制数据),则无需使用decode进行类型转换。
    with open(&#39;./money.jpg&#39;,&#39;wb&#39;) as fp:
        fp.write(data)
    print(&#39;写入文件完毕&#39;)

4. Caractéristiques de l'url : l'url doit être une valeur de données codée en ASCII. Par conséquent, lorsque nous écrivons l'URL dans le code du robot d'exploration, s'il y a une valeur de données non codée en ASCII dans l'URL, elle doit être codée en ASCII avant que l'URL puisse être utilisée.

Cas : explorez les données de la page recherchées à l'aide de Baidu en fonction du terme spécifié (par exemple, explorez les données de la page avec le terme « Jay Chou »)

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
import urllib.request
import urllib.parse
if __name__ == "__main__":
    #原始url中存在非ASCII编码的值,则该url无法被使用。
    #url = &#39;http://www.baidu.com/s?ie=utf-8&kw=周杰伦&#39;
    #处理url中存在的非ASCII数据值
    url = &#39;http://www.baidu.com/s?&#39;
    #将带有非ASCII的数据封装到字典中,url中非ASCII的数据往往都是&#39;?&#39;后面键值形式的请求参数
    param = {
        &#39;ie&#39;:&#39;utf-8&#39;,
        &#39;wd&#39;:&#39;周杰伦&#39;
    }
    #使用parse子模块中的urlencode函数将封装好的字典中存在的非ASCII的数值进行ASCII编码
    param = urllib.parse.urlencode(param)
    #将编码后的数据和url进行整合拼接成一个完整可用的url
    url = url + param
    print(url)
    response = urllib.request.urlopen(url=url)
    data = response.read()
    with open(&#39;./周杰伦.html&#39;,&#39;wb&#39;) as fp:
        fp.write(data)
    print(&#39;写入文件完毕&#39;)

5. Objet utilisé pour dissimuler l'identité demandée par le robot.

Lors de l'explication des informations d'en-tête de requête http courantes, nous avons expliqué le paramètre User-Agent, appelé UA. La fonction de ce paramètre est d'indiquer l'identité du porteur de la requête. Si nous lançons une requête via un navigateur, le porteur de la requête est le navigateur actuel et la valeur du paramètre UA indique une chaîne de données représentée par l'identité du navigateur actuel. Si nous utilisons une requête initiée par un programme d'exploration, le porteur de la requête est le programme d'exploration et l'UA de la requête est une chaîne de données représentée par l'identité du programme d'exploration. Certains sites Web détermineront si le transporteur demandé est un programme d'exploration en identifiant l'UA demandé. S'il s'agit d'un programme d'exploration, aucune réponse ne sera renvoyée à la demande et notre programme d'exploration ne pourra pas explorer le site Web via la demande. Valeur des données, c'est aussi un principal moyen technique d'anti-crawling. Afin d'éviter que ce problème ne se produise, nous pouvons déguiser l'UA du programme d'exploration en identité d'un certain navigateur.

Dans le cas ci-dessus, nous avons lancé la requête via urlopen dans le module de requête. L'objet de requête est l'objet de requête par défaut construit dans urllib, et nous ne pouvons pas le modifier via UA. urllib nous fournit également un moyen de personnaliser l'objet de requête. Nous pouvons déguiser (modifier) ​​l'UA dans l'objet de requête en personnalisant l'objet de requête.

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
import urllib.request
import urllib.parse

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

if __name__ == "__main__":
    #原始url中存在非ASCII编码的值,则该url无法被使用。
    #url = &#39;http://www.baidu.com/s?ie=utf-8&kw=周杰伦&#39;
    #处理url中存在的非ASCII数据值
    url = &#39;http://www.baidu.com/s?&#39;
    #将带有非ASCII的数据封装到字典中,url中非ASCII的数据往往都是&#39;?&#39;后面键值形式的请求参数
    param = {
        &#39;ie&#39;:&#39;utf-8&#39;,
        &#39;wd&#39;:&#39;周杰伦&#39;
    }
    #使用parse子模块中的urlencode函数将封装好的字典中存在的非ASCII的数值进行ASCII编码
    param = urllib.parse.urlencode(param)
    #将编码后的数据和url进行整合拼接成一个完整可用的url
    url = url + param
    #将浏览器的UA数据获取,封装到一个字典中。该UA值可以通过抓包工具或者浏览器自带的开发者工具中获取某请求,从中获取UA的值
    headers={
        &#39;User-Agent&#39; : &#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36&#39;
    }
    #自定义一个请求对象
    #参数:url为请求的url。headers为UA的值。data为post请求的请求参数(后面讲)
    request = urllib.request.Request(url=url,headers=headers)

    #发送我们自定义的请求(该请求的UA已经进行了伪装)
    response = urllib.request.urlopen(request)

    data=response.read()

    with open(&#39;./周杰伦.html&#39;,&#39;wb&#39;) as fp:
        fp.write(data)
    print(&#39;写入数据完毕&#39;)

Recommandations associées :

Version bêta du robot d'exploration Python pour capturer une seule page Zhihu

Liste complète des outils du robot d'exploration Python

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn