Maison  >  Article  >  développement back-end  >  Introduction détaillée à la fonction du code de vérification de l'exploration du robot Python

Introduction détaillée à la fonction du code de vérification de l'exploration du robot Python

高洛峰
高洛峰original
2017-03-06 13:59:092348parcourir

Cet article présente principalement des informations pertinentes sur l'explication détaillée de la fonction d'implémentation du code de vérification du robot Python. Les amis dans le besoin peuvent s'y référer

Principales fonctions d'implémentation :

- Page de connexion


- Attendre dynamiquement le chargement de la page Web


- Téléchargement du code de vérification

J'ai eu très tôt une idée, qui est d'exécuter automatiquement une fonction selon le script, économisant ainsi beaucoup de main d'œuvre - je suis relativement paresseux. J'ai passé quelques jours à l'écrire, avec l'intention d'achever la reconnaissance du code de vérification et de résoudre fondamentalement le problème, mais la difficulté était trop élevée et la précision de la reconnaissance était trop faible, donc le plan a de nouveau pris fin.

J'espère que cette expérience pourra être partagée et communiquée avec tout le monde.

Ouvrez le navigateur avec Python

Par rapport au module urllib2 intégré, l'opération est plus gênante Pour certaines pages Web, les cookies. doivent être traités. L’enregistrement est très gênant. Par conséquent, j'utilise le module Selenium sous Python 2.7 pour effectuer des opérations sur la page Web.

Page Web de test : http://graduate.buct.edu.cn

Ouvrir la page Web : (Besoin de télécharger Chromedriver)

Afin de prendre en charge la sortie des caractères chinois, nous devons appeler le module sys et modifier l'encodage par défaut en UTF-8


