当前位置: 首页>前端>正文

Python分享之requests(3)

6) 身份验证

基本身份认证(HTTP Basic Auth)

import requests

from requests.auth import HTTPBasicAuth

r = requests.get('https://httpbin.org/hidden-basic-auth/user/passwd', auth=HTTPBasicAuth('user', 'passwd'))

# r = requests.get('https://httpbin.org/hidden-basic-auth/user/passwd', auth=('user', 'passwd'))? ? # 简写

print(r.json())

另一种非常流行的HTTP身份认证形式是摘要式身份认证,Requests对它的支持也是开箱即可用的:

requests.get(URL, auth=HTTPDigestAuth('user', 'pass')

Cookies与会话对象

如果某个响应中包含一些Cookie,你可以快速访问它们:

import requests

r = requests.get('http://www.google.com.hk/')

print(r.cookies['NID'])

print(tuple(r.cookies))

要想发送你的cookies到服务器,可以使用 cookies 参数:

import requests

url = 'http://httpbin.org/cookies'

cookies = {'testCookies_1': 'Hello_Python3', 'testCookies_2': 'Hello_Requests'}

# 在Cookie Version 0中规定空格、方括号、圆括号、等于号、逗号、双引号、斜杠、问号、@,冒号,分号等特殊符号都不能作为Cookie的内容。

r = requests.get(url, cookies=cookies)

print(r.json())

会话对象让你能够跨请求保持某些参数,最方便的是在同一个Session实例发出的所有请求之间保持cookies,且这些都是自动处理的,甚是方便。

下面就来一个真正的实例,如下是快盘签到脚本:

import requests

headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',

? ? ? ? ? 'Accept-Encoding': 'gzip, deflate, compress',

? ? ? ? ? 'Accept-Language': 'en-us;q=0.5,en;q=0.3',

? ? ? ? ? 'Cache-Control': 'max-age=0',

? ? ? ? ? 'Connection': 'keep-alive',

? ? ? ? ? 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'}

s = requests.Session()

s.headers.update(headers)

# s.auth = ('superuser', '123')

s.get('https://www.kuaipan.cn/account_login.htm')

_URL = 'http://www.kuaipan.cn/index.php'

s.post(_URL, params={'ac':'account', 'op':'login'},

? ? ? data={'username':'****@foxmail.com', 'userpwd':'********', 'isajax':'yes'})

r = s.get(_URL, params={'ac':'zone', 'op':'taskdetail'})

print(r.json())

s.get(_URL, params={'ac':'common', 'op':'usersign'})

requests模块抓取网页源码并保存到文件示例

这是一个基本的文件保存操作,但这里有几个值得注意的问题:

1.安装requests包,命令行输入pip install requests即可自动安装。很多人推荐使用requests,自带的urllib.request也可以抓取网页源码

2.open方法encoding参数设为utf-8,否则保存的文件会出现乱码。

3.如果直接在cmd中输出抓取的内容,会提示各种编码错误,所以保存到文件查看。

4.with open方法是更好的写法,可以自动操作完毕后释放资源

#! /urs/bin/python3

import requests

'''requests模块抓取网页源码并保存到文件示例'''

html = requests.get("http://www.baidu.com")

with open('test.txt', 'w', encoding='utf-8') as f:

? ? f.write(html.text)

'''读取一个txt文件,每次读取一行,并保存到另一个txt文件中的示例'''

ff = open('testt.txt', 'w', encoding='utf-8')

with open('test.txt', encoding="utf-8") as f:

? ? for line in f:

? ? ? ? ff.write(line)

? ? ? ? ff.close()

因为在命令行中打印每次读取一行的数据,中文会出现编码错误,所以每次读取一行并保存到另一个文件,这样来测试读取是否正常。(注意open的时候制定encoding编码方式)

自动登陆"示例:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import requests

# ############## 方式一 ##############

"""

# ## 1、首先登陆任何页面,获取cookie

i1 = requests.get(url="http://dig.chouti.com/help/service")

i1_cookies = i1.cookies.get_dict()

# ## 2、用户登陆,携带上一次的cookie,后台对cookie中的 gpsd 进行授权

i2 = requests.post(

? ? url="http://dig.chouti.com/login",

? ? data={

? ? ? ? 'phone': "8615131255089",

? ? ? ? 'password': "xxooxxoo",

? ? ? ? 'oneMonth': ""

? ? },

? ? cookies=i1_cookies

)

gpsd = i1_cookies['gpsd']

i3 = requests.post(

? ? url="http://dig.chouti.com/link/vote?linksId=8589523",

? ? cookies={'gpsd': gpsd}

)

print(i3.text)

"""

# ############## 方式二 ##############

"""

import requests

session = requests.Session()

i1 = session.get(url="http://dig.chouti.com/help/service")

i2 = session.post(

? ? url="http://dig.chouti.com/login",

? ? data={

? ? ? ? 'phone': "8615131255089",

? ? ? ? 'password': "xxooxxoo",

? ? ? ? 'oneMonth': ""

? ? }

)

i3 = session.post(

? ? url="http://dig.chouti.com/link/vote?linksId=8589523"

)

print(i3.text)

"""

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import requests

from bs4 import BeautifulSoup

# ############## 方式一 ##############

#

# # 1. 访问登陆页面,获取 authenticity_token

# i1 = requests.get('https://github.com/login')

# soup1 = BeautifulSoup(i1.text, features='lxml')

# tag = soup1.find(name='input', attrs={'name': 'authenticity_token'})

# authenticity_token = tag.get('value')

# c1 = i1.cookies.get_dict()

# i1.close()

#

# # 1. 携带authenticity_token和用户名密码等信息,发送用户验证

# form_data = {

# "authenticity_token": authenticity_token,

#? ? "utf8": "",

#? ? "commit": "Sign in",

#? ? "login": "wupeiqi@live.com",

#? ? 'password': 'xxoo'

# }

#

# i2 = requests.post('https://github.com/session', data=form_data, cookies=c1)

# c2 = i2.cookies.get_dict()

# c1.update(c2)

# i3 = requests.get('https://github.com/settings/repositories', cookies=c1)

#

# soup3 = BeautifulSoup(i3.text, features='lxml')

# list_group = soup3.find(name='div', class_='listgroup')

#

# from bs4.element import Tag

#

# for child in list_group.children:

#? ? if isinstance(child, Tag):

#? ? ? ? project_tag = child.find(name='a', class_='mr-1')

#? ? ? ? size_tag = child.find(name='small')

#? ? ? ? temp = "项目:%s(%s); 项目路径:%s" % (project_tag.get('href'), size_tag.string, project_tag.string, )

#? ? ? ? print(temp)

# ############## 方式二 ##############

# session = requests.Session()

# # 1. 访问登陆页面,获取 authenticity_token

# i1 = session.get('https://github.com/login')

# soup1 = BeautifulSoup(i1.text, features='lxml')

# tag = soup1.find(name='input', attrs={'name': 'authenticity_token'})

# authenticity_token = tag.get('value')

# c1 = i1.cookies.get_dict()

# i1.close()

#

# # 1. 携带authenticity_token和用户名密码等信息,发送用户验证

# form_data = {

#? ? "authenticity_token": authenticity_token,

#? ? "utf8": "",

#? ? "commit": "Sign in",

#? ? "login": "wupeiqi@live.com",

#? ? 'password': 'xxoo'

# }

#

# i2 = session.post('https://github.com/session', data=form_data)

# c2 = i2.cookies.get_dict()

# c1.update(c2)

# i3 = session.get('https://github.com/settings/repositories')

#

# soup3 = BeautifulSoup(i3.text, features='lxml')

# list_group = soup3.find(name='div', class_='listgroup')

#

# from bs4.element import Tag

#

# for child in list_group.children:

#? ? if isinstance(child, Tag):

#? ? ? ? project_tag = child.find(name='a', class_='mr-1')

#? ? ? ? size_tag = child.find(name='small')

#? ? ? ? temp = "项目:%s(%s); 项目路径:%s" % (project_tag.get('href'), size_tag.string, project_tag.string, )

#? ? ? ? print(temp)

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import time

import requests

from bs4 import BeautifulSoup

session = requests.Session()

i1 = session.get(

? ? url='https://www.zhihu.com/#signin',

? ? headers={

? ? ? ? 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36',

? ? }

)

soup1 = BeautifulSoup(i1.text, 'lxml')

xsrf_tag = soup1.find(name='input', attrs={'name': '_xsrf'})

xsrf = xsrf_tag.get('value')

current_time = time.time()

i2 = session.get(

? ? url='https://www.zhihu.com/captcha.gif',

? ? params={'r': current_time, 'type': 'login'},

? ? headers={

? ? ? ? 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36',

? ? })

with open('zhihu.gif', 'wb') as f:

? ? f.write(i2.content)

captcha = input('请打开zhihu.gif文件,查看并输入验证码:')

form_data = {

? ? "_xsrf": xsrf,

? ? 'password': 'xxooxxoo',

? ? "captcha": 'captcha',

? ? 'email': '424662508@qq.com'

}

i3 = session.post(

? ? url='https://www.zhihu.com/login/email',

? ? data=form_data,

? ? headers={

? ? ? ? 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36',

? ? }

)

i4 = session.get(

? ? url='https://www.zhihu.com/settings/profile',

? ? headers={

? ? ? ? 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36',

? ? }

)

soup4 = BeautifulSoup(i4.text, 'lxml')

tag = soup4.find(id='rename-section')

nick_name = tag.find('span',class_='name').string

print(nick_name)

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import re

import json

import base64

import rsa

import requests

def js_encrypt(text):

? ? b64der = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCp0wHYbg/NOPO3nzMD3dndwS0MccuMeXCHgVlGOoYyFwLdS24Im2e7YyhB0wrUsyYf0/nhzCzBK8ZC9eCWqd0aHbdgOQT6CuFQBMjbyGYvlVYU2ZP7kG9Ft6YV6oc9ambuO7nPZh+bvXH0zDKfi02prknrScAKC0XhadTHT3Al0QIDAQAB'

? ? der = base64.standard_b64decode(b64der)

? ? pk = rsa.PublicKey.load_pkcs1_openssl_der(der)

? ? v1 = rsa.encrypt(bytes(text, 'utf8'), pk)

? ? value = base64.encodebytes(v1).replace(b'\n', b'')

? ? value = value.decode('utf8')

? ? return value

session = requests.Session()

i1 = session.get('https://passport.cnblogs.com/user/signin')

rep = re.compile("'VerificationToken': '(.*)'")

v = re.search(rep, i1.text)

verification_token = v.group(1)

form_data = {

? ? 'input1': js_encrypt('wptawy'),

? ? 'input2': js_encrypt('asdfasdf'),

? ? 'remember': False

}

i2 = session.post(url='https://passport.cnblogs.com/user/signin',

? ? ? ? ? ? ? ? ? data=json.dumps(form_data),

? ? ? ? ? ? ? ? ? headers={

? ? ? ? ? ? ? ? ? ? ? 'Content-Type': 'application/json; charset=UTF-8',

? ? ? ? ? ? ? ? ? ? ? 'X-Requested-With': 'XMLHttpRequest',

? ? ? ? ? ? ? ? ? ? ? 'VerificationToken': verification_token}

? ? ? ? ? ? ? ? ? )

i3 = session.get(url='https://i.cnblogs.com/EditDiary.aspx')

print(i3.text)

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import requests

# 第一步:访问登陆页,拿到X_Anti_Forge_Token,X_Anti_Forge_Code

# 1、请求url:https://passport.lagou.com/login/login.html

# 2、请求方法:GET

# 3、请求头:

#? ? User-agent

r1 = requests.get('https://passport.lagou.com/login/login.html',

? ? ? ? ? ? ? ? headers={

? ? ? ? ? ? ? ? ? ? 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',

? ? ? ? ? ? ? ? },

? ? ? ? ? ? ? ? )

X_Anti_Forge_Token = re.findall("X_Anti_Forge_Token = '(.*?)'", r1.text, re.S)[0]

X_Anti_Forge_Code = re.findall("X_Anti_Forge_Code = '(.*?)'", r1.text, re.S)[0]

print(X_Anti_Forge_Token, X_Anti_Forge_Code)

# print(r1.cookies.get_dict())

# 第二步:登陆

# 1、请求url:https://passport.lagou.com/login/login.json

# 2、请求方法:POST

# 3、请求头:

#? ? cookie

#? ? User-agent

#? ? Referer:https://passport.lagou.com/login/login.html

#? ? X-Anit-Forge-Code:53165984

#? ? X-Anit-Forge-Token:3b6a2f62-80f0-428b-8efb-ef72fc100d78

#? ? X-Requested-With:XMLHttpRequest

# 4、请求体:

# isValidate:true

# username:15131252215

# password:ab18d270d7126ea65915c50288c22c0d

# request_form_verifyCode:''

# submit:''

r2 = requests.post(

? ? 'https://passport.lagou.com/login/login.json',

? ? headers={

? ? ? ? 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',

? ? ? ? 'Referer': 'https://passport.lagou.com/login/login.html',

? ? ? ? 'X-Anit-Forge-Code': X_Anti_Forge_Code,

? ? ? ? 'X-Anit-Forge-Token': X_Anti_Forge_Token,

? ? ? ? 'X-Requested-With': 'XMLHttpRequest'

? ? },

? ? data={

? ? ? ? "isValidate": True,

? ? ? ? 'username': '15131255089',

? ? ? ? 'password': 'ab18d270d7126ea65915c50288c22c0d',

? ? ? ? 'request_form_verifyCode': '',

? ? ? ? 'submit': ''

? ? },

? ? cookies=r1.cookies.get_dict()

)

print(r2.text)

Python分享之requests(3),第1张

https://www.xamrdz.com/web/2vx1996006.html

相关文章: