要想持久的使用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方法
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
值得注意的是,浏览器复制到程序,可能有不必要的空格,需要做些处理,然后加到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,很容易因为时间的过期问题,被服务器拒绝。建议用第一种方法。