Heim >Backend-Entwicklung >Python-Tutorial >Detaillierte Einführung in die Funktion des Python-Crawlers zum Crawlen des Verifizierungscodes

Detaillierte Einführung in die Funktion des Python-Crawlers zum Crawlen des Verifizierungscodes

高洛峰
高洛峰Original
2017-03-06 13:59:092370Durchsuche

In diesem Artikel werden hauptsächlich relevante Informationen zur detaillierten Erläuterung der Implementierungsfunktion des Python-Crawler-Verifizierungscodes vorgestellt. Freunde, die sie benötigen, können sich auf

Hauptimplementierungsfunktionen beziehen:

- Anmeldeseite

- Dynamisch warten, bis die Webseite geladen wird

- Bestätigungscode herunterladen

Ich hatte schon sehr früh die Idee, eine Funktion automatisch gemäß dem Skript auszuführen und so viel Arbeitskraft zu sparen – ich bin relativ faul. Ich habe ein paar Tage damit verbracht, es zu schreiben, mit der Absicht, die Erkennung des Bestätigungscodes abzuschließen und das Problem grundlegend zu lösen, aber der Schwierigkeitsgrad war zu hoch und die Erkennungsgenauigkeit zu niedrig, sodass der Plan erneut zu Ende ging.
Ich hoffe, dass diese Erfahrung mit allen geteilt und kommuniziert werden kann.

Öffnen Sie den Browser mit Python

Im Vergleich zum integrierten urllib2-Modul ist der Vorgang für einige Webseiten problematischer verarbeitet werden müssen. Daher verwende ich das Selenium-Modul unter Python 2.7, um Operationen auf der Webseite auszuführen.

Testwebseite: http://graduate.buct.edu.cn

Öffnen Sie die Webseite : (Chromedriver muss heruntergeladen werden)

Um die Ausgabe chinesischer Zeichen zu unterstützen, müssen wir das sys-Modul aufrufen und die Standardkodierung in UTF-8 ändern


<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>


Warten auf das Laden der Webseite

Verwenden von WebDriverWait in Selenium, das Obige Code wurde geladen


<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>


Elementpositionierung, Zeicheneingabe

Als nächstes ist eine Anmeldung erforderlich: Ich verwende hier Chrome. Klicken Sie mit der rechten Maustaste auf den Teil, in den Sie den Inhalt eingeben müssen, wählen Sie „Inspizieren“ und es wird automatisch in den Entwicklermodus unter F12 gesprungen (diese Funktion wird benötigt). während des gesamten Prozesses, um relevante Ressourcen zu finden).

Detaillierte Einführung in die Funktion des Python-Crawlers zum Crawlen des Verifizierungscodes

vczKprbLJnJkcXVvO9Gh1PHT0LnYtcSyv7fWPGJyIC8+DQo8aW1nIGFsdD0="Bildbeschreibung hier schreiben" src="http://www.jb51.net/uploadfile/Collfiles/20160. 4 14/20160414092144893. png " title="" />

Hier sehen wir einen Wert = „1“. Unter Berücksichtigung der Eigenschaften der Dropdown-Box müssen wir nur eine Möglichkeit finden, diesen Wert zuzuweisen Benutzerrolle.
Was hier verwendet wird, ist die Auswahl über das Selen-Modul. Die Positionierungssteuerung verwendet find_element_by_**, das eins zu eins entsprechen kann, was sehr praktisch ist.

<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>


Dies ist der Effekt, wenn das Skript automatisch ausgefüllt wird und dann zur nächsten Seite gesprungen wird.

Detaillierte Einführung in die Funktion des Python-Crawlers zum Crawlen des Verifizierungscodes

Hier brauche ich die Funktion zur automatischen Anmeldung für Studienberichte

Detaillierte Einführung in die Funktion des Python-Crawlers zum Crawlen des Verifizierungscodes

Klicken Sie mit der rechten Maustaste auf den vorhandenen Bericht, um die Meldungen zu dieser Aktivität zu finden. Da derzeit kein Bericht vorhanden ist, wird nur der Titel angezeigt, es gibt jedoch Ähnlichkeiten zur Identifizierung nachfolgender gültiger Berichte.

Detaillierte Einführung in die Funktion des Python-Crawlers zum Crawlen des Verifizierungscodes

Für die Positionierung von Elementen habe ich xpath den Vorrang gegeben, da es die Position eines Elements eindeutig positionieren kann, was sehr nützlich ist.


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


Detaillierte Einführung in die Funktion des Python-Crawlers zum Crawlen des Verifizierungscodes

Crawling-Informationen

Der nächste Schritt, den wir unternehmen müssen, besteht darin, vorhandene gültige Berichte zu crawlen:

<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>


爬取验证码

Detaillierte Einführung in die Funktion des Python-Crawlers zum Crawlen des Verifizierungscodes

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

Detaillierte Einführung in die Funktion des Python-Crawlers zum Crawlen des Verifizierungscodes

爬取的思路是用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>


爬取下来的验证码

Detaillierte Einführung in die Funktion des Python-Crawlers zum Crawlen des Verifizierungscodes

一部分验证码原图:

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

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

更多Detaillierte Einführung in die Funktion des Python-Crawlers zum Crawlen des Verifizierungscodes相关文章请关注PHP中文网!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn