ブログ投稿アドレス:クリックして表示
起因
数日前、Linuxでcrontabに接触したとき、壁紙の変更やローカルファイルのgithubへのプッシュなどの機能を定期的に完了することができます。過去数日間、自動サインインスクリプトを作成できるかどうか疑問に思いました。最初に使用したクローラーは、ログインとサインインにCookieを使用していましたが、数日後にCookieの有効期限が切れ、コールドになりました。たまたま、セレンがブラウザのクリックをシミュレートできることを知ったので、自動チェックインに関する記事を見つけて、この時点で記録しました。
セレンの紹介
Seleniumは、Webブラウザーの自動化のためのさまざまなツールと依存関係パッケージを提供する包括的なプロジェクトです。彼には多くの機能があります。今回は、主にPythonと組み合わせることで、ブラウザをシミュレートし、さまざまなクリックを実行したり、アカウントのパスワードを入力したりすることができるブラウザとして理解できます。
スクリーンショットを貼る
キーポイント
主なことは、適切な要素を選択し、コードが人であるかのように見せかけることです。最初にWebページを開き、次にアカウント番号を入力してから、ログインボタンをクリックする必要があります。コードについては、クリックやその他の操作の前にログインボタン。したがって、正しく正確なものを見つけることが非常に重要です。
要素を見つける
パスID
driver.find_element_by_id('loginForm')
名前で
driver.find_element_by_name('username')
Xpath経由
#绝对定位 (页面结构轻微调整就会被破坏)
driver.find_element_by_xpath("/html/body/form[1]")
#HTML页面中的第一个form元素
driver.find_element_by_xpath("//form[1]")
#包含 id 属性并且其值为 loginForm 的form元素
driver.find_element_by_xpath("//form[@id='loginForm']")
検索の場合、F12で要素を選択し、右クリックして[コピー]を選択すると、xpathのコピーなどのオプションが表示されます。
その他のポイント
アクションをクリックする
driver.find_element_by_xpath('/html/body/div[2]/button').click()
情報を入力してください
driver.find_element_by_id('email').send_keys(username)
要素のコンテンツを取得する
driver.find_element_by_xpath('//*[@id="swal2-content"]').text
不利益
セレンの場合、最大のデメリットはクローラーの速度よりも遅いことだと個人的に感じています。コードは画像の無効化やタイムアウトの設定などの操作を使用していますが、それでも比較的遅いです。ただし、自動チェックインの場合、安定していれば、遅いかどうかは問題ではありません。
コード
"""
功能:自动签到脚本
配置:登录地址 + 账号 + 密码
"""
import time
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.chrome.options import Options
def checkin(login_url,username,password):
chrome_options = Options() #解决使用chrome报错
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument("enable-automation")
chrome_options.add_argument("--headless")
chrome_options.add_argument("--window-size=1920,1080")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-extensions")
chrome_options.add_argument("--dns-prefetch-disable")
chrome_options.add_argument("--disable-gpu")
chrome_prefs = {
} #禁止加载图片以提高速度
chrome_options.experimental_options["prefs"] = chrome_prefs
chrome_prefs["profile.default_content_settings"] = {
"images": 2}
chrome_prefs["profile.managed_default_content_settings"] = {
"images": 2}
driver = webdriver.Chrome(options=chrome_options, executable_path='/usr/bin/chromedriver') # 初始化chrome
driver.set_page_load_timeout(30) #设置超时以提高速度
driver.maximize_window() # 最大化窗口
try:
driver.get(login_url) # 进入登录页面
except:
driver.execute_script("window.stop()") #加载超时停止加载执行下一步操作
print("当前页面为:"+driver.find_element_by_xpath('//*[@id="app"]/section/div/div[1]/div/h4/span').text)
print("当前账号为:"+username)
print("--------------------------------")
try:
time.sleep(3) # 延时加载
driver.find_element_by_id('email').send_keys(username) # 填充用户名和密码
driver.find_element_by_id('password').send_keys(password)
driver.find_element_by_xpath('/html/body/div[1]/section/div/div[1]/div/form/div[4]/button').click() # 登录
time.sleep(3)
driver.find_element_by_xpath('/html/body/div[2]/div/div/div[3]/button').click() #点击刚进主页弹出的弹窗
time.sleep(3) #等待两秒,点击read后网页流量是动态增加的
try: # 未签到
driver.find_element_by_xpath("/html/body/div[1]/div/div[3]/section/div[1]/div/div/a").click() # 点击签到
print(driver.find_element_by_xpath('//*[@id="swal2-content"]').text)
driver.find_element_by_xpath("/html/body/div[7]/div/div[3]/button[1]").click()
print("签到成功,恭喜你,幸运的boy")
except Exception as e:
print("已经签到过了")
except Exception as e:
print(e)
print("签到失败")
time.sleep(3)
print("当前流量为:"+driver.find_element_by_xpath("//*[@id='app']/div/div[3]/section/div[3]/div[2]/div/div[2]/div[2]/span").text+"G")
print()
driver.quit()
checkin("url","账号","密码")
checkin("url","账号","密码")
最後に書く
上記は個人的な要約に過ぎません。私は初めて連絡します。エラーが発生した場合は、修正するために私に連絡してください。将来的には、LinuxとPythonについてもっと興味深いことを共有します。