Pythonは、画像スライド検証コードをバイパスして、すべてのPTA質問のクロールを実現します。

最近、Pythonクローラーを学び、学んだことを応用する姿勢で生活に応用しました。突然、アルゴリズムのテストが行​​われていることがわかりました。範囲はPTAのブラシ付きの質問です。1つずつコピーして貼り付けますか?不可能です、あなたはそれを登らなければなりません!

最初にページを開くと、人々はばかげています。PTAのトピックは非同期読み込み、孤独なクロール(空のデータ)です。私はAJAXに慣れていないので、突然セレンについて考えました。

Seleniumは人間の操作をシミュレートし、ブラウザーに自動的にアクションを実行させることができます。Seleniumについては、言うまでもなく、自分で詳しく知ることができます。乾物が来ています:

ログインインターフェイスには、画像スライド検証コードがあります

それをクラックする最良の方法はopencvを使用することです、opencvは巨大です、そしてあなたはそれをあなた自身が知っています。アイデアは次のように始まります。1。背景画像とスライド可能な画像をダウンロードします。2。opencvを使用して、2つの画像の最適な位置に一致させます。それを実現する方法を気にする必要はありません。最後に、最も一致するXY値3が得られます。Y値を考慮する必要がないため、スライダーのドラッグはX値の問題です。セレンでグラブアンドドロップ関数を呼び出し、X値をドロップして、ブラウザは自動的にスライドします。注:アルゴリズムの問​​題により、一度に成功しない場合があります。プログラムを再起動するか、コードを変更してください。4.入力後、セレンのさまざまな操作を使用して登ると終了します。ソースコードは次のとおりです。

セレンwebdriverをインポート
インポートActionChains selenium.webdriver.common.action_chainsから
のインポートが要求
インポート時間
インポートnumpyの
インポートCV2
インポートOS 


Xuwen香港:#作者
#を許可なく複製することはできませんが、ソースを転載示す

