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 :
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('utf8') broswer = webdriver.Chrome() broswer.maximize_window() username = 'test' password = 'test' url = 'http://graduate.buct.edu.cn' 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 = 'http://graduate.buct.edu.cn' 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). 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('UserRole')) select.select_by_value('2') name = broswer.find_element_by_id('username') name.send_keys(username) pswd = broswer.find_element_by_id('password') pswd.send_keys(password) btnlg = broswer.find_element_by_id('btnLogin') btnlg.click()</code>
<code class="hljs perl">//*[@id="dgData00"]/tbody/tr/td[2] (前面是xpath)</code>
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('//*[@id="dgData00"]/tbody/tr[' + str(count) + ']/td[1]').text count += 1 except common.exceptions.NoSuchElementException: break # 获取报告信息 flag = 1 for currentLecture in range(2, count): # 类别 category = broswer.find_element_by_xpath('//*[@id="dgData00"]/tbody/tr[' + str(currentLecture) + ']/td[1]').text # 名称 name = broswer.find_element_by_xpath('//*[@id="dgData00"]/tbody/tr[' + str(currentLecture) + ']/td[2]').text # 单位 unitsPublish = broswer.find_element_by_xpath('//*[@id="dgData00"]/tbody/tr[' + str(currentLecture) + ']/td[3]').text # 开始时间 startTime = broswer.find_element_by_xpath('//*[@id="dgData00"]/tbody/tr[' + str(currentLecture) + ']/td[4]').text # 截止时间 endTime = broswer.find_element_by_xpath('//*[@id="dgData00"]/tbody/tr[' + str(currentLecture) + ']/td[5]').text</code>
爬取验证码
对网页中的验证码进行元素审查后,我们发现了其中的一个一个链接,是 IdentifyingCode.apsx,后面我们就对这个页面进行加载,并批量获取验证码。
爬取的思路是用selenium截取当前页面(仅显示部分),并保存到本地——需要翻页并截取特定位置的请研究:
broswer.set_window_position(**)相关函数;然后人工进行验证码的定位,通过PIL模块进行截取并保存。
最后调用谷歌在Python下的pytesser进行字符识别,但这个网站的验证码有很多的干扰,外加字符旋转,仅仅能识别其中的一部分字符。
<code class="hljs livecodeserver"># 获取验证码并验证(仅仅一幅) authCodeURL = broswer.find_element_by_xpath('//*[@id="Table2"]/tbody/tr[2]/td/p/img').get_attribute('src') # 获取验证码地址 broswer.get(authCodeURL) broswer.save_screenshot('text.png') rangle = (0, 0, 64, 28) i = Image.open('text.png') frame4 = i.crop(rangle) frame4.save('authcode.png') qq = Image.open('authcode.png') text = pytesser.image_to_string(qq).strip()</code> <code class="hljs axapta"># 批量获取验证码 authCodeURL = broswer.find_element_by_xpath('//*[@id="Table2"]/tbody/tr[2]/td/p/img').get_attribute('src') # 获取验证码地址 # 获取学习样本 for count in range(10): broswer.get(authCodeURL) broswer.save_screenshot('text.png') rangle = (1, 1, 62, 27) i = Image.open('text.png') frame4 = i.crop(rangle) frame4.save('authcode' + str(count) + '.png') print 'count:' + str(count) broswer.refresh() broswer.quit()</code>
爬取下来的验证码
一部分验证码原图:
从上面的验证码看出,字符是带旋转的,而且因为旋转造成的重叠对于后续的识别也有很大的影响。我曾尝试过使用神经网络进行训练,但因没有进行特征向量的提取,准确率低得离谱。
关于Python爬虫爬验证码实现功能详解就给大家介绍到这里,希望对大家有所帮助!
更多Introduction détaillée à la fonction du code de vérification de lexploration du robot Python相关文章请关注PHP中文网!