而学习Python爬虫,不仅可以增加自己的知识储备,丰富自己的知识库,而且还能帮助自己增加额外的收入。
以是,本日博主将通过某个盖楼活动贴,来实现自动评论盖楼抽奖功能。本篇内容接着上一篇博文的内容进行全自动盖楼刷评论讲解。
一样平常来说,我们参加某个网站的盖楼抽奖活动,并不是仅仅只参加一个,而是多个盖楼活动一起参加。

这个时候,我们就须要剖析评论的链接是怎么区分不同帖子进行评论的,如上篇的刷帖链接,详细魄式如下:
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 randomimport timefrom selenium import webdriverimport requestsimport 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)就可以通过爬虫知识获取。
运行效果如头图所示。