Araignée de Python

coldplay.xixi
Libérer: 2020-10-14 17:38:09
avant
5641 Les gens l'ont consulté

La colonne tutoriel vidéo Python d'aujourd'hui vous présentera les connaissances liées au Spider (crawler) de Python.

Araignée de Python

1. Robot d'exploration Web

Le robot d'exploration Web est également appelé araignée Web. Nous pouvons imaginer Internet comme une toile d'araignée, et chaque site Web est un nœud. nous pouvons utiliser une araignée pour récupérer les ressources souhaitées sur chaque page Web. Pour donner l'exemple le plus simple, si vous saisissez « Python » dans Baidu et Google, un grand nombre de pages Web liées à Python seront récupérées. Comment Baidu et Google récupèrent-ils les ressources souhaitées à partir des pages Web massives ? Ce que fait est d'envoyer un grand nombre d'araignées pour explorer la page Web, rechercher des mots-clés, créer une base de données d'index, et après un algorithme de tri complexe, les résultats vous sont affichés en fonction de la pertinence des mots-clés de recherche.

Un voyage de mille kilomètres commence par une seule étape. Apprenons à écrire un robot d'exploration Web à partir des bases et à utiliser Python pour l'implémenter.

2. Comment Python accède-t-il à Internet ?

Si vous souhaitez écrire un robot d'exploration Web, la première étape consiste à accéder à Internet.

En Python, nous utilisons le package urllib pour accéder à Internet. (En Python3, ce module a été considérablement ajusté. Il y avait urllib et urllib2. En 3, ces deux modules ont été unifiés et fusionnés, appelé le package urllib. Le package contient quatre modules, urllib.request, urllib. erreur, urllib.parse, urllib.robotparser) , actuellement urllib.request est principalement utilisé.

Nous donnons d'abord l'exemple le plus simple, comment obtenir le code source d'une page web :

import urllib.request
response = urllib.request.urlopen('https://docs.python.org/3/')
html = response.read()print(html.decode('utf-8'))
Copier après la connexion

3 Utilisation simple du réseau Python

Tout d'abord, nous utilisons deux petits. démos pour s'entraîner Pour commencer, l'une consiste à utiliser du code python pour télécharger une image en local, et l'autre consiste à appeler Youdao Translation pour écrire un petit logiciel de traduction.

3.1 Téléchargez l'image selon le lien de l'image, le code est le suivant :

import urllib.request

response = urllib.request.urlopen('http://www.3lian.com/e/ViewImg/index.html?url=http://img16.3lian.com/gif2016/w1/3/d/61.jpg')
image = response.read()

with open('123.jpg','wb') as f:
    f.write(image)
Copier après la connexion

Où la réponse est un objet

Entrée : response.geturl()

->'http://www.3lian.com/e/ViewImg/index.html?url=http://img16.3lian.com/gif2016/w1/ 3/d/61. jpg'
Entrée : response.info()

->

Entrée : print(response.info())

->Content-Type : text/html
Dernière modification : lundi 27 septembre 2004 01:23:20 GMT
Plages acceptées : octets
ETag : "0f4b59230a4c41:0"
Serveur : Microsoft-IIS /8.0 <<>
Date : dim. 14 août 2016 07:16:01 gmt
Connexion : Fermer

Contenu - Longueur : 2827

Entrée : response.getcode()

- >200

3.1 Utiliser le dictionnaire Youdao pour implémenter la fonction de traduction

Nous voulons implémenter la fonction de traduction, nous devons obtenir le lien de demande . Tout d'abord, nous devons accéder à la page d'accueil de Youdao, cliquer sur Traduire, saisir le contenu à traduire dans l'interface de traduction, cliquer sur le bouton Traduire et une demande sera adressée au serveur. Tout ce que nous avons à faire est d'obtenir l'adresse de la demande et. paramètres de requête.

我在此使用谷歌浏览器实现拿到请求地址和请求参数。首先点击右键,点击检查(不同浏览器点击的选项可能不同,同一浏览器的不同版本也可能不同),进入图一所示,从中我们可以拿到请求请求地址和请求参数,在Header中的Form Data中我们可以拿到请求参数。