<code class="hljs python">from selenium.webdriver.support.ui import Select, WebDriverWait
from selenium import webdriver
from selenium import common
from PIL import Image
import pytesser
import sys
reload(sys)
sys.setdefaultencoding(&#39;utf8&#39;)
broswer = webdriver.Chrome()
broswer.maximize_window()
username = &#39;test&#39;
password = &#39;test&#39;
url = &#39;http://graduate.buct.edu.cn&#39;
broswer.get(url)</code>


En attente du chargement de la page Web

Utilisation de WebDriverWait dans Selenium, ce qui précède le code a été chargé


<code class="hljs livecodeserver">url = &#39;http://graduate.buct.edu.cn&#39;
broswer.get(url)
wait = WebDriverWait(webdriver,5) #设置超时时间5s
# 在这里输入表单填写并加载的代码
elm = wait.until(lambda webdriver: broswer.find_element_by_xpath(xpathMenuCheck))</code>
# 在这里输入表单填写并加载的代码
elm = wait.until(lambda webdriver: broswer.find_element_by_xpath(xpathMenuCheck))</code>


Positionnement des éléments, saisie de caractères

Ensuite, une connexion est requise : j'utilise Chrome ici. Faites un clic droit sur la partie où vous devez remplir le contenu, sélectionnez Inspecter, et il passera automatiquement en mode développeur sous F12 (cette fonction est nécessaire). tout au long du processus pour trouver les ressources pertinentes).

Introduction détaillée à la fonction du code de vérification de lexploration du robot Python

vczKprbLJnJkcXVvO9Gh1PHT0LnYtcSyv7fWPGJyIC8 DQo8aW1nIGFsdD0="Écrivez la description de l'image ici" src="

http://www.jb51.net/uploadfile/Collfiles/201604 4/20160414092144893.png " title="" />

Ici, nous voyons une valeur = "1". Compte tenu des propriétés de la liste déroulante, il suffit de trouver un moyen d'attribuer cette valeur au Rôle utilisateur.

Ce qui est utilisé ici, c'est de sélectionner via le module Select de Selenium. Le contrôle de positionnement utilise find_element_by_**, qui peut correspondre un à un, ce qui est très pratique.

<code class="hljs sql">select = Select(broswer.find_element_by_id(&#39;UserRole&#39;))
select.select_by_value(&#39;2&#39;)
name = broswer.find_element_by_id(&#39;username&#39;)
name.send_keys(username)
pswd = broswer.find_element_by_id(&#39;password&#39;)
pswd.send_keys(password)
btnlg = broswer.find_element_by_id(&#39;btnLogin&#39;)
btnlg.click()</code>


C'est l'effet du remplissage automatique du script, puis il passera à la page suivante.

Introduction détaillée à la fonction du code de vérification de lexploration du robot Python

Ici, ce dont j'ai besoin, c'est de la fonction d'inscription automatique aux rapports académiques

Introduction détaillée à la fonction du code de vérification de lexploration du robot Python

Cliquez avec le bouton droit sur le rapport existant pour rechercher les messages liés à cette activité. Puisqu'il n'y a pas de rapport actuellement, seul le titre est affiché, mais il existe des similitudes pour l'identification des rapports valides ultérieurs.

Introduction détaillée à la fonction du code de vérification de lexploration du robot Python

Pour le positionnement des éléments, j'ai donné la priorité à xpath D'après le test, la position d'un élément peut être positionnée de manière unique, ce qui est très utile.


<code class="hljs perl">//*[@id="dgData00"]/tbody/tr/td[2] (前面是xpath)</code>


Introduction détaillée à la fonction du code de vérification de lexploration du robot Python

Informations d'exploration

La prochaine étape que nous devons franchir consiste à explorer les rapports valides existants :

<code class="hljs axapta"># 寻找有效报告
flag = 1
count = 2
count_valid = 0
while flag:
  try:
    category = broswer.find_element_by_xpath(&#39;//*[@id="dgData00"]/tbody/tr[&#39; + str(count) + &#39;]/td[1]&#39;).text
    count += 1
  except common.exceptions.NoSuchElementException:
    break
# 获取报告信息
flag = 1
for currentLecture in range(2, count):
  # 类别
  category = broswer.find_element_by_xpath(&#39;//*[@id="dgData00"]/tbody/tr[&#39; + str(currentLecture) + &#39;]/td[1]&#39;).text
  # 名称
  name = broswer.find_element_by_xpath(&#39;//*[@id="dgData00"]/tbody/tr[&#39; + str(currentLecture) + &#39;]/td[2]&#39;).text
  # 单位
  unitsPublish = broswer.find_element_by_xpath(&#39;//*[@id="dgData00"]/tbody/tr[&#39; + str(currentLecture) + &#39;]/td[3]&#39;).text
  # 开始时间
  startTime = broswer.find_element_by_xpath(&#39;//*[@id="dgData00"]/tbody/tr[&#39; + str(currentLecture) + &#39;]/td[4]&#39;).text
  # 截止时间
  endTime = broswer.find_element_by_xpath(&#39;//*[@id="dgData00"]/tbody/tr[&#39; + str(currentLecture) + &#39;]/td[5]&#39;).text</code>


爬取验证码

Introduction détaillée à la fonction du code de vérification de lexploration du robot Python

对网页中的验证码进行元素审查后,我们发现了其中的一个一个链接,是 IdentifyingCode.apsx,后面我们就对这个页面进行加载,并批量获取验证码。

Introduction détaillée à la fonction du code de vérification de lexploration du robot Python

爬取的思路是用selenium截取当前页面(仅显示部分),并保存到本地——需要翻页并截取特定位置的请研究:

broswer.set_window_position(**)相关函数;然后人工进行验证码的定位,通过PIL模块进行截取并保存。

最后调用谷歌在Python下的pytesser进行字符识别,但这个网站的验证码有很多的干扰,外加字符旋转,仅仅能识别其中的一部分字符。


<code class="hljs livecodeserver"># 获取验证码并验证(仅仅一幅)
authCodeURL = broswer.find_element_by_xpath(&#39;//*[@id="Table2"]/tbody/tr[2]/td/p/img&#39;).get_attribute(&#39;src&#39;) # 获取验证码地址
broswer.get(authCodeURL)
broswer.save_screenshot(&#39;text.png&#39;)
rangle = (0, 0, 64, 28)
i = Image.open(&#39;text.png&#39;)
frame4 = i.crop(rangle)
frame4.save(&#39;authcode.png&#39;)
qq = Image.open(&#39;authcode.png&#39;)
text = pytesser.image_to_string(qq).strip()</code>
<code class="hljs axapta"># 批量获取验证码
authCodeURL = broswer.find_element_by_xpath(&#39;//*[@id="Table2"]/tbody/tr[2]/td/p/img&#39;).get_attribute(&#39;src&#39;) # 获取验证码地址
# 获取学习样本
for count in range(10):
  broswer.get(authCodeURL)
  broswer.save_screenshot(&#39;text.png&#39;)
  rangle = (1, 1, 62, 27)
  i = Image.open(&#39;text.png&#39;)
  frame4 = i.crop(rangle)
  frame4.save(&#39;authcode&#39; + str(count) + &#39;.png&#39;)
  print &#39;count:&#39; + str(count)
  broswer.refresh()
broswer.quit()</code>


爬取下来的验证码

Introduction détaillée à la fonction du code de vérification de lexploration du robot Python

一部分验证码原图:

从上面的验证码看出,字符是带旋转的,而且因为旋转造成的重叠对于后续的识别也有很大的影响。我曾尝试过使用神经网络进行训练,但因没有进行特征向量的提取,准确率低得离谱。

关于Python爬虫爬验证码实现功能详解就给大家介绍到这里,希望对大家有所帮助!

更多Introduction détaillée à la fonction du code de vérification de lexploration du robot Python相关文章请关注PHP中文网!

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