python CSDN模拟登陆(三种方法)

第一种方法: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.csdn.net/'

    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.csdn.net/'

    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.csdn.net/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.csdn.net/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.csdn.net/'
        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.csdn.net/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没有发现不对,但为什么登陆不上呢????

太累了 ..............

































  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值