最近、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の学習問題について相談しました。コミュニケーションを促進するには、青をクリックしてディスカッションに参加し、自分でリソースベースに回答してください