爬虫模拟登陆果壳网

                                                     -

–很多网站需要登录之后爬虫才能获取到有用的信息,一般我们都直接在浏览器复制cookies给爬虫。有些网页可以直接使用爬虫模拟登陆,验证码可以使用图像识别(不过我还没学,就先使用人工了),这样可以达到批量获取cookies。我看到了一个特别简单,适合刚开始练手的网站果壳网登陆

–要想模拟登陆,就需要知道网站在我们登陆的时候做了些什么,照常打开谷歌的F12,随便输入账号密码和验证码,然后看一下all里面的post请求,post的url是果壳网的登陆页面,data参数有csrf_token, username, password, captcha, captcha_rand, permanent。

–接着重复填写几次用户名密码,可以看出username、password、captcha分别是用户名、密码和验证码(其实看名称也知道,但小白还是要验证一遍,万一它用名称迷惑我呢)。captcha_rand应该是这个验证码图片的标识,而csrf_token格式是1541126643.92##bfa04ba124f5bf9bada609e67050ee9be12db312。

–看得出前面的数字是当前时间,而后面的大概是哈希值,md5 的哈希值有16位和32位,这却是40位,应该不是md5,或者不是单纯的md5。我将当前时间、用户名、密码分别做md5计算,发现并没有什么重复的部分,应该不是这几个值的md5加密。可能是服务器随机分配的一些值。

–这怎么办呢?当然要找百度了,百度一番csrf_token只是得到这个只是防止CSRF攻击的一种方法。确实是服务器生成的随机值。继续搜索模拟登陆的随机参数怎么得到,有两种可能:服务器直接返回,服务器返回js动态拼接。

–将登陆页面的源代码通过requests保存下来(为什么不 Ctrl+s 直接保存网页呢?因为直接保存网页的内容是已经动态生成的页面,有这个参数很正常),搜索一下csrf_token,还真有,而且在后面的内容也找到了captcha_rand,这就简单了。

–先使用get请求访问网页,提取这两个参数,验证码只能把它下载下来,你看完再输入给程序,接着模拟post请求,获取cookies,访问一下个人主页。

温馨提示:这里最好使用requests的session(可以在访问下一个网页附带cookies),否则可能出现意想不到的错误。
关于session的使用可以看requests官方文档

下面是源代码:

import requests
import re


headers_login = {
'Accept-Language':'zh-CN,zh;q=0.8',
'Cache-Control':'no-cache',
'Connection':'keep-alive',
'Host':'account.guokr.com',
'Pragma':'no-cache',
'Cookie':'__utmt=1; __utma=253067679.2102330349.1540780238.1540780238.1541122809.2; __utmb=253067679.12.9.1541122812936; __utmc=253067679; __utmz=253067679.1540780238.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utmv=253067679.|1=Is%20Registered=No=1; session=afcf1b0f-c71b-43d2-8046-f60ae28f9b45',
'Referer':'https://account.guokr.com/sign_in/',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.61 Safari/537.36'
}

session = requests.Session()

url = 'https://account.guokr.com/sign_in/'
resp = session.get(url, headers=headers_login)
html = resp.text

csrf_token = re.search(r'id="csrf_token[\s\S]*?(\d+[\s\S]*?)"', html).group(1)
captcha_rand = re.search(r'id="captchaRand[\s\S]*?(\d+)', html).group(1)
img_url = 'https://account.guokr.com/captcha/' + captcha_rand
with open('captcha.jpg', 'wb') as fw:
    fw.write(session.get(img_url, headers=headers_login).content)

username = input('请输入用户名:')
password = input('请输入密码:')
captcha = input('请输入验证码 : ')


data = {
'csrf_token':csrf_token,
'username':username,
'password':password,
'captcha':captcha,
'captcha_rand':captcha_rand,
'permanent':'y ' ,
}

response = session.post(url, data=data)
with open('response.html', 'w', encoding='utf-8') as fw:
    fw.write(response.text)
    
#print(response.cookies)
#print(session.cookies)

headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.61 Safari/537.36'
}
homepage = 'https://www.guokr.com/i/0210199872/'
with open('homepage.html', 'w', encoding='utf-8') as fw:
    res = session.get(homepage, headers=headers)
    fw.write(res.text)







猜你喜欢

转载自blog.csdn.net/Qwertyuiop2016/article/details/83653042
今日推荐