第一种方法:requests直接携带cookies
上代码:
import requests
import re
class myLogin():
def __init__(self):
self.header = {
'User-Agent': 'iTunes/4.2 (Macintosh; U; PPC Mac OS X 10.2)',
'Cookie': '此处填写cookies'
}
self.start_url = 'http://my.youkuaiyun.com/'
def parse(self):
html_str = requests.get(self.start_url, headers=self.header).text
ret = re.findall('china_python', html_str)
print(ret)
def run(self):
self.parse()
if __name__ == '__main__':
start = myLogin()
start.run()
正确登陆后,在浏览器取得cookies,把cookies直接写到headers中,访问时就携带上cookie了,上面我定义parse函数去请求验证,匹配个人主页上的信息,然后结果很是满意,同样我们也能通过requests直接在请求中不通过headers携带。但是这里的cookie的格式是字典形式,因此我们需要对cookies进行格式化处理,下面我将上码:
import requests
import re
class myLogin():
def __init__(self):
self.header = {
'User-Agent': 'iTunes/4.2 (Macintosh; U; PPC Mac OS X 10.2)',
}
cookies = '你的cookies'
self.cookies = {i.split('=')[0]: i.split('=')[-1] for i in cookies.split('; ')} # 字典推导式
self.start_url = 'http://my.youkuaiyun.com/'
def parse(self):
html_str = requests.get(self.start_url, headers=self.header, cookies=self.cookies).text
ret = re.findall('china_python', html_str)
print(ret)
def run(self):
self.parse()
if __name__ == '__main__':
start = myLogin()
start.run()
请求到的结果都是一样的
这里用到一个字典推导式,演示一下:
cookies = 'id=1234; un=name; pw:admin'
cookie = {i.split('=')[0]: i.split('=')[-1] for i in cookies.split('; ')}
print(cookie)
------输出:{'id': '1234', 'pw:admin': 'pw:admin', 'un': 'name'}
------同等于以下方法:-------------------------------------------
cookies = 'id=1234; un=name; pw:admin'
cookies_list = cookies.split('; ')
cookie={}
for i in cookies_list:
dict_list = i.split('=')
cookie[dict_list[0]]=dict_list[-1]
print(cookie)
输出:{'id': '1234', 'pw:admin': 'pw:admin', 'un': 'name'}
第二种方法:实例化session请求登陆
这种方法可以把cookies存储在实例化后的session中,因此请求一次后,用session请求等同于带上cookies,那么把登陆需要的信息post过去,session就获取了cookies,那么post到哪里呢?
通过查看登陆页面发现有form表单,并且action指向;
<form id="fm1" action="/account/login" method="post">
整个链接:https://passport.youkuaiyun.com/account/login
通过浏览器抓包发现post数据:
username:chinapython@yeah.net
password:(密码)
lt:LT-354741-Lfuq0nm5O9zO9aZVWhRsYfTV546LLe
execution:e1s1
_eventId:submit
username,password都明白
lt、execution、_eventId是什么?不用担心在请求的网页中就包含了
那么我们post的时候没有这些数据,那就无法完成。怎么办,那就先请求一次,获取到我们要的数据,然后在构造
上码:
import requests
import re
class login():
def __init__(self): # 初始化参数
self.headers = {
'User-Agent': 'Opera/9.80 (Macintosh; Intel Mac OS X; U; en) Presto/2.6.30 Version/10.61'
}
def get_cookies(self): # 通过seesion获取到cookies并返回出来(cookiejar格式)
url = 'https://passport.youkuaiyun.com/account/login'
session = requests.session()
ret = session.get(url, headers=self.headers).text
lt = re.findall('name="lt" value="(.*?)"', ret)[0]
execution = re.findall('name="execution" value="(.*?)"', ret)[0]
post_data = {
'username': '账号',
'password': '密码',
'lt': lt,
'execution': execution,
'_eventId': 'submit'
}
r = session.post(url, headers=self.headers, data=post_data)
cookie = r.cookies
return cookie
def parse(self, cookie):
url = 'http://my.youkuaiyun.com/'
s = requests.session()
s.cookies = cookie # 把传递进来的cookies传递给实例化后的session
html_str = s.get(url, headers=self.headers).text
ret = re.findall('china_python', html_str)
print(ret)
def run(self):
cookie = self.get_cookies()
self.parse(cookie)
if __name__ == '__main__':
start = login()
start.run()
session实例化来保持登陆
............用类写很累...........
第三种方法:selenium模拟登陆
我登陆后还输出cookies
def get_cookie():
login_url = 'https://passport.youkuaiyun.com/account/login'
driver = webdriver.Chrome()
driver.get(login_url)
driver.find_element_by_id('username').send_keys('chinapython@yeah.net')
driver.find_element_by_id('password').send_keys('binbin5211314')
driver.find_element_by_class_name('logging').click()
cookie = driver.get_cookies()
cookie_dict = {i['name']: i['value'] for i in cookie}
driver.quit() # 实例化driver输出的cookies返回值是列表.取第一个就是需要cookies
print(cookie_dict)
return cookie_dict
但是,我这边测试了好多次,在类里面写获取cookies中,在用requests.get登陆,但是总是出错
我对比了cookies没有发现不对,但为什么登陆不上呢????
太累了 ..............