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

302 阅读5分钟

免责声明:项目只供学习交流使用,请勿商用,商用违法,刷币有封号危险!!! 大家尽量支持正版!!!!

作者:小成Charles 原创作品 转载请标注原创文章地址:blog.csdn.net/weixin_4299…

一、引言

因为考研用到了不背单词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获取此数据,来进行判断当前请求是否成功