Python爬虫实现无限刷不背单词app的酷币!很有意思!

免责声明:项目只供学习交流使用,请勿商用,商用违法,刷币有封号危险!!!

大家尽量支持正版!!!!

作者:小成Charles原创作品转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/111321299

一、引言

因为考研用到了不背单词app,这个软件做的还是很好的所以就入手了,但是缺点就是里面有一些扩展功能和单词书需要花钱买,内购项目可以用酷币抵用,然后就萌生刷酷币的想法。app中分享的连接只要有一个新用户点进去你就会获得一定量的酷币,因为用户不涉及到账号的登录,所以思路就很简单了,用pyt脚本实现模拟请求链接就可以啦,于是顺着这个思路写了下去。先来成功截图

话不多说,先上成功截图

PS:如学Python遇到问题,需要一系列资料,一个同行交流解答群点击下方字体即可

python免费学习资料以及群交流解答点击即可加入

二、 直接进行Request请求

代码如下

url = 'https://learnywhere.cn/bb/activity/article/2020/0619/news' \

          '?key=108039b518584c6cacafaafa7712bec4&feat=u47617382&sha' \

          're_platform=wechat&show_user_info=1'

    headers = {

        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (K'

                      'HTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 QQBrowser/6.9.11079.201',

    }

        response = requests.get(url, headers=headers)

        print(response.text)

代码设置了浏览器标签,模拟浏览器访问,运行结果大致如下:

d=app></div><script>!(function (a, b) {

        if (!b.__SV) {

          var c, d, e, f;

          (window.dplus = b),

            (b._i = []),

            (b.init = function (a, c, d) {

              function g(a, b) {

                var c = b.split('.');

                2 == c.length && ((a = a[c[0]]), (b = c[1])),

                  (a[b] = function () {

                    a.push([b].concat(Array.prototype.slice.call(arguments, 0)));

                  });

              }.....

然后发现账号的酷币没有任何变化,即使是新设备也毫无作用,然后分析了一下,这个实现的过程是先通过JavaScript渲染的过程,然后通过Ajax从服务器获取数据并判断当前设备是否为新设备,那么request请求是肯定不可用的,于是就想到用selenium来进行渲染获取数据

三、利用selenium和ChormeDriver进行JavaScript渲染

首先安装selenium和ChormeDriver,具体方法请网上查询,不在赘述。

前期准备:

这里我们尽量准备大约一千个‘User-Agent’用来添加到headers,这里直接在网上找个在线生成器就可以(网上一大堆),然后我方便测试就放在一个txt文档如图所示一大堆

然后此代码块实现读取并存到数组中,并随机获取一个agent:

def get_agen_list():

    with open("D:/0DESK/UserAgentList.txt", 'r') as file_to_read:

        while True:

            lines = file_to_read.readline()

            if not lines:

                break

                pass

            listAgent.append(lines)

            pass

    print(len(listAgent))

get_agen_list()

# 随机获取一个agent

USER_AGENT = listAgent[random.randint(0, 999)]

接下来就是实现渲染了,执行一下代码就可以发现界面显示你是新用户,然后app中的酷币也相应的增加了:

chrome_options = Options()

    chrome_options.add_argument("--User-Agent="+USER_AGENT)

    browser = webdriver.Chrome(chrome_options=chrome_options)

    browser.get('https://learnywhere.cn/bb/activity/article/2020/0619/news?key=0926438a01e84a34bb1823447ddb007f&feat'

                '=u47617382&share_platform=wechat&show_user_info=1')

其实到这里就基本可以了,但是经测试,同一个IP请求次数过多就会出现你是老用户,大多数网站都会这样的,对付这样的措施我们可以利用代理IP进行访问,实现方法就是给option添加add_argument

四、添加代理IP访问

–以下文章借鉴崔庆才的《Python3 网络爬虫开发实战》

代理IP就可以反IP检测系统了,代理IP可以使用免费的也可以收费的,当然收费的质量很高,更加稳定一些,如下代码实现代理添加的方式,如果你的代理IP是没有账号密码的可以这样:

from selenium import webdriver

proxy = '127.0.0.1:9743'

chrome_options = webdriver.ChromeOptions()

chrome_options.add_argument('--proxy-server=http://' + proxy)

browser = webdriver.Chrome(chrome_options=chrome_options)

browser.get('http://httpbin.org/get')

在这里我们通过 ChromeOptions 来设置代理,在创建 Chrome 对象的时候通过 chrome_options 参数传递即可。 这样在运行之后便会弹出一个 Chrome 浏览器,访问目标链接之后输出结果如下:

{

  "args": {},

  "headers": {

    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",

    "Accept-Encoding": "gzip, deflate",

    "Accept-Language": "zh-CN,zh;q=0.8",

    "Connection": "close",

    "Host": "httpbin.org",

    "Upgrade-Insecure-Requests": "1",

    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"

  },

  "origin": "106.185.45.153",

  "url": "http://httpbin.org/get"

}

可以看到 origin 同样为代理 IP 的地址,代理设置成功。 如果代理是认证代理,则设置方法相对比较麻烦,方法如下:

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

import zipfile

ip = '127.0.0.1'

port = 9743

username = 'foo'

password = 'bar'

manifest_json = """

{

    "version": "1.0.0",

    "manifest_version": 2,

    "name": "Chrome Proxy",

    "permissions": [

        "proxy",

        "tabs",

        "unlimitedStorage",

        "storage",

        "<all_urls>",

        "webRequest",

        "webRequestBlocking"

    ],

    "background": {

        "scripts": ["background.js"]

    }

}

"""

background_js = """

var config = {

        mode: "fixed_servers",

        rules: {

          singleProxy: {

            scheme: "http",

            host: "%(ip)s",

            port: %(port)s

          }

        }

      }

chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});

function callbackFn(details) {

    return {

        authCredentials: {

            username: "%(username)s",

            password: "%(password)s"

        }

    }

}

chrome.webRequest.onAuthRequired.addListener(

            callbackFn,

            {urls: ["<all_urls>"]},

            ['blocking']

)

""" % {'ip': ip, 'port': port, 'username': username, 'password': password}

plugin_file = 'proxy_auth_plugin.zip'

with zipfile.ZipFile(plugin_file, 'w') as zp:

    zp.writestr("manifest.json", manifest_json)

    zp.writestr("background.js", background_js)

chrome_options = Options()

chrome_options.add_argument("--start-maximized")

chrome_options.add_extension(plugin_file)

browser = webdriver.Chrome(chrome_options=chrome_options)

browser.get('http://httpbin.org/get')

在这里需要在本地创建一个 manifest.json 配置文件和 background.js 脚本来设置认证代理,运行之后本地会生成一个 proxy_auth_plugin.zip 文件保存配置。 运行结果和上例一致,origin 同样为代理 IP。

五、扩展

如果出现以下截一图就说明当前刷币成功,因为你是新用户

然后我们同过检查NetWork下的XHR可以发现网页请求的过程,在report…那一列中我们点击Preview可以发现newDevice的数量为1,说明当前系统判断为新设备,就是成功成功了,如果你想更完善程序的话,可以通过Ajax获取此数据,来进行判断当前请求是否成功

推荐阅读更多精彩内容