Pythonクローラのクローリング検証コードの機能を詳しく紹介

高洛峰
リリース: 2017-03-06 13:59:09
オリジナル
2365 人が閲覧しました

この記事は主に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(&#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>
ログイン後にコピー


Webページがロードされるのを待っています

SeleniumのWebDriverWaitを使用すると、上記のコードがロードされました


<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>
ログイン後にコピー


要素の配置、文字入力

次にログインする必要があります。ここでは Chrome を使用しています。入力する必要がある部分を右クリックして選択し、[検査] を選択して、 F12 を押すと自動的に開発者モードにジャンプします (関連リソースを見つけるためのこの機能のプロセス全体に必要です)。

Pythonクローラのクローリング検証コードの機能を詳しく紹介

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(&#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>
ログイン後にコピー


これはスクリプトを自動的に入力し、次のページにジャンプする効果です。

Pythonクローラのクローリング検証コードの機能を詳しく紹介

ここで必要なのは、学術レポートを自動的に登録する機能です

Pythonクローラのクローリング検証コードの機能を詳しく紹介

既存のレポートを右クリックして、このイベントに関連するニュースを見つけます。タイトルのみが表示されますが、以下の有効なレポートの識別には類似点があります。

Pythonクローラのクローリング検証コードの機能を詳しく紹介

要素の配置については、xpathを優先しました。テストによると、要素の位置を一意に見つけることができ、非常に便利です。


<code class="hljs perl">//*[@id="dgData00"]/tbody/tr/td[2] (前面是xpath)</code>
ログイン後にコピー


Pythonクローラのクローリング検証コードの機能を詳しく紹介

情報をクロールする

次のステップは、既存の有効なレポートをクロールすることです:

<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>
ログイン後にコピー


爬取验证码

Pythonクローラのクローリング検証コードの機能を詳しく紹介

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

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>
ログイン後にコピー


爬取下来的验证码

Pythonクローラのクローリング検証コードの機能を詳しく紹介

一部分验证码原图:

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

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

更多Pythonクローラのクローリング検証コードの機能を詳しく紹介相关文章请关注PHP中文网!

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート