爬取Django 绕过csrf实现批量注册

版权声明:版权所有,转载请注明出处 https://blog.csdn.net/weixin_41733260/article/details/88786923

本文只是提供一些经验,实际情况下因地制宜。


自己做了个Django项目,缓存用的是redis,部署到云服务器上,想要通过爬虫自动化注册账号。话不多说,一步步做。

首先要准备账号数据,chorme利用ctrl+shift+i看一下注册提交的是什么数据。因为post提交有个csrf验证的东西,还有个验证码,这个我们先不管,先把其余数据处理好。

当然也可以做成json格式,这里用的是xlsx来做,接下来我们提取一下数据。

import xlrd
def get_data(filename,sheetnum):
    dir_case = 'E:\\LearnPython\\' + filename + '.xlsx'
    data = xlrd.open_workbook(dir_case)
    table = data.sheets()[sheetnum]
    nor = table.nrows
    nol = table.ncols
    dict1 = {}
    for i in range(1, nor):
        for j in range(nol):
            title = table.cell_value(0, j)
            ctype = table.cell(i, j).ctype
            value = table.cell_value(i, j)
            if ctype == 2 and value % 1 == 0.0:  # ctype为2且为浮点
                value = int(value)  # 浮点转成整型
                value = str(value)  # 转成整型后再转成字符串,如果想要整型就去掉该行
            dict1[title] = value
        yield dict1

这里数字类型的账号密码和手机号码后尾都加了.0,于是我利用ctype判断格式后进行转换为整型。返回生成的dict1

接下来要获取 csrfmiddlewaretoken 这个token,这个其实在网页里有出现

url = '注册页面'
req1 = requests.get(url)
soup = BeautifulSoup(req1.text, "html.parser")
csrfmiddlewaretoken = soup.find("input", attrs={'name': 'csrfmiddlewaretoken'})["value"]

这个页面是每进行注册就会重新产生的,所以应该将这个放到一个循环里。

接下来获取验证码了,验证码这些一般会存入缓存里,大部分网站利用redis做缓存,于是我们写了个获取验证码的函数

def get_checkcode():
    r = redis.StrictRedis(host="公网ip", password="password", port=6379, db=1)
    for item in r.keys():
        if item != b'runtime' and item != b'caches':
            key = item
        value = r.get(key)
        ret = chardet.detect(value)
        s1 = str(value, encoding='Windows-1252') # 将bytes转换成str
        print(s1)
        res = re.search('	CheckCode”Œ(.*?)”u.', s1)
        if res:
            return res.group(1)
    return None

利用chardet查看value的编码,发现是windows-1252,怪不得用utf8和gbk都一直转不成功,然后利用正则匹配出来验证码。

这个函数运行时候我是刷新页面进行验证的,等到放在requests.get后面又发现获取不到验证码,原来redis都没生成。

弄到这好想说直接selenium+打码平台来自动化算了,可是一想还挺吃亏的,自己的网站自己爬也要给别人钱。

于是又看了一遍注册的过程,发现有个cookie里有个csrftoken和sessionid,或许是我没有加这两个所以没能生成验证码?

然后就找set-cookie这东西,发现requests好像只能拿到csrftoken这个set-cookie,一直拿不到session,再查看之前页面原来在访问之前页面时候就有个set-cookie来设置session。

于是访问主页获取sessionid再访问注册页面获取csrftoken

def get_session():
    req1 = requests.get('主页地址')
    session = req1.headers['Set-Cookie']
    return session

if __name__ == '__main__':
    for i in get_data('01', 0):
        req1 = requests.get(url)
        csrftoken = req1.headers['Set-Cookie']
        print(csrftoken[0:74])
        soup = BeautifulSoup(req1.text, "html.parser")
        csrfmiddlewaretoken = soup.find("input", attrs={'name': 'csrfmiddlewaretoken'})["value"]
        data = i
        data['csrfmiddlewaretoken'] = csrfmiddlewaretoken
        session = get_session()
        print(session[0:43])

这样就有了请求头,于是可正常生成验证码接着进行获取。

完整代码参见github

猜你喜欢

转载自blog.csdn.net/weixin_41733260/article/details/88786923
今日推荐