最後の書き込み半製品は、フォームを投稿する直接urllibはライブラリですが、今は利用できません、主にポスト要求、追加のいくつかの未知の値、および暗号化されたパスワードの分野でase128で使用されている、私は怠け者実現しています。
ちょうどそのようなクリックなど、人間の入力操作をシミュレートし、セレンは、自動テストのための良いモジュールで、ブラウザが直接動員することができ、セレンを試してみて、非常に使いやすいが、それは比較的低い効率で、多くの操作理由彼らは見つけることができる前にロードすると、他のページ要素。
8000://116.62.5.101:これも予約を受け付けるためのウェブサイトを設定し、データベースに書き込まれ、午前8時01分毎朝の予定スクリプトの実行、関心や学生のニーズここで見ることができ、HTTP、スクリプトを書いただけでなく、 、
後でChromeブラウザとchromdriverフラスコウェブサイト、データベース、セレン、tesseract4.0、無インターフェースに基づいてサーバーを展開する方法についての記事を書きます。
セレンコアの使用たとえば、オブジェクトとしてページに対応する要素を見つけるために、セレクタを使用することです:
ブロは、ブラウザオブジェクトのwebdriverをセレンである、あなたは、名前、ID、クラス別の要素を見つけるためにfind_element_byの方法を使用することができ
、これらの場合には要素のどれもが、あなたが興味を持っているXPathの小さなパートナーが詳細を学ぶために行くことができる、XPathを使用することはできませんが、最も簡単な方法は、XPath、それをコピーすることができますF12の開発者モード、右応答要素の後に開くことです。
たTesseract是一个识别引擎、用于识别验证码
輸入pymongo
輸入スケジュール
インポート時の
インポートpytesseract
PILのインポートイメージから
インポートプールをマルチプロセッシングから
BSONインポートのObjectIdから
セレン輸入webdriverをから
インポート日時
輸入ランダム
輸入OSの
デフaddmates(matesid、framenum、BRO) :
button_addmates = bro.find_element_by_id( "ハンドル加算")
button_addmates.click()
bro.switch_to.frame( "xubox_iframe" + STR(framenum))
input_matesid = bro.find_element_by_id( "CARDNO")
input_matesid.send_keys(matesid)
button_findmate = bro.find_element_by_class_name( "検索ID")を
button_findmate.click()
input_existmates = bro.find_elements_by_class_name( "ユーザ")
oldcontacts = []
input_existmatesでinput_existmate用:
#プリント(input_existmate.get_attribute( "のTextContent"))
(。input_existmate.get_attribute("のTextContent")ストリップ())oldcontacts.append
時間。睡眠(1)
#プリント(bro.page_source)
input_newcontact = bro.find_element_by_id( "接触")
#印刷(input_newcontact.get_attribute( "のTextContent"))
newcontact = input_newcontact.get_attribute( "のTextContent")
newcontactない場合はoldcontactsで:
button_addtocontacts = bro.find_element_by_class_name( "ユーザーの追加")
button_addtocontacts。()をクリックし
time.sleep(1)
他の:
input_existmatesでinput_existmateため:
。input_existmate.get_attribute( "のTextContent")ストリップ()== newcontact場合:
チェックボックス= input_existmate.find_element_by_name( "ユーザ")
checkbox.click()
time.sleep(1)
button_submitaddmates = bro.find_element_by_class_name(」デル-すべてのユーザー」)
button_submitaddmates.click()
ブレーク
#ssl._create_default_https_context = ssl._create_unverified_context
デフメイン(reserverdic、受注コード):#
隐藏浏览器界面
オプション= webdriver.ChromeOptions()
option.add_argument( 'ヘッドレス')
オプション.add_argument( ' -なし-サンドボックス')
BRO = webdriver.Chrome(オプション=オプション)
#BRO = webdriver.Chrome()
印刷( "クローム已启动")
URL =「https://newids.seu.edu.cn/authserver/login?goto=http:/ /my.seu.edu.cn/index.portal」
bro.get(URL)
#プリント(bro.page_source)
#のbro.save_screenshot( "ddd.png")
#print( "保存")
#登录预约系统
ID = reserverdic [ "idpwd"] [ "SSID"]
PWD = reserverdic [ "idpwd"] [ "PWD"]
time.sleep(3)
input_username = bro.find_element_by_id( "ユーザ名")
input_password = bro.find_element_by_id( "パスワード")
input_username.send_keys(ID)
input_password。send_keys(PWD)
#プリント(input_username)
#プリント(input_password)
クラスの#の複数の直接次の形式find_element_by_class使用することができない
botton_login = bro.find_element_by_css_selector( "[クラス= 'auth_login_btnプライマリFull_width']")
botton_login.click()
#URL3 =「http://yuyue.seu.edu.cnを/eduplus/order/initOrderIndex.do?sclId=1 "
#1 bro.get(URL3)
#オープンスケジューラ
情報reserverdic = ["情報"]
#インフォメーション= {
# 'dayInfo':" 2018年11月23日」、
#'のitemId' :. 7、#
'時間': "12はある:00-13:00"
#}
#= INFOURL urllib.parse.urlencode(情報)
"" "
'のitemId' :. 7、Jiulonghuピンポン、1-3人
8、Jiulonghuバスケットボール、9-14観客、ハーフ5-8: 'ITEMID'
'のitemId':9、Jiulonghuバレーボール、4-15人が
'ITEMID':10、Jiulonghuバドミントン、1-5人
「ITEMID」:11、ドラゴン湖のダンスは、非必須の
「ITEMID」:12、ドラゴン湖のフィットネスは、非必須の
「ITEMID」:13、龍湖武道は、非必須の
「ITEMID」:14、龍湖テコンドーを、非必要な
'ITEMID':15、4つのアーチバドミントン、1-3人
'のitemId':16、4つのアーチピンポン、1-3人
'のitemId':17、4つのアーチテニス、1-3人
"" "
URL2 =" http://yuyue.seu.edu.cn/eduplus/order/initEditOrder.do?sclId=1&dayInfo="+info['dayInfo']+"&itemId="+info['itemId']+"&time="+インフォ[ "時間"]
#印刷(URL2)#
のbro.execute_script( "window.open()")
#1 bro.switch_to.window(bro.window_handles [1])
bro.get(URL2)
全体で#バスケットボールハーフコートの契約フィールド
「バスケットボール= reserverdic [phonemate "] [" halffull "]
バスケットボール== 2の場合:
buttonhalffull = bro.find_elements_by_name( "orderVO.useMode")
buttonhalffull [1] .click()
#添加电话
PHONENUMBER = reserverdic [ "phonemate"] [ "電話"]
input_phone = bro.find_element_by_id( "電話")
input_phone.clear( )
input_phone.send_keys(PHONENUMBER)
#添加好友
framenum = 0
reserverdicでeachmateため[ "phonemate"] [ "mateid"]:
framenum + = 1
addmates(eachmate、framenum、BRO)
time.sleep(1)
#处理验证码
スクリーンショット= STR(random.randint(1,100000))+ 'screenshot.png'
validcodeshot = STR(random.randint(1,100000))+ 'validateimage.png'
BRO。get_screenshot_as_file(スクリーンショット)
IMG = bro.find_element_by_xpath( '// * [ID @ = "FM"] /テーブル/ TBODY / TR [6] / TD [2] / IMG')
左= INT(img.location [ 'X'])
トップ= INT(img.location [ 'Y'])
右= INT(img.location [X ''] + img.size [ '幅'])
ボトム= INT(img.location [ 'Y'] + img.size [ '高'])
处理图像#1通过イメージ
IM = Image.open(スクリーンショット)
IM = im.crop((左、上、右、下))
im.save(validcodeshot)
IMG = Image.open(validcodeshot)
validcode = pytesseract.image_to_string(IMG)
#プリント(validcode)
input_validcode = bro.find_element_by_id( "validateCode")
input_validcode.send_keys(validcode)
button_reserve = BRO。find_element_by_id(「提出します」)
button_reserve.click()
os.remove(スクリーンショット)
os.remove(validcodeshot)
time.sleep(1)
してみてください:
alertcontent = bro.find_element_by_css_selector( "[クラス= 'xubox_msg xubox_text']")
であればalertcontent.get_attribute( "のTextContent" ):
UpdateStatusを(受注、alertcontent.get_attribute( "のTextContent")+ "预约失败")
プリント(alertcontent.get_attribute("のTextContent")、 "预约失败")
bro.quit()
戻り0
例外を除い:
bro.quit ()
UpdateStatusを(受注、 "预约成功")
、印刷( "预约成功")
リターン1
DEF)(MMAIN。
試験#
#reserverdic1 = {
# "Idpwd":{
# 'SSID':220 187 988、
#'PWD': "MIMA"
#}
# "情報":{
# 'dayInfo': "2019年9月2日"、
#は'アイテムID'、」7。 」、
#'時間':'12:00-13:00」
#}、
#"phonemate ":{
#"電話":1885187965558、
#" mateid ":[220 184 346]、すべての友達リスト#IDの
#" halffull" :1#1が2半分、非デフォルトのビット1バスケットボール、または空示し、全体を表す
#}
#}
#reserverdic2 = {
{# "idpwd"
、220 175 358:# 'SSID'を
# 'PWD': "美馬"
#}
# "情報":{
# 'DayInfo': "2019年9月8日"、
#は'アイテムID':、」7" 。
# '時間':'17:00-18:00」
#}
# "phonemate":{
# "電話番号": 18851879658、
#"mateid":[220 184 348]、すべての友人リスト#1のID
# "halffull":第1位2の半分を示し、聴衆を表し、デフォルト以外のビット1バスケットボール、または空
#}
#}
#=グループ[ reserverdic1、reserverdic2]
オーダーリスト= getorderlist()
IFないオーダーリスト:
印刷(STR(datetime.date.today())、 "いいえ注文")
プール=プール()
pool.map(doorder、オーダーリスト)
#1 pool.map(メイン、グループ)
DEFのdoorder(注文):
試してみてください。
印刷(「プロセス・オーダー」、順序)
メイン(オーダー[0]、順[1])
の例外を除い:
newstutas = "预约失败、检查提交信息是否出错"
UpdateStatusを([1]、newstutas順)
プリント(newstutas)
DEF(getorderlist):
今日= datetime.date .today()
MyClientという= pymongo.MongoClient( "のMongoDB:// localhostの:27017 /")
MYDB = MyClientという[ "オーダー"]
mycol = MYDB [ "オーダー"]
findresult = mycol.find({ '日':STR(今日)}、{ "reservedic":1、 "_ ID":1})
オーダーリスト= []
findresultにおけるxについて:
orderlist.append([X [ "reservedic"]はx [ "_ IDが"]])
オーダーリストを返す
DEF UpdateStatusを(受注、newinfo):
MyClientという= pymongo。MongoClient( "MongoDBは:// localhostを:27017 /")
MYDB = MyClientという[ "オーダー"]
mycol = MYDB [ "オーダー"]
mycol.update_one({ "_id"のObjectId(受注)}、{ "$セット":{ "ステータス":newinfo}})
であれば__name__ == '__main__':
#1 MMAIN()
MMAIN()
#のschedule.every()day.at('08:00' )。。ん(MMAIN)
真しばらく#:
#1 schedule.run_pending()