模拟登录模块以及获取cookie

一、使用session请求(持续的采用保存的cookie访问)

要想持久的使用cookie访问,requests提供了session,用于会话,每次采用保存的cookie访问页面

cookie与session关系参考https://www.cnblogs.com/wangyuyanhello/p/9749552.html

import base64

from PIL import Image
from lxml import etree

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36',
    'Referer': 'http://zujuan.xkw.com/czyw/',
    'Host': 'www.jyeoo.com',
}
def login_before():

    url = "http://www.jyeoo.com/account/loginform"
    response= requests.get(url,headers=headers)
    print(response.headers['Set-Cookie'])
    print("*"*20)
    return response
def do_login():
    response = login_before()

    base_url = "http://www.jyeoo.com"
    AnonID = (etree.HTML(response.text).xpath('//*[@id="AnonID"]/@value'))[0]
    img_url = (etree.HTML(response.text).xpath('//*[@id="capimg"]/@src'))[0]
    img_url = base_url + img_url
    print(img_url)
    captcha_form = response
    Email = '*********'
    Password = "*************"
    image = requests.get(img_url)
    with open("1.jpg", 'wb+') as f:
        f.write(image.content)
    img = Image.open('1.jpg')
    img.show()
    ver_code = input('输入验证码:')
    url = 'http://www.jyeoo.com/account/loginform'
    payload = {'Email':Email, 'Password': base64.b64encode(bytes(Password, "utf-8")), 'Captcha': ver_code,
               'Remember': 'false', 'Ver': 'True', 'AnonID':AnonID, 'Title': '',
               'RUrl': ''}
    #建立一个session,用会话进行请求
    session = requests.session()  # 建立一个Session
    response=session.post(url, data=payload,headers=headers)
    cookies= response.headers['Set-Cookie']
    print("post请求获取cookie:",cookies)
    print("*" * 20)

    index_url ="http://www.jyeoo.com/math3/ques/partialques?f=0&q=a7b3c3f4-60c7-4d77-8bbb-3ed17d240b0b~75608b62-b081-4862-8214-1b45b72cd0ec~43&lbs=&pd=1&pi=1&r=0.2066598986493784"
    response =session.get(index_url)
    cookies= response.headers['Set-Cookie']
    print("get请求获取cookie:",cookies)
    print("*" * 20)
    return response

def get_cookie():
    response =do_login()
    print(response.text)

if __name__ == '__main__':
    get_cookie()


1、headers内容尽量与浏览器保持一致,从包里找找看

2、url = "http://www.jyeoo.com/account/loginform"

这个链接只有登录的时候才能找到,所以要自己登录一遍,开启抓包模式,一定要勾选下图的选项,这样可以记录前一页的包的信息,登录后跳转这个包就会被清除,一定勾选!!!,找到时候采用过滤模式POST方法

模拟登录模块以及获取cookie_第1张图片

3、response.headers['Set-Cookie']

从返回的response中获取cookie,这里简单讲下原理,没有登录是不会带有cookie的,这个cookie要从服务器获取,这样才能建立起会话,这是无状态的,服务器只认cookie,我们得到这个返回来的cookie不能扔掉,要带着继续访问,才能持续与服务器交互,否则,服务器仍然认为我们没有登录,跳转到登录页面,也就是服务器会检查cookie存在以及正确性。

4、etree.HTML()

可以将html字符串转变为xml标签,更厉害的是,可以将不完整的html标签补全!!!

之后就可以使用xpath进行数据提取

5、验证码图片的下载

requests访问验证码图片url,将内容以二进制的形式存储到本地,使用Image打开的图片。

6、payload为formdata的内容,formdata就是post提交表单的内容,包括登录有关的信息(用户名、密码、验证码),formdatad 的内容根据http://www.jyeoo.com/account/loginform包填写

7、base64.b64encode(bytes(Password, "utf-8"))

密码要进行base64加密,为什么是base64.....看到formdata中密码结尾有  “=”,推断出base64......,其中先要utf-8进行二进制编码。

结果:

 

