この記事は主にPythonクローラー検証コード実装機能の詳細な説明に関する関連情報を紹介します
主な実装機能:
- Webページにログインします
- Web ページがロードされるのを動的に待ちます
- 認証コードのダウンロード
私は長い間アイデアを持っていました。それは、スクリプトに従って関数を自動的に実行し、多くの労力を節約することです。私は比較的怠け者です。認証コードの認識を完了させ、問題を根本的に解決するつもりで数日かけて書きましたが、難易度が高すぎ、認識精度も低すぎたので、計画は再び中止となりました。
この経験が皆さんと共有され、伝わることを願っています。
Pythonでブラウザを開きます
組み込みのurllib2モジュールに比べて操作が面倒で、一部のWebページではCookieを保存する必要があり、非常に不便です。したがって、私は Python 2.7 で Selenium モジュールを使用して Web ページ上で操作を実行しています。
テストウェブページ: http://graduate.buct.edu.cn
ウェブページを開きます: ( chromedriver をダウンロードする必要があります)
中国語の文字出力をサポートするには、以下を呼び出す必要があります。 sysモジュールを変更してデフォルトを変更します エンコーディングは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>
Webページがロードされるのを待っています
SeleniumのWebDriverWaitを使用すると、上記のコードがロードされました
<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>
要素の配置、文字入力
次にログインする必要があります。ここでは Chrome を使用しています。入力する必要がある部分を右クリックして選択し、[検査] を選択して、 F12 を押すと自動的に開発者モードにジャンプします (関連リソースを見つけるためのこの機能のプロセス全体に必要です)。
vczKprbLJnJkcXVvO9Gh1PHT0LnYtcSyv7fWPGJyIC8+DQo8aW1nIGFsdD0="ここに画像の説明を書いてください" src="http://www.jb51.net/uploadfile/Collfiles/20160414/2016 041 4092144893.png" title="" />
ここでは、値 = "1" があることがわかります。ドロップダウン ボックスのプロパティを考慮すると、この値を UserRole に割り当てる方法を見つけるだけで済みます。
ここで使用するのはseleniumのSelectモジュールで選択することで、位置決め制御は1対1対応できるfind_element_by_**を使用するのでとても便利です。
<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>
これはスクリプトを自動的に入力し、次のページにジャンプする効果です。
ここで必要なのは、学術レポートを自動的に登録する機能です
既存のレポートを右クリックして、このイベントに関連するニュースを見つけます。タイトルのみが表示されますが、以下の有効なレポートの識別には類似点があります。
要素の配置については、xpathを優先しました。テストによると、要素の位置を一意に見つけることができ、非常に便利です。
<code class="hljs perl">//*[@id="dgData00"]/tbody/tr/td[2] (前面是xpath)</code>
情報をクロールする
次のステップは、既存の有効なレポートをクロールすることです:
<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爬虫爬验证码实现功能详解就给大家介绍到这里,希望对大家有所帮助!
更多Pythonクローラのクローリング検証コードの機能を詳しく紹介相关文章请关注PHP中文网!