import requestsjavascript
# 建立會話
s = requests.Session()php
# 登陸要請求的地址,
url = "http://www.jokeji.cn/user/c.asp"
# 登陸所須要的get參數
# 經過抓包的到須要傳遞的參數
data = {
'u': '17312345678', # 帳號
'p': '123456', # 密碼
'sn': '1',
't': 'big'
}
# 經過抓包或chrome開發者工具分析獲得登陸的請求頭信息,
headers = {
'Referer': 'http://www.jokeji.cn/User/Login.asp',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}
# 開始登陸
r = s.get(url=url, params=data, headers=headers)
print(r.text)html
# 請求一個登陸以後的頁面
headers1 = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}
url = 'http://www.jokeji.cn/User/MemberCenter.asp'
r = s.get(url=url, headers=headers1)
# 定製字符集
r.encoding = 'gbk'
# 顯示內容
print(r.text)java
一,cookie和session的區別
cookie在客戶的瀏覽器上,session存在服務器上
cookie是不安全的,且有失效時間
session是在cookie的基礎上,服務端設置session時會向瀏覽器發送設置一個設置cookie的請求,這個cookie包括session的id當訪問服務端時帶上這個session_id就能夠獲取到用戶保存在服務端對應的sessionpython
二,爬蟲處理cookie和session
帶上cookie和session的好處:程序員
可以請求到登陸後的界面
1
帶上cookie和session的弊端:web
一個cookie和session每每和一個用戶對應,訪問太快容易被服務器檢測出來爬蟲
1
不須要cookie的時候儘可能不要用ajax
三,處理session,cookie請求
1,cookie請求方式
1.1 直接使用瀏覽器抓包到的現有的cookie進行訪問網站:
放在header字典裏面chrome
header={
"User-Agent":"Mozilla/5.0 (X11; Ubuntu; Linu…) Gecko/20100101 Firefox/64.0",
"Cookie":"csrftoken=JfnuMOvgMGZTxtCjvgfZ…6246vb2; username=chengyangkj",
}
r=request.get(url,headers=header)
1
2
3
4
5
固然也能夠在發送get請求時加上cookies的字典參數:編程
Cookie="csrftoken=JfnuMOvgMGZTxtCjvgfZ…6246vb2; username=chengyangkj"
1
可是接受的參數是字典類型的,這就須要咱們適用字符串分割方法把cookie字符串轉爲字典形式:
Cookie="csrftoken=JfnuMOvgMGZTxtCjvgfZ…6246vb2; username=chengyangkj"
cookies={i.split("=")[1]:i.split("=")[1] for i in Cookie.split("; ")} #先使用for循環遍歷Cookie以」; 「(分號和空格)分開的列表 再分別獲取i以等號分割的列表的[0] [1] 位置填入 字典鍵 和值的位置
r=request.get(url,headers=header,cookies=cookies)
1
2
3
適用於cookie過時時間比較長的網站
2.session請求方式
request提供了一個一個叫作session的類,來實現客戶端和服務端的會話保持
使用方法:
實例化一個session對象
讓session發送get或post請求
再使用session訪問只有登陸以後才能訪問的網站,這時候session會自動帶上服務器保存在其中的信息進行訪問
session=request.session() #實例化session對象
response=session.get(url,header) #使用session對象發送get請求 就能獲取服務端設置的session對象
cookie保存在瀏覽器中,不少瀏覽器限制一個站點最多保存20個cookie
session存在服務器中。
爬蟲cookie和session
1.帶上cookie和session的好處
可以請求到登錄後的頁面
2,弊端
一套cookie和session每每對應一個用戶,請求太快,請求次數太多,容易被識別爲爬蟲
不須要cookie的時候儘可能不去使用cookie
可是有時爲了獲取登錄的頁面,必須發送帶有cookie的請求
處理cookie和session
session
requests提供了一個sessiion類,來實現客戶端和服務器端的會話保持
使用的方法:
1.實例化一個session對象
2.讓session來發送get或post請求
session=requests.session()
response=session.get(url,headers)
例子:
第一種方法:
import requests
def run():
headers = {
'User-Agent': 'ozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'
}
data = {
'username': 'xxxx',
'password': 'xxxx'
}
session = requests.session()
# 使用session發送請求,cookie保存其中
session.post('https://passport.baidu.com/center', headers=headers, data=data)
# 使用session請求登錄後地址,獲得信息返回
r = session.get("https://passport.baidu.com/center", headers=headers)
with open('csdn-1.html', 'w', encoding='utf-8') as f:
f.write(r.content.decode())
if __name__ == '__main__':
run()
第二種方法,直接獲取cookie放在headers中
import requests
def run():
headers = {
'User-Agent': 'ozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36',
'Cookie':'BAIDUID=341732C7B4F15BBC29D34AEACEB3504A:FG=1; PSTM=1542017140;'
' BIDUPSID=2AC22745056694211D23B3E44908D13C; HOSUPPORT=1; '
'UBI=fi_PncwhpxZ%7ETaKARr9ykC%7EUxVaXAd4LMQqiLsD0A7cjJoq7PwEMEJbzj-kwTBzbZ0hiDKutNki369rZtk3; '
'USERNAMETYPE=3; SAVEUSERID=a83c8629c010e3fdeb37bc15bbd859; '
'HISTORY=439af17d04a8573ef0a503db42f7f8eb74194a; cflag=15%3A3; '
'pplogid=1978AIi2iDItRkilaVSoqU%2F1X%2FxJALykIUX9p6Uk4D0coM4%3D; '
'STOKEN=59bc2a92ec36899d06dc0ded956639e6d7ab5fa617516a8ea1656eb926d7081a;'
'BDUSS=ENLNTVSVVRqVFI3SDJwQTJJRm5yWXMwQ35QYW9XM29UTUIxWk83ZGNmb2xlQzFjQVFBQUFBJCQAAAAAAAAAAAEAAACvILVXsaHO7W3OosG5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXrBVwl6wVcR;'
' PTOKEN=d0c63029731a23a92850fccfb5803c10; Hm_lvt_90056b3f84f90da57dc0f40150f005d5=1543891782;'
' Hm_lpvt_90056b3f84f90da57dc0f40150f005d5=1543892594'
}
r=requests.get('https://passport.baidu.com/center',headers=headers)
print(r.content.decode())
with open('csdn-2.html','w',encoding='utf-8') as f:
f.write(r.content.decode())
if __name__ == '__main__':
run()
第三種方式:將cookies字典化
import requests
def run():
url='https://passport.baidu.com/center'
headers={
'User-Agent': 'ozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36',
}
#將cookie轉爲字典
cookies='BAIDUID=341732C7B4F15BBC29D34AEACEB3504A:FG=1;PSTM=1542017140;BIDUPSID=2AC22745056694211D23B3E44908D13C;HOSUPPORT=1;UBI=fi_PncwhpxZ%7ETaKARr9ykC%7EUxVaXAd4LMQqiLsD0A7cjJoq7PwEMEJbzj-kwTBzbZ0hiDKutNki369rZtk3;USERNAMETYPE=3; SAVEUSERID=a83c8629c010e3fdeb37bc15bbd859;HISTORY=439af17d04a8573ef0a503db42f7f8eb74194a; cflag=15%3A3;pplogid=1978AIi2iDItRkilaVSoqU%2F1X%2FxJALykIUX9p6Uk4D0coM4%3D;STOKEN=59bc2a92ec36899d06dc0ded956639e6d7ab5fa617516a8ea1656eb926d7081a;BDUSS=ENLNTVSVVRqVFI3SDJwQTJJRm5yWXMwQ35QYW9XM29UTUIxWk83ZGNmb2xlQzFjQVFBQUFBJCQAAAAAAAAAAAEAAACvILVXsaHO7W3OosG5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXrBVwl6wVcR;PTOKEN=d0c63029731a23a92850fccfb5803c10; Hm_lvt_90056b3f84f90da57dc0f40150f005d5=1543891782;Hm_lpvt_90056b3f84f90da57dc0f40150f005d5=1543892594'
cookies={cookie.split('=')[0]:cookie.split('=')[1] for cookie in cookies.split(";")}
r=requests.get(url=url,headers=headers,cookies=cookies)
with open ('csdn-3.html','w',encoding='utf-8') as f:
f.write(r.content.decode())
if __name__ == '__main__':
run()
不須要創建session對象來獲取cookie直接複製瀏覽器cookie的狀況
1.cookie過時時間很長的網站(學校網站)
2,在cookie過時以前能拿到全部數據
3,配合其餘程序, 其餘程序獲取cookie
獲取登錄後的頁面三種方式
1.實例化session,使用session發送post請求,而後在使用session.get獲取登錄後的信息
2,將cookie信息加入到headers中
3,將cookies字典化,而後調用
PASSWORD = '[{"userId":"**","password":"**"}]'
def getData():
s = requests.Session()#建立一個session對象
s.keep_alive = False #保持一個長鏈接
s.headers.update({'Connection': 'keep-alive'})
for i in range(0,5):
try:
s.post('URL',data=PASSWORD)#該URL爲登陸頁面的URL
s.headers.update({'Content-Type': 'application/x-www-form-urlencoded'})
break
except requests.exceptions.ConnectionError:
time.sleep(1)
continue
s.headers.update({'Content-Type': 'application/x-www-form-urlencoded'})
payload = ''
for count in range(0,5):
print count
try:
rsp = s.post('URL',data=payload)#該URL爲須要獲取數據頁面的F12請求正文內容
#print "rsp",rsp
break
except requests.exceptions.ConnectionError:
time.sleep(1)
continue
#print "rsp",rsp
exportfile ="D:/data.xls"
with open(exportfile,'wb') as out_file:
for chunk in rsp.iter_content():#將文本流保存到文件
out_file.write(chunk)
#若數據無效,則刪除文件
f = open(exportfile, 'rb')
lines = f.read()
isinvalid=re.search("javascript",lines)
if (len(lines)==0) or (isinvalid is not None):
print "this is empty data,system will delete it"
f.close()
os.remove(exportfile)
else:
print "this is valid data"
time.sleep(40)
1、爲何要使用Cookie
Cookie,指某些網站爲了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(一般通過加密)。
好比說有些網站須要登陸後才能訪問某個頁面,在登陸以前,你想抓取某個頁面內容,登錄前與登錄後是不一樣的,或者不容許的。
使用Cookie和使用代理IP同樣,也須要建立一個本身的opener。在HTTP包中,提供了cookiejar模塊,用於提供對Cookie的支持。
http.cookiejar功能強大,咱們能夠利用本模塊的CookieJar類的對象來捕獲cookie並在後續鏈接請求時從新發送,好比能夠實現模擬登陸功能。該模塊主要的對象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。
它們的關係: CookieJar–派生–>FileCookieJar–派生–>MozillaCookieJar和LWPCookieJar
工做原理:建立一個帶有cookie的opener,在訪問登陸的URL時,將登陸後的cookie保存下來,而後利用這個cookie來訪問其餘網址。查看登陸以後才能看到的信息。
一樣,咱們以實例進行講解,爬取伯樂在線的面向對象的漂亮MM的郵箱聯繫方式。
2、實戰
1.背景介紹
在伯樂在線有這麼一個有趣的模塊,面向對象,它說白了就是提供了一個程序員(媛)網上相親的平臺。
URL:http://date.jobbole.com/
它的樣子是這樣的:
能夠看到,這裏有不少的相親貼,隨便點進去就會有網上相親MM的詳細信息,想獲取MM的聯繫方式,須要積分,積分能夠經過簽到的方式獲取。若是沒有登錄帳戶,獲取聯繫方式的地方是這個樣子的:
若是登錄了帳號,獲取聯繫方式的地方是這個樣子的:
想要爬取MM的聯繫郵箱,就須要用到咱們本次講到的知識,Cookie的使用。固然,首先你積分也得夠。
在講解以前,推薦一款抓包工具–Fiddler,能夠在Google Chrome的Google商店下載這個插件,它的樣子是這樣的:
能夠看到,經過這個插件,咱們能夠很容易找到Post的Form Data等信息,很方便,固然也能夠用以前講得瀏覽器審查元素的方式查看這些信息。
2.過程分析
在伯樂在線首頁點擊登錄的按鈕,Fiddler的抓包內容以下:
從上圖能夠看出,真正請求的url是
http://www.jobbole.com/wp-admin/admin-ajax.php
Form Data的內容記住,這些是咱們編程須要用到的。user_login是用戶名,user_pass是用戶密碼。
在點擊取得聯繫郵箱按鈕的時候,Fiddler的抓包內容以下:
從上圖能夠看出,此刻真正請求的url是
http://date.jobbole.com/wp-admin/admin-ajax.php
一樣Form Data中內容要記下來。postId是每一個帖子的id。例如,打開一個相親貼,它的URL是http://date.jobbole.com/4128/,那麼它的這個postId就是4128。爲了簡化程序,這裏就不講解如何自動獲取這個postId了,本實例直接指定postId。若是想要自動獲取,可使用beautifulsoup解析http://date.jobbole.com/返回的信息。beautifulsoup的使用。有機會的話,會在後面的爬蟲筆記中進行講解。
3.測試
1)將Cookie保存到變量中
首先,咱們先利用CookieJar對象實現獲取cookie的功能,存儲到變量中,先來感覺一下:
# -*- coding: UTF-8 -*-
from urllib import request
from http import cookiejar
if __name__ == '__main__':
#聲明一個CookieJar對象實例來保存cookie
cookie = cookiejar.CookieJar()
#利用urllib.request庫的HTTPCookieProcessor對象來建立cookie處理器,也就CookieHandler
handler=request.HTTPCookieProcessor(cookie)
#經過CookieHandler建立opener
opener = request.build_opener(handler)
#此處的open方法打開網頁
response = opener.open('http://www.baidu.com')
#打印cookie信息
for item in cookie:
print('Name = %s' % item.name)
print('Value = %s' % item.value)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
咱們使用以上方法將cookie保存到變量中,而後打印出了cookie中的值,運行結果以下:
2)保存Cookie到文件
在上面的方法中,咱們將cookie保存到了cookie這個變量中,若是咱們想將cookie保存到文件中該怎麼作呢?方便之後直接讀取文件使用,這時,咱們就要用到FileCookieJar這個對象了,在這裏咱們使用它的子類MozillaCookieJar來實現Cookie的保存,編寫代碼以下:
# -*- coding: UTF-8 -*-
from urllib import request
from http import cookiejar
if __name__ == '__main__':
#設置保存cookie的文件,同級目錄下的cookie.txt
filename = 'cookie.txt'
#聲明一個MozillaCookieJar對象實例來保存cookie,以後寫入文件
cookie = cookiejar.MozillaCookieJar(filename)
#利用urllib.request庫的HTTPCookieProcessor對象來建立cookie處理器,也就CookieHandler
handler=request.HTTPCookieProcessor(cookie)
#經過CookieHandler建立opener
opener = request.build_opener(handler)
#此處的open方法打開網頁
response = opener.open('http://www.baidu.com')
#保存cookie到文件
cookie.save(ignore_discard=True, ignore_expires=True)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cookie.save的參數說明:
ignore_discard的意思是即便cookies將被丟棄也將它保存下來;
ignore_expires的意思是若是在該文件中cookies已經存在,則覆蓋原文件寫入。
在這裏,咱們將這兩個所有設置爲True。
運行以後,cookies將被保存到cookie.txt文件中。咱們能夠查看本身查看下cookie.txt這個文件的內容。
3)從文件中獲取Cookie並訪問
咱們已經作到把Cookie保存到文件中了,若是之後想使用,能夠利用下面的方法來讀取cookie並訪問網站,感覺一下:
# -*- coding: UTF-8 -*-
from urllib import request
from http import cookiejar
if __name__ == '__main__':
#設置保存cookie的文件的文件名,相對路徑,也就是同級目錄下
filename = 'cookie.txt'
#建立MozillaCookieJar實例對象
cookie = cookiejar.MozillaCookieJar()
#從文件中讀取cookie內容到變量
cookie.load(filename, ignore_discard=True, ignore_expires=True)
#利用urllib.request庫的HTTPCookieProcessor對象來建立cookie處理器,也就CookieHandler
handler=request.HTTPCookieProcessor(cookie)
#經過CookieHandler建立opener
opener = request.build_opener(handler)
#此用opener的open方法打開網頁
response = opener.open('http://www.baidu.com')
#打印信息
print(response.read().decode('utf-8'))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
瞭解到以上內容,咱們那就能夠開始正式編寫模擬登錄伯樂在線的程序了。同時,咱們也能夠獲取相親MM的聯繫方式。
4.編寫代碼
咱們利用CookieJar對象實現獲取cookie的功能,存儲到變量中。而後使用這個cookie變量建立opener,使用這個設置好cookie的opener便可模擬登錄,同筆記四中講到的IP代理的使用方法相似。
建立cookie_test.py文件,編寫代碼以下:
# -*- coding: UTF-8 -*-
from urllib import request
from urllib import error
from urllib import parse
from http import cookiejar
if __name__ == '__main__':
#登錄地址
login_url = 'http://www.jobbole.com/wp-admin/admin-ajax.php'
#User-Agent信息
user_agent = r'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36'
#Headers信息
head = {'User-Agnet': user_agent, 'Connection': 'keep-alive'}
#登錄Form_Data信息
Login_Data = {}
Login_Data['action'] = 'user_login'
Login_Data['redirect_url'] = 'http://www.jobbole.com/'
Login_Data['remember_me'] = '0' #是否一個月內自動登錄
Login_Data['user_login'] = '********' #改爲你本身的用戶名
Login_Data['user_pass'] = '********' #改爲你本身的密碼
#使用urlencode方法轉換標準格式
logingpostdata = parse.urlencode(Login_Data).encode('utf-8')
#聲明一個CookieJar對象實例來保存cookie
cookie = cookiejar.CookieJar()
#利用urllib.request庫的HTTPCookieProcessor對象來建立cookie處理器,也就CookieHandler
cookie_support = request.HTTPCookieProcessor(cookie)
#經過CookieHandler建立opener
opener = request.build_opener(cookie_support)
#建立Request對象
req1 = request.Request(url=login_url, data=logingpostdata, headers=head)
#面向對象地址
date_url = 'http://date.jobbole.com/wp-admin/admin-ajax.php'
#面向對象
Date_Data = {}
Date_Data['action'] = 'get_date_contact'
Date_Data['postId'] = '4128'
#使用urlencode方法轉換標準格式
datepostdata = parse.urlencode(Date_Data).encode('utf-8')
req2 = request.Request(url=date_url, data=datepostdata, headers=head)
try:
#使用本身建立的opener的open方法
response1 = opener.open(req1)
response2 = opener.open(req2)
html = response2.read().decode('utf-8')
index = html.find('jb_contact_email')
#打印查詢結果
print('聯繫郵箱:%s' % html[index+19:-2])
except error.URLError as e:
if hasattr(e, 'code'):
print("HTTPError:%d" % e.code)
elif hasattr(e, 'reason'):
print("URLError:%s" % e.reason)
————————————————
版權聲明:本文爲CSDN博主「Jack-Cui」的原創文章
1.獲取須要提交的數據
使用chrome的Network或者fiddler能夠很輕易的獲得咱們想要的數據,這裏使用fiddler舉例。
打開fiddler
輸入完帳戶信息和驗證碼後,爲了方便查找,推薦點擊清除清空會話記錄
點擊頁面中的登陸
能夠看到fiddler已經捕捉到了瀏覽器提交的數據
能夠看到點擊登陸後瀏覽器提交的數據,通過簡單的觀察,能夠肯定登陸時提交的是選中的這個
查看右側的詳情瞭解到提交發法是post,發送了一個form。其中uname是帳號,password是密碼,numcode是驗證碼,fid和fidname是機構名,都是明文,處理起來很是方便。
只要照着這個表發送就可以模擬登錄了
在Python的Requests庫中form是一個字典
form = {
'pid':' -1',
'pidName':'',
'fid':'機構碼',
'fidName':'機構名',
'allowJoin':'0',
'isCheckNumCode':'1',
'f':'0',
'productid':'',
'uname':'帳號',
'password':'密碼',
'numcode':'驗證碼',
'verCode':''
}
2.驗證碼
驗證碼其實就是一張圖片,在你向服務器請求完以後,服務器並不知道你看到了哪一張圖,只會將圖片的識別碼做爲一個cookie發送給客戶端,只要在提交驗證碼的時候把cookie同時提交就能夠了。
也就是說咱們能夠先get驗證碼的圖片,再打開登陸頁面,提交form的同時把驗證碼的cookie一塊兒提交就能提早知道驗證碼了。
requests庫中的session()可以自動管理cookie,在我看來就像是模擬了一個瀏覽器
browser = requests.session()
在登陸頁面按F12進入Network,刷新一下
通過判斷code?1515406681840就是驗證碼圖片。右側General的Request Url能夠找到地址
Url_1 = 'http://passport2.chaoxing.com/num/code?1515388254551'#驗證碼地址
Url_2 = 'http://passport2.chaoxing.com/login?refer=http%3A%2F%2Fi.mooc.chaoxing.com'#登陸地址
temp = open("valcode.png","wb")
temp.write(valcode.content)
temp.close()
valc = input("輸入驗證碼:")
form["numcode"]=str(valc)
resp = browser.post(Url_2, headers = headers,data=form)
#把返回的頁面寫入temp_1.html
temp = open("temp_1.html","wb")
temp.write(resp.content)
temp.close()
————————————————
版權聲明:本文爲CSDN博主「lyh_ADT」的原創文章\
點擊右下角的花朵便可送一朵花,左上角顯示當前剩餘數量,規則是每兩分鐘花朵數量恢復成100,每一個帳號能夠一直送。若是僅僅是點擊花朵形狀能夠一直送花的話,是很簡單的,關鍵問題在於它時不時會跳出滑動驗證碼,以下圖所示,這時候就須要解決驗證碼的問題了,固然了,這部分代碼我是參考的別人的。
須要作的準備工做比較多,須要用到的庫有selenium、PIL、openCV庫,還須要安裝Chrome瀏覽器驅動,具體如何安裝我就不詳述了。須要注意一下,安裝OpenCV你們仍是去(https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv)下載.whl格式的文件再pip install,否則會像我同樣走許多彎路... auto_click.py代碼以下:
from selenium import webdriver
from selenium.webdriver.common.by import By
from PIL import Image, ImageEnhance
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import cv2
import numpy as np
from io import BytesIO
import time, requests
class CrackSlider():
"""
經過瀏覽器截圖,識別驗證碼中缺口位置,獲取須要滑動距離,並模仿人類行爲破解滑動驗證碼
"""
def __init__(self):
super(CrackSlider, self).__init__()
# 實際地址
self.url = 'http://3g.163.com/wap/special/newsapp_idol_personal/?starId=14#/home'
self.driver = webdriver.Chrome()
self.wait = WebDriverWait(self.driver, 20)
self.zoom = 2
def open(self):
self.driver.get(self.url)
def get_pic(self):
time.sleep(2)
target = browser.find_element_by_class_name("yidun_bg-img")
template = browser.find_element_by_class_name("yidun_jigsaw")
target_link = target.get_attribute('src')
template_link = template.get_attribute('src')
target_img = Image.open(BytesIO(requests.get(target_link).content))
template_img = Image.open(BytesIO(requests.get(template_link).content))
target_img.save('target.jpg')
template_img.save('template.png')
size_orign = target.size
local_img = Image.open('target.jpg')
size_loc = local_img.size
self.zoom = 320 / int(size_loc[0])
def get_tracks(self, distance):
print(distance)
distance += 20
v = 0
t = 0.2
forward_tracks = []
current = 0
mid = distance * 3/5
while current < distance:
if current < mid:
a = 2
else:
a = -3
s = v * t + 0.5 * a * (t**2)
v = v + a * t
current += s
forward_tracks.append(round(s))
back_tracks = [-3,-3,-2,-2,-2,-2,-2,-1,-1,-1]
return {'forward_tracks':forward_tracks,'back_tracks':back_tracks}
def match(self, target, template):
img_rgb = cv2.imread(target)
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread(template,0)
run = 1
w, h = template.shape[::-1]
print(w, h)
res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
# 使用二分法查找閾值的精確值
L = 0
R = 1
while run < 20:
run += 1
threshold = (R + L) / 2
if threshold < 0:
print('Error')
return None
loc = np.where( res >= threshold)
#print(len(loc[1]))
if len(loc[1]) > 1:
L += (R - L) / 2
elif len(loc[1]) == 1:
print('目標區域起點x座標爲:%d' % loc[1][0])
break
elif len(loc[1]) < 1:
R -= (R - L) / 2
return loc[1][0]
def crack_slider(self,browser):
#self.open()
target = 'target.jpg'
template = 'template.png'
self.get_pic()
distance = self.match(target, template)
zoo = 1.36 #縮放係數,須要本身調整大小
tracks = self.get_tracks((distance + 7 )*zoo) # 對位移的縮放計算
#print(tracks)
slider = browser.find_element_by_class_name("yidun_slider")
ActionChains(browser).click_and_hold(slider).perform()
for track in tracks['forward_tracks']:
ActionChains(browser).move_by_offset(xoffset=track, yoffset=0).perform()
time.sleep(0.5)
for back_tracks in tracks['back_tracks']:
ActionChains(browser).move_by_offset(xoffset=back_tracks, yoffset=0).perform()
ActionChains(browser).move_by_offset(xoffset=-3, yoffset=0).perform()
ActionChains(browser).move_by_offset(xoffset=3, yoffset=0).perform()
time.sleep(0.5)
ActionChains(browser).release().perform()
try:
failure = WebDriverWait(browser, 5).until(EC.text_to_be_present_in_element((By.CLASS_NAME, 'yidun_tips__text'), '向右滑動滑塊填充拼圖'))
print(failure)
except:
print('驗證成功')
return None
if failure:
self.crack_slider(browser)
#if __name__ == '__main__':
browser = webdriver.Chrome()
username="11111111" #填本身的用戶名
passwd="1111111" #填用戶名對應的密碼
browser = webdriver.Chrome()
# 打開的是微博登陸界面,能夠本身改,以前作的時候是qq登陸,可是那個界面電腦端如今登不了了
browser.get('https://api.weibo.com/oauth2/authorize?client_id=469534363&redirect_uri=https%3A%2F%2Freg.163.com%2FouterLogin%2Foauth2%2Fsina_connect.do%3Furl%3Dhttp%253A%252F%252F3g.163.com%252Fwap%252Fspecial%252Fnewsapp_idol_personal%252F%253FstarId%253D222%26url2%3Dhttp%253A%252F%252F3g.163.com%252Ftouch%252Flogin%252F%253Furl%253Dhttp%253A%252F%252F3g.163.com%252Fwap%252Fspecial%252Fnewsapp_idol_personal%252F%253FstarId%253D222%2523%252Fhome%2526fail%26product%3D3g_163%26domains%3D163.com%26display%3Dmobile%26urs_tg%3D3&response_type=code&forcelogin=true&display=mobile')
browser.implicitly_wait(10)
# 須要本身按F12查原網址對應的用戶名和密碼框的id_name
elem=browser.find_element_by_id("userId") #u
elem.send_keys(username)
elem=browser.find_element_by_id("passwd") #p
elem.send_keys(passwd)
elem=browser.find_element_by_class_name("btnP")#.submit()
#elem=browser.find_element_by_id("go")
elem.click()
browser.implicitly_wait(10)
browser.switch_to_window(browser.window_handles[-1])
c = CrackSlider()
k = 1
for i in range(1,70000):
try:
elem=browser.find_element_by_class_name("idol_vote_info")
elem.click()
time.sleep(0.2)
# 設置點擊50次刷新一次
if k%50 == 0:
browser.refresh() # 刷新方法 refresh
print ('test pass: refresh successful')
# 點擊110次休眠50s,能夠本身設置
if k%110 == 0:
print ("click",k)
time.sleep(50)
k += 1
except:
print('-----須要驗證-----')
c.crack_slider(browser)
不過代碼仍然有不完善的地方,由於驗證碼拖動是借鑑的別人的代碼,我也沒有深刻理解,這個驗證大概須要拖動兩三次才驗證成功,不過我以爲已經夠用了。還有程序偶爾會報錯中止運行,這時候就能夠再寫一個小程序,監控這個程序有沒有掛掉,掛掉的話從新運行該程序便可。監控的程序runner.py以下:
import os
from sys import argv
if __name__ == '__main__':
while os.system('python ' + ' '.join(argv[1:])):
print('Halted by exception, restart')
在命令行中輸入
python -m runner auto_click.py————————————————版權聲明:本文爲CSDN博主「jingjing_94」的原創文章