(图一)

代码段如下:

import urllib.requestimport urllib.parse

url = &#39;http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=dict2.index&#39;data = {}
data[&#39;type&#39;] = &#39;AUTO&#39;data[&#39;i&#39;] = &#39;i love you&#39;data[&#39;doctype&#39;] = &#39;json&#39;data[&#39;xmlVersion&#39;] = &#39;1.8&#39;data[&#39;keyfrom&#39;] = &#39;fanyi.web&#39;data[&#39;ue&#39;] = &#39;UTF-8&#39;data[&#39;action&#39;] = &#39;FY_BY_CLICKBUTTON&#39;data[&#39;typoResult&#39;] = &#39;true&#39;data = urllib.parse.urlencode(data).encode(&#39;utf-8&#39;)
response = urllib.request.urlopen(url,data)
html = response.read().decode(&#39;utf-8&#39;)print(html)
Copier après la connexion

上述代码执行如下:

{"type":"EN2ZH_CN","errorCode":0,"elapsedTime":0,"translateResult":[[{"src":"i love you","tgt":"我爱你"}]],"smartResult":{"type":1,"entries":["","我爱你。"]}}

对于上述结果,我们可以看到是一个json串,我们可以对此解析一下,并且对代码进行完善一下:

import urllib.requestimport urllib.parseimport json

url = &#39;http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=dict2.index&#39;data = {}
data[&#39;type&#39;] = &#39;AUTO&#39;data[&#39;i&#39;] = &#39;i love you&#39;data[&#39;doctype&#39;] = &#39;json&#39;data[&#39;xmlVersion&#39;] = &#39;1.8&#39;data[&#39;keyfrom&#39;] = &#39;fanyi.web&#39;data[&#39;ue&#39;] = &#39;UTF-8&#39;data[&#39;action&#39;] = &#39;FY_BY_CLICKBUTTON&#39;data[&#39;typoResult&#39;] = &#39;true&#39;data = urllib.parse.urlencode(data).encode(&#39;utf-8&#39;)
response = urllib.request.urlopen(url,data)
html = response.read().decode(&#39;utf-8&#39;)
target = json.loads(html)print(target[&#39;translateResult&#39;][0][0][&#39;tgt&#39;])
Copier après la connexion

四、规避风险

服务器检测出请求不是来自浏览器,可能会屏蔽掉请求,服务器判断的依据是使用‘User-Agent',我们可以修改改字段的值,来隐藏自己。代码如下:

import urllib.requestimport urllib.parseimport json

url = &#39;http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=dict2.index&#39;data = {}
data[&#39;type&#39;] = &#39;AUTO&#39;data[&#39;i&#39;] = &#39;i love you&#39;data[&#39;doctype&#39;] = &#39;json&#39;data[&#39;xmlVersion&#39;] = &#39;1.8&#39;data[&#39;keyfrom&#39;] = &#39;fanyi.web&#39;data[&#39;ue&#39;] = &#39;UTF-8&#39;data[&#39;action&#39;] = &#39;FY_BY_CLICKBUTTON&#39;data[&#39;typoResult&#39;] = &#39;true&#39;data = urllib.parse.urlencode(data).encode(&#39;utf-8&#39;)
req = urllib.request.Request(url, data)
req.add_header(&#39;User-Agent&#39;,&#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36&#39;)
response = urllib.request.urlopen(url, data)
html = response.read().decode(&#39;utf-8&#39;)
target = json.loads(html)print(target[&#39;translateResult&#39;][0][0][&#39;tgt&#39;])
Copier après la connexion

View Code

上述做法虽然可以隐藏自己,但是还有很大问题,例如一个网络爬虫下载图片软件,在短时间内大量下载图片,服务器可以可以根据IP访问次数判断是否是正常访问。所有上述做法还有很大的问题。我们可以通过两种做法解决办法,一是使用延迟,例如5秒内访问一次。另一种办法是使用代理。

延迟访问(休眠5秒,缺点是访问效率低下):

import urllib.requestimport urllib.parseimport jsonimport timewhile True:
    content = input(&#39;please input content(input q exit program):&#39;)    if content == &#39;q&#39;:        break;

    url = &#39;http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=dict2.index&#39;
    data = {}
    data[&#39;type&#39;] = &#39;AUTO&#39;
    data[&#39;i&#39;] = content
    data[&#39;doctype&#39;] = &#39;json&#39;
    data[&#39;xmlVersion&#39;] = &#39;1.8&#39;
    data[&#39;keyfrom&#39;] = &#39;fanyi.web&#39;
    data[&#39;ue&#39;] = &#39;UTF-8&#39;
    data[&#39;action&#39;] = &#39;FY_BY_CLICKBUTTON&#39;
    data[&#39;typoResult&#39;] = &#39;true&#39;
    data = urllib.parse.urlencode(data).encode(&#39;utf-8&#39;)
    req = urllib.request.Request(url, data)
    req.add_header(&#39;User-Agent&#39;,&#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36&#39;)
    response = urllib.request.urlopen(url, data)
    html = response.read().decode(&#39;utf-8&#39;)
    target = json.loads(html)    print(target[&#39;translateResult&#39;][0][0][&#39;tgt&#39;])
    time.sleep(5)
Copier après la connexion

View Code

代理访问:让代理访问资源,然后讲访问到的资源返回。服务器看到的是代理的IP地址,不是自己地址,服务器就没有办法对你做限制。

步骤:

1,参数是一个字典{'类型' : '代理IP:端口号' } //类型是http,https等

proxy_support = urllib.request.ProxyHandler({})

2,定制、创建一个opener

opener = urllib.request.build_opener(proxy_support)

3,安装opener(永久安装,一劳永逸)

urllib.request.install_opener(opener)

3,调用opener(调用的时候使用)

opener.open(url)

五、批量下载网络图片

图片下载来源为煎蛋网(http://jandan.net)

图片下载的关键是找到图片的规律,如找到当前页,每一页的图片链接,然后使用循环下载图片。下面是程序代码(待优化,正则表达式匹配,IP代理):

import urllib.requestimport osdef url_open(url):
    req = urllib.request.Request(url)
    req.add_header(&#39;User-Agent&#39;,&#39;Mozilla/5.0&#39;)
    response = urllib.request.urlopen(req)
    html = response.read()    return htmldef get_page(url):
    html = url_open(url).decode(&#39;utf-8&#39;)
    a = html.find(&#39;current-comment-page&#39;) + 23
    b = html.find(&#39;]&#39;,a)    return html[a:b]def find_image(url):
    html = url_open(url).decode(&#39;utf-8&#39;)
    image_addrs = []
    a = html.find(&#39;img src=&#39;)    while a != -1:
        b = html.find(&#39;.jpg&#39;,a,a + 150)        if b != -1:
            image_addrs.append(html[a+9:b+4])        else:
            b = a + 9
        a = html.find(&#39;img src=&#39;,b)    for each in image_addrs:        print(each)    return image_addrsdef save_image(folder,image_addrs):    for each in image_addrs:
        filename = each.split(&#39;/&#39;)[-1]
        with open(filename,&#39;wb&#39;) as f:
            img = url_open(each)
            f.write(img)def download_girls(folder = &#39;girlimage&#39;,pages = 20):
    os.mkdir(folder)
    os.chdir(folder)
    url = &#39;http://jandan.net/ooxx/&#39;
    page_num = int(get_page(url))    for i in range(pages):
        page_num -= i
        page_url = url + &#39;page-&#39; + str(page_num) + &#39;#comments&#39;
        image_addrs = find_image(page_url)
        save_image(folder,image_addrs)if __name__ == &#39;__main__&#39;:
    download_girls()
Copier après la connexion

 代码运行效果如下:

更多相关免费学习推荐: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!

Étiquettes associées:
source:cnblogs.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal