Python爬蟲之用Xpath獲取關鍵標簽實現自動評論蓋樓抽獎(二)
一、分析鏈接
上一篇文章指路
一般來說,我們參加某個網站的蓋樓抽獎活動,並不是僅僅隻參加一個,而是多個蓋樓活動一起參加。
這個時候,我們就需要分析評論的鏈接是怎麼區分不同帖子進行評論的,如上篇的刷帖鏈接,具體格式如下:
https://club.hihonor.com/cn/forum.php?mod=post&action=reply&fid=154&tid=21089001&extra=page%3D1&replysubmit=yes&infloat=yes&handlekey=fastpost&inajax=1
這裡面用於區分不同帖子的鍵是tid,不妨大傢可以會看上一篇博文評論帖子的鏈接,是不是同樣有一個21089001的數字。
而經過博主的測試,該網站評論post請求網址除瞭tid之外,其他數據是一模一樣的並不需要變更。所以,我們切換新帖子評論時,隻需要替換tid的值就行。
二、切分提取tid
讀者可以自行隨便打開一個該網站的帖子,我們一般會得到如下形式的字符串帖子鏈接:
https://club.hihonor.com/cn/thread-26194745-1-1.html
這裡,我們需要應用字符串切割知識,來獲取鏈接字符串種的長數字字符串26194745。具體代碼如下:
import re # 獲取需要評論的所有網頁鏈接 url_start = "https://club.hihonor.com/cn/forum.php?mod=post&action=reply&fid=4515&tid=" url_end = "&extra=page%3D1&replysubmit=yes&infloat=yes&handlekey=fastpost&inajax=1" url = [] # 評論網頁 txt_url = [] # 提供的網頁(格式不同) f = open("隨機帖子.txt", "r", encoding='utf-8') line = f.readline() # 讀取第一行 while line: if re.match(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', line): txt_url.append(line.strip()) # 列表增加 line = f.readline() # 讀取下一行 datas = [] headers = [] for i in txt_url: url_start = "https://club.hihonor.com/cn/forum.php?mod=post&action=reply&fid=4515&tid=" url_end = "&extra=page%3D1&replysubmit=yes&infloat=yes&handlekey=fastpost&inajax=1" url.append(url_start + i.split("-")[1] + url_end)
這裡,博主將一大堆需要評論的鏈接全部放到文本文件之中,然後通過讀取文件獲取每一行鏈接數據(其中用正則表達式判斷鏈接是否合法)。
在通過遍歷鏈接切分獲取帖子標識數字字符串,最後進行拼接獲取到真正的post評論鏈接。
三、隨機提取評論的內容
在眾多的網站蓋樓活動中,官方網站一般都會檢測是否有內容重復,一般同一個賬號多次評論重復的內容,肯定會被禁止評論一段時間。
所以,我們需要將評論的內容多樣化,比如說這個網站要我們稱贊手機性能進行蓋樓抽獎,那麼我們就需要備用一些評論文字,方便程序隨機獲取。
具體文字放置在txt文件中,我們通過下面的代碼進行讀取:
# 獲取需要評論的文本內容 txt_contents = [] f = open("回帖文案.txt", "r", encoding='utf-8') line = f.readline() # 讀取第一行 while line: if line.strip() != "": txt_contents.append(line.strip()) # 列表增加 line = f.readline() # 讀取下一行 print(txt_contents) count = len(txt_contents)
假如,我們是需要參加遊戲論壇的蓋樓評論活動,那麼就可以用下面的文本進行隨機提取評論,樣本越多,重復性越少。
四、蓋樓刷抽獎
一般來說,這種經常有活動的網站都是需要驗證登錄的。而各個網站的驗證碼算法都不相同,怎麼自動登錄賬號,往往就非常關鍵瞭。
對於識別驗證碼,我們要麼用百度,騰訊,阿裡雲提供的文字識別接口,但是博主試過瞭都無法保證百分百識別成功,而且最高識別準備率都不到50%。
如果需要自己寫機器學習識別算法,那麼學過機器學習的都應該知道,這個是需要龐大的標記的,哪怕你真的做出來,恐怕人傢網站又會換瞭驗證方式。
這種驗證碼與防驗證碼一直在進步,花費大量實現標註驗證碼這些內容,往往會浪費大量的時間,到最後人傢可能又換瞭。
所以,博主的建議還是自己手動輸入驗證碼,也就這一步輸入驗證碼手動,其他的全自動。完整代碼如下:
import random import time from selenium import webdriver import requests import re # 獲取需要評論的文本內容 txt_contents = [] f = open("回帖文案.txt", "r", encoding='utf-8') line = f.readline() # 讀取第一行 while line: if line.strip() != "": txt_contents.append(line.strip()) # 列表增加 line = f.readline() # 讀取下一行 print(txt_contents) count = len(txt_contents) # 獲取需要評論的所有網頁鏈接 url_start = "https://club.hihonor.com/cn/forum.php?mod=post&action=reply&fid=4515&tid=" url_end = "&extra=page%3D1&replysubmit=yes&infloat=yes&handlekey=fastpost&inajax=1" url = [] # 評論網頁 txt_url = [] # 提供的網頁(格式不同) f = open("隨機帖子.txt", "r", encoding='utf-8') line = f.readline() # 讀取第一行 while line: if re.match(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', line): txt_url.append(line.strip()) # 列表增加 line = f.readline() # 讀取下一行 datas = [] headers = [] for i in txt_url: url_start = "https://club.hihonor.com/cn/forum.php?mod=post&action=reply&fid=4515&tid=" url_end = "&extra=page%3D1&replysubmit=yes&infloat=yes&handlekey=fastpost&inajax=1" url.append(url_start + i.split("-")[1] + url_end) # 獲取賬號 usernames = [] f = open("賬號.txt", "r", encoding='utf-8') line = f.readline() # 讀取第一行 while line: usernames.append(line.strip()) # 列表增加 line = f.readline() # 讀取下一行 for name in usernames: browser = webdriver.Chrome() browser.implicitly_wait(10) browser.get("https://club.hihonor.com/cn/") time.sleep(5) login_text = browser.find_element_by_xpath("//*[@id='loginandreg']/a[1]") login_text.click() username = browser.find_element_by_xpath( '/html/body/div[1]/div[2]/div/div/div[1]/div[3]/span/div[1]/span/div[2]/div[2]/div/input') password = browser.find_element_by_xpath( '/html/body/div[1]/div[2]/div/div/div[1]/div[3]/span/div[1]/span/div[3]/div/div/div/input') username.send_keys(name) password.send_keys("密碼")#所有蓋樓刷評論賬號密碼盡量統一,這樣就可以隻在txt每行輸入賬號即可 sign = browser.find_element_by_xpath( '/html/body/div[1]/div[2]/div/div/div[1]/div[3]/span/div[1]/span/div[6]/div/div/span/span') #等待10秒,讓程序運行者輸入驗證碼 time.sleep(10) sign.click() time.sleep(2) cookie = [item["name"] + "=" + item["value"] for item in browser.get_cookies()] cookiestr = ';'.join(item for item in cookie) url2 = "https://club.hihonor.com/cn/thread-26183971-1-1.html" time.sleep(2) browser.get(url2) posttime = browser.find_element_by_id("posttime") posttime = posttime.get_attribute("value") formhash = browser.find_element_by_name("formhash") formhash = formhash.get_attribute("value") browser.close() data = { "formhash": formhash, "posttime": posttime, "usesig": "1", "message": txt_contents[0], } header = { "accept": "application/json, text/javascript, */*; q=0.01", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "zh-CN,zh;q=0.9", "Content-Length": "146", "sec-ch-ua": '"Google Chrome";v="87", "\"Not;A\\Brand";v="99", "Chromium";v="87"', "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Mobile Safari/537.36", "Cookie": cookiestr, "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "X-Requested-With": "XMLHttpRequest", } datas.append(data) headers.append(header) while True: z = 0 if int(time.strftime("%H%M%S")) <= 220000: url_num = random.sample(range(0, len(url)), len(url)) for i in url_num: j = 1 for data, header in zip(datas, headers): data['message'] = txt_contents[random.randint(0, count - 1)] res = requests.post(url=url[i], data=data, headers=header) if '回復發佈成功' in res.text: print("賬號{0}回復成功".format(j)) else: print(res.text) j += 1 z += 1 time.sleep(5) print("已經評論{0}條".format(str(z)))
如上面代碼所示,我們的賬號也是用txt文件統一處理的,這樣可以達到多個賬號同時刷的目的,當然一般網站獲獎都不能是同一個IP,這裡讀者可以通過代理來處理。
其實登錄後,隨便一個帖子都有posttime與formhash兩個值,隻要你隨機打開一個帖子(url2)就可以通過爬蟲知識獲取。
到此這篇關於Python爬蟲之用Xpath獲取關鍵標簽實現自動評論蓋樓抽獎(二)的文章就介紹到這瞭,更多相關Python實現自動蓋樓抽獎內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 還在手動蓋樓抽獎?教你用Python實現自動評論蓋樓抽獎(一)
- python淘寶準點秒殺搶單的實現示例
- python+selenium小米商城紅米K40手機自動搶購的示例代碼
- Python實現12306自動搶火車票功能
- python+selenium對table表和分頁處理