#webdriverを使用していることを、オブジェクトを作成しますchrome browser Drive 
web = webdriver.Chrome(r'd:\ chromedriver.exe ')
web.implicitly_wait(5 #WebDriverオブジェクト
のgetメソッドを呼び出すと、ブラウザーは指定されたURLを開くことができます
web.get(' https:/ /pintia.cn/ auth / login ')
zh = web.find_element_by_xpath(' / html / body / div [1] / div [3] / div / div [2] / form / div [1] / div [1] / div / div / div [1] / input ')
mm = web.find_element_by_xpath(' / html / body / div [1] / div [3] / div / div [2] / form / div [1] / div [2] / div / div / div [1] / input ')

パスワード: 
#PTAのアカウント zh.send_keys(' ****** @qq。と ')
mm.send_keys( '******')
    f.write(requests.get(front_img_src).content)
ログインボタンを見つけて、web.find_element_by_xpath( '/ html / body / div [1] / div [3] / div / div [2] / form / div [2] / button / div / div')。clickをクリックします。 ()
2秒間待つと、検証コードが読み込まれますtime.sleep(2)
#bg background picture 
bg_img_src = web.find_element_by_xpath(
    '/ html / body / div [3] / div [2] / div / div / div [2] 
    / div / div [1] / div / div [1] / img [1] ')
。get_attribute(' src ')
#frontドラッグ可能な画像front_img_src = web.find_element_by_xpath(' / html / body / div [3 ] / div [2] / div / div / div [2] / div / div [1] / div / div [1] / img [2] ')。get_attribute ' src ')#open (で
画像保存"bg .jpg"、mode = "wb")as f:
    f.write(requests.get(bg_img_src).content)
with open( "front.jpg"、mode = "wb")as f:#
画像を読み込むメモリに
bg = cv2.imread( "bg。jpg ") 
front = cv2.imread(" front.jpg ")
js = 'alert( "このプログラムはPythonコースの設計に使用できます。コードを直接送信しないでください。エラーを報告します行のコードを削除する必要があります。通常どおり実行 "); ' 
web.execute_script(js)
time.sleep(15 
背景画像をグレースケール画像に変換し、3つの主要色の寸法を縮小します
bg = cv2.cvtColor(bg、cv2.COLOR_BGR2GRAY)#
スライド可能な画像をグレースケール画像に変換し、3つの主要な色の次元を減らします
front = cv2.cvtColor(front、cv2.COLOR_BGR2GRAY)
front = front [front.any(1)]#
cvアルゴリズムを使用してxy値を一致させます最高の精度の
結果= cv2.matchTemplate(bg、front、cv2.TM_CCOEFF_NORMED)
#numpy parse xy、xyは実際の反対であることに注意してください、x = y、y = x 
x、y = numpy.unravel_index(numpy.argmax (result)、result.shape)
ドラッグ可能な領域を見つけるdiv = web.find_element_by_xpath( '/ html / body / div [3] / div [2] / div / div / div [2] / div / div [2] / div [2] ')
#スライダーをxではなく実際の反対のy値にドラッグします
ActionChains(web).drag_and_drop_by_offset(div、xoffset = y // 0.946、yoffset = 0).perform()#

これまでのところ、検証コードは正常に解読されています。アルゴリズムの問​​題により、正解率は100%に達することができず、



range(
    0、1000 )のページではさらに1〜2回の実行が必要になる場合がありますtime.sleep(1)#
    ここのURLはPTA固定Webページであり、ページ
    web.get( 'https:// pintiaを置き換えるだけで済みます。 cn / problem-sets?tab = 1&filter = all&page = {page _} '。format(page_ = page))#
    現在のページタイトルセットURLを取得します。A_sはタグのリストです。URLユーザーストレージURL 
    A_s = web.find_elements_by_class_name( 'name_QIjv7')
    urls = [] 
    for a in A_s:
        urls.append(a.get_attribute( 'href'))#
    ページにクロール可能なURLがない
    場合、urls .__ len __()== 0の場合はプログラムを終了します:
        print( 'crawl complete')
        os。_exit()#
    url内のurlに対して
    取得したURLリストをトラバースします
        web.get(url) 
        #オブジェクトは対応するトピックを見つけることです
        tm = web.find_elements_by_css_selector( "[class = 'problemStatusRect_3kpmC PROBLEM_ACCEPTED_1Dzzi']")
        tm_total = 0 
        for i in range(0、1000 ):
            #ページをトラバースする質問タイプ
            try:
                tm_type = web.find_element (
                    '/ html / body / div / div [3] / div [2] / div / div [2] / div [{i _}] / div / div [2]'。format i_ = i * 2 + 2 ))。text 
                #質問タイプがprogramming / functionの
                場合、tm_type == 'programmingquestion'またはtm_type == 'function question'の場合、対応する番号を記録して後続のクロールを容易にします
                    。tm_total+ = int(web.find_element_by_xpath(
                        '/ html / body / div / div [3] / div [2] / div / div [2] / div [{i_}] / a / div / div'.format(i_ = i * 2 + 2))。text [0])
            を除く:
                break
        #関数/プログラミング質問の数に応じて対応する質問オブジェクトを取得し、
        tm_total!= 0の場合は他の質問を破棄します:
            tm = tm [-tm_total:] 
        else:
            tm = [] 
        #tmのtm_index
        の残りの質問トラバースします:
            try :
                tm_index.click()
                time.sleep(0.5)
                タイトルのコードを取得しますtm_title = web.find_element_by_css_selector(
                    "[class = 'text-center black-3 text-4 font-weight-bold my-3']" ).text 
                mycode = web.find_element_by_css_selector( 'textarea')。get_attribute( 'value')
                print( 'title:' + tm_title)
                print(mycode)でき
                #Nextは、以下預けることができます
            例外:
                続行

最近、多くの友人がプライベートメッセージを通じてPythonの学習問題について相談しました。コミュニケーションを促進するには、青をクリックしてディスカッションに参加し、自分でリソースベースに回答してください

 

おすすめ

転載: blog.csdn.net/weixin_43881394/article/details/112268003