从结果上来看:

获取的cookie与从浏览器获取的cookie并不相同,主要在于js会对cookie进行操作,特定的函数会更改cookie。在浏览器上禁止js,与我们获取的结果应该是一致的。

说到cookie各个字段的作用,请参考:https://www.cnblogs.com/bq-med/p/8603664.html

二、从浏览器中粘取cookie

值得注意的是,浏览器复制到程序,可能有不必要的空格,需要做些处理,然后加到headers中就可以啦,直接requests.get(url,headers=headers)请求,毕竟是字符串,哎

def cookie_str():
    cookiess ="QS_ED=13; QS_BK=a7b3c3f4-60c7-4d77-8bbb-3ed17d240b0b; jyean=7HS-aKILhglZo5AvAoyAX3fEOTO5eE8l-iAOpcuLl_G-XzoDtkUqM8oQOqh3zx5IWXtZ7VGjWpB1jtjeQSiSLPXEfrygTP8UB3idhQcOtjkj7e6ZalxOssF2tpLfKFG00; UM_distinctid=16c216ce23c85-0a2a93f7a5d5dd-4446062d-100200-16c216ce23d160; jy_user_lbs_math=; jy_user_lbs_math3=; jy_user_lbs_chinese3=; jy_user_lbs_chemistry2=; jye_math3_paper_q=a7b3c3f4-60c7-4d77-8bbb-3ed17d240b0b~5fb7373b-78fa-4e56-b944-f72ee3f46208~; jy_user_lbs_chemistry=; jy_user_lbs_physics=; LF_Email=***********; jy_user_lbs_math0=; jy_user_lbs_english3=; jye_cur_sub=math3; jye_notice_yd_notenough=1|2019/8/12 11:28:55|0|false; jy=0258EBDDAEDE7988137E14465C902859CD5B453FA3F4ED048BFBEB5404D359B3139260FCDC1DCF5AE8C9DC080C1E6B9C1BA7BF6F7D019D083B7F1A24BDF28C9D7D92AFFA74FC151A48A2808B8EFACB6EDB426182711AD6120FC2813015993E48809B03F0A79EA95CBAAD819989869B1607DC33853E0BE96ED778C4767D893948B80D15C63CF3DA4FEC1BE31AC3D44D9BE82B26F78FE52AB5490285C02DFF1A7B314B59E3734AAEFF50B458E5EAF01C3BA26D91737A943E897B5704AD8CA276AFA9231C3FF598517FC73EAC98F68C1EAAEF4E1C82DC57AA836E1023F16059B034C4355ED15CA35E2F73DCDE801410602A29C360B430482211747B171C3C5A29A7FACF2EF1D39EA7E1298ABDF9F3F7CE29681F06C611435C469B38C7542C245EA5D3691619C6985AFCDC09DC6483101464DA3F9E494DEED8E22C620180C1B7507ED181856379ADDDB48E4C51EB06D59C2D; CNZZDATA2018550=cnzz_eid%3D2050366909-1563926195-null%26ntime%3D1565582482"
    ss = cookiess.split(";")
    a=[]
    for s in ss:
    	a.append(s.strip()+";")
    str= "".join(a)
    print(str)
    return str
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36',
        'Referer': 'http://zujuan.xkw.com/czyw/',
        'Cookie': ""
    }
headers["Cookie"] =cookie_str()

总结:

各个网站都对身份认证做了要求,所以,为了cookie更好的对用户进行行为的追踪,网站对IP的反爬的限制,可能造成误伤,所以通过cookie反爬也是各个网站常用的方法。

第一种方法,采用了模拟登陆,保存cookie的办法,需要自己对包有一定的分析,不过也不难,主要是耐心加技巧;

第二种办法,采用简单粗暴的方式,直接获取,这个cookie已经被js修改过了,大部分的网站不会让所以的工作在服务器上进行,往往通过js脚本,先做下判断,这个被js脚本更改过的cookie,很容易因为时间的过期问题,被服务器拒绝。建议用第一种方法。

你可能感兴趣的:(爬虫)