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!

推薦閱讀: