Python爬虫之用Xpath获取关键标签实现自动评论盖楼抽奖(二)
作者:一天一篇Python库 发布时间:2021-02-11 00:58:03
一、分析链接
上一篇文章指路
一般来说,我们参加某个网站的盖楼抽奖活动,并不是仅仅只参加一个,而是多个盖楼活动一起参加。
这个时候,我们就需要分析评论的链接是怎么区分不同帖子进行评论的,如上篇的刷帖链接,具体格式如下:
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)就可以通过爬虫知识获取。
来源:https://blog.csdn.net/liyuanjinglyj/article/details/117326682


猜你喜欢
- 对我当前工程进行全部测试需要花费不少时间。既然有 26 GB 空闲内存,为何不让其发挥余热呢? tmpfs 可以通过把文件系统保
- 许多游戏玩家一定会对游戏中的动态鼠标指针有很深的印象,其实只要一句简单的CSS(层叠样式表),你也能在网页上实现这种效果。首先,你需要一个鼠
- 前言接着上一篇的故事工厂模式继续,手机要出厂,显然光一个手机肯定是不行的,还需要包装盒、充电器等等东西。我们按照上一篇提到的工厂模式,去建立
- 欢迎来到 Python Httpx 教程。在本教程中,我们将深入探讨 Httpx 库,并学习如何使用它来构建高性能的异步网络应用程序。什么是
- 从本文开始,本系列将介绍python简单案例并进行代码展示,本文的案例是利用pandas库实现读取csv文件并按照列的从小到大进行排序。前言
- 一、数字类型。数字类型按照我的分类方法分为三类:整数类、小数类和数字类。 我所谓的“数字类”,就是指DECIMAL和NUMERIC,它们是同
- 当一个页面上有一百个表单项,你是怎么获取上面的值勤的?这是一段简单的代码,你试试这段代码,试过后,欢迎留言说一下你的想法?index.asp
- 一、前言作为一个数据库爱好者,自己动手写过简单的SQL解析器以及存储引擎,但感觉还是不够过瘾。<<事务处理-概念与技术>&
- 本文实例讲述了python实现的用于搜索文件并进行内容替换的类。分享给大家供大家参考。具体实现方法如下:#!/usr/bin/python
- python的注释方式和C语言、C++、java有所不同python语言中,使用‘#' 来进行注释,其次还有使用 三个引号来进行注释
- NOMONEYDAY123114321-45324212-102250331008为了符合阅读习惯,最终报表希望是如下格式:NOMONTUE
- 给内存和cpu使用量设置限制在linux系统中,使用Python对内存和cpu使用量设置限制需要通过resource模块来完成。resour
- 处理数据的时候,偶然遇到要把一个Dataframe中的某些行添加至一个空白的Dataframe中的问题。最先想到的方法是创建Datafram
- 谷歌的potobuf不说了,它很牛B,但是对客户端对象不支持,比如JavaScript就读取不了。Jil很牛,比Newtonsoft.Jso
- 一、引言生成数据库表有下面的三种方式:代码生成。程序包管理器控制台迁移。命令行迁移。下面分别介绍上面的三种方法。二、具体示例1、代码生成在程
- <?php /** +------------------------------------------------ * 通用的树型
- 我在传递数据的时候老是出错,请问如何处理?不管是什么数据库,一般来说,是它所包含引号的字符串带来的问题。假设我们使用名为“strDate”的
- 当使用SqlDataSource控件选择数据时,可以从两个属性:ConnectionString和SelectCommand开始,如下所示:
- 今天有朋友问我关于用JAVASCRIPT来进行页面各表单之间的数据传递的问题,我以前也写过,不过从来没有注意,今天总结了一下,希望能够给大家
- 前言文章抄袭在互联网中普遍存在,很多博主都收受其烦。近几年随着互联网的发展,抄袭等不道德行为在互联网上愈演愈烈,甚至复制、黏贴后发布标原创屡