IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 爬虫基础_urllib -> 正文阅读

[Python知识库]爬虫基础_urllib

爬虫基础学习笔记


urllib库

urllib库是Python中的一个最基本的网络请求库。可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据。

1、urlopen函数

在Python3的urllib库中,所有和网络请求相关的方法,都在urllib.request模块下面,urlopen函数的基本使用,urlopen()函数语法格式如下:

request.urlopen(url, data=None, [timeout,]*, cafile=None, capath=None, cadefault=False, context=None)
from urllib import request

# 一种写法
resp = request.urlopen('http://www.baidu.com/')
# 另一种写法
url = 'http://www.baidu.com/'
resp = request.urlopen(url=url)

# 读取所有内容
print(resp.read())
# 读取10个字符
print(resp.read(10))
# 读取一行
print(resp.readline())
# 读取多行
print(resp.readlines())
# 获取状态码
print(resp.getcode())

下面对urlopen函数进行详细讲解:

(1)url : 请求的url

(2)data:请求的data,如果设置了这个值,那么将变成POST请求

(3)返回值:返回值是一个http.client.HTTPResponse对象,这个对象是一个类文件句柄对象。有read(size)、readline、readlines及getcode 等方法。

2、urlretrieve函数

这个函数可以方便的将网页上的一个文件保存到本地,以下代码可以非常方便的将百度首页下载到本地:

from urllib import request
# 此函数语法必须严格这么写,下载文件名:baidu.html,存到当前路径
request.urlretrieve('http://www.baidu.com/', 'baidu.html')
# 如果这样向如下这么写,不可以
url = 'http://www.baidu.com/'
request.urlretrieve(url=url, 'baidu.html')

# 会有如下的报错
  request.urlretrieve(url=url, 'baidu.html')
                                             ^
SyntaxError: positional argument follows keyword argument

下面例子是保存一个图片到本地:

from urllib import request

# 防止验证错误
import ssl
ssl._create_default_https_context = ssl._create_unverified_context

request.urlretrieve('https://tenfei03.cfp.cn/creative/vcg/800/new/VCG21a1834bfe5.jpg', '1.jpg')

3、urlencode函数

真实浏览器发送请求的时候,如果url中包含了中文或者其他特殊字符,那么浏览器会自动的给我们进行解码。但如果使用代码发送请求时,那么就要手动编码,这样就用到urlencode函数。urlencode可以把字典数据转换成url编码的数据。示例代码如下:

# parse 跟解析相关
from urllib import parse
data = {'name':'爬虫基础', 'year': 2022, 'add': '吉林白城'}
qs = parse.urlencode(data)
print(qs)

如果我们在代码里用不编码的格式发送请求,示例代码如下:

from urllib import request
url = 'https://www.baidu.com/s?wd=李小龙'
resp = request.urlopen(url)
print(resp.read())

错误如下:

UnicodeEncodeError                        Traceback (most recent call last)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 10-12: ordinal not in range(128)

对照一下,现在把‘李小龙’进行urlencode编码,然后进行代码请求,代码如下:

from urllib import request
from urllib import parse

url = 'https://www.baidu.com/s?'
data = {'wd':'李小龙'}
params = parse.urlencode(data)
url = url+params
resp = request.urlopen(url)
print(resp.read())

正常响应,返回结果如下图:

4、parse_qs函数

可以将经过编码后的url参数进行解码,示例代码如下:

from urllib import parse
qs='name=%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80&year=2022&add=%E5%90%89%E6%9E%97%E7%99%BD%E5%9F%8E'
print(parse.parse_qs(qs))

解码出来的依然是字典格式,但是值变成列表了。

5、urlparse和urlsplit

有时候要对一个url中的各个组成部分进行分割,这时候需要urlparse或者urlsplit来进行分割。代码如下:

from urllib import request, parse
url = 'http://www.baidu.com/s?wd=java&username=123#23'

res = parse.urlparse(url)
print(res)

解析:scheme对应http,netloc 对应www.baidu.com, path对应/s,?查询语句对应query=,fragement对应#

若获取莫一个属性值,示例代码如下:

from urllib import request, parse
url = 'http://www.baidu.com/s?wd=java&username=123#23'

res = parse.urlparse(url)
print('scheme:', res.scheme)
print('netloc:', res.netloc)
print('path:', res.path)
print('params:', res.params)
print('query: ', res.query)
print('fragment:', res.fragment)
# 结果
scheme: http
netloc: www.baidu.com
path: /s
params: 
query:  wd=java&username=123
fragment: 23

urlsplit应用,示例代码如下:

from urllib import request, parse
url = 'http://www.baidu.com/s?wd=java&username=123#23'

res = parse.urlsplit(url)

print(res)
print('scheme:', res.scheme)
print('netloc:', res.netloc)
print('path:', res.path)
# print('params:', res.params)
print('query: ', res.query)
print('fragment:', res.fragment)
SplitResult(scheme='http', netloc='www.baidu.com', path='/s', query='wd=java&username=123', fragment='23')
scheme: http
netloc: www.baidu.com
path: /s
query:  wd=java&username=123
fragment: 23

二者区别:urlsplit没有params属性,urlparse有params属性,如果在url的‘s’与‘?’之间添加一个数据那么urlparse解析就会有paramas=数据值


request.Request类

首先运行一下不加headers头的访问方法,示例代码如下:

from urllib import request
url = 'https://www.lagou.com/wn/jobs?labelWords=&fromSearch=true&suginput=&kd=python'
resp = request.urlopen(url)
print(len(resp.read()))
executed in 707ms, finished 12:47:22 2022-01-23
127034

如果想要在请求的时候增加一些请求头,那么就必须使用request.Request类来实现。比如要增加一个User-Agent,示例代码如下:

from urllib import request
url = 'https://www.lagou.com/wn/jobs?labelWords=&fromSearch=true&suginput=&kd=python'
headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36'}

# 用request.Request类实例化一个req请求对象
req = request.Request(url, headers=headers)

# 然后用request.urlopen()打开这个请求对象
resp = request.urlopen(req)
print(len(resp.read()))
executed in 788ms, finished 12:47:42 2022-01-23
124447

ProxyHandler处理器(代理设置)

很多网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问次数多的不正常,它会禁止这个IP访问。所以我们可以设置一些代理器,每隔一段时间换一个代理,就算IP被封,依然可以换个IP继续爬取。urllib中通过ProxyHandler来设置使用代理服务器,下面代码说明如何使用自定义opener来使用代理:

from urllib import request

# 无代理
resp = request.urlopen('http://httpbin.org/get')
print(resp.read().decode('utf-8'))

# 使用代理,格式是字典,代理支持http,键就是http,支持https,键就是https,值就是代理服务器的ip
handler = request.ProxyHandler({'http':'218.66.161.88:31769'})

opener = request.build_opener(handler)
req = request.Request('http://httpbin.org/ip')
resp = opener.open(req)
print(resp.read())

使用代理的请求结果如下:

b'<!DOCTYPE html>\r\n<html>\r\n\r\n<head>\r\n    <meta charset="UTF-8" />\r\n    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />\r\n    <meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0, user-scalable=no" />\r\n    <meta name="apple-mobile-web-app-title" content="\xe4\xba\xac\xe4\xb8\x9c\xe8\xb7\xaf\xe7\x94\xb1" />\r\n    <meta http-equiv="pragma" content="no-cache">\r\n    <meta http-equiv="cache-control" content="no-cache">\r\n    <meta http-equiv="expires" content="0">\r\n    <title>JD</title>\r\n    <link href="./P_IMG/icon.png" rel="icon" type="image/x-icon" />\r\n    <script type="text/Javascript" src="./Public_JS/jquery.min.js"></script>\r\n    <script type="text/Javascript" src="./Public_JS/redirect.js"></script>\r\n    <script type="text/Javascript" src="./Public_JS/jquery.cookie.js"></script>\r\n</head>\r\n\r\n<body>\r\n    <div id="main"></div>\r\n</body>\r\n<script type="text/Javascript">\r\n    var errNo = 0;\r\n    $(function () {\r\n        var DEFAULT_VERSION = 9.0;\r\n        var ua = navigator.userAgent.toLowerCase();\r\n        var isIE = ua.indexOf("msie") > -1;\r\n        var safariVersion;\r\n        if (isIE) {\r\n            safariVersion = ua.match(/msie ([\\d.]+)/)[1];\r\n        }\r\n        if (safariVersion <= DEFAULT_VERSION) {\r\n            alert(\'\xe7\xb3\xbb\xe7\xbb\x9f\xe6\xa3\x80\xe6\xb5\x8b\xe5\x88\xb0\xe6\x82\xa8\xe6\xad\xa3\xe5\x9c\xa8\xe4\xbd\xbf\xe7\x94\xa8ie9\xe5\x8f\x8a\xe4\xbb\xa5\xe4\xb8\x8b\xe5\x86\x85\xe6\xa0\xb8\xe7\x9a\x84\xe6\xb5\x8f\xe8\xa7\x88\xe5\x99\xa8\xef\xbc\x8c\xe4\xb8\x8d\xe8\x83\xbd\xe5\xae\x9e\xe7\x8e\xb0\xe5\xae\x8c\xe7\xbe\x8e\xe4\xbd\x93\xe9\xaa\x8c\xef\xbc\x8c\xe8\xaf\xb7\xe6\x9b\xb4\xe6\x8d\xa2\xe6\x88\x96\xe5\x8d\x87\xe7\xba\xa7\xe6\xb5\x8f\xe8\xa7\x88\xe5\x99\xa8\xe8\xae\xbf\xe9\x97\xae\xef\xbc\x81\')\r\n        };\r\n\r\n        var htmlHref = window.location.href;\r\n        htmlHref = htmlHref.replace(/^http:\\/\\//, "");\r\n        var index = htmlHref.indexOf(\'/\');\r\n        htmlHref = htmlHref.substring(0, index);\r\n        $.cookie("HostAddrIP", htmlHref, {\r\n            expires: 7, path: \'/\'\r\n        });\r\n        $.ajax({\r\n            type: "post",\r\n            url: "http://" + htmlHref + "/jdcapi",\r\n            data: JSON.stringify({\r\n                "jsonrpc": "2.0",\r\n                "id": 20,\r\n                "method": "call",\r\n                "params": [\r\n                    "00000000000000000000000000000000",\r\n                    "jdcapi.static",\r\n                    "get_initialization_info",\r\n                    {}\r\n                ]\r\n            }),\r\n            dataType: "json",\r\n            success: function (data) {\r\n                if(data.result[0] == 0 && data.result[1].intialized == \'1\'){\r\n                    if (browserRedirect()) { \r\n                        window.location.href = "./M_Guide/html/M_Login.html";\r\n                    } else \r\n                    { \r\n                        window.location.href = "./P_Guide/html/P_Login.html"; \r\n                    }\r\n                }else{\r\n                    initUserLogin(htmlHref);\r\n                    if(errNo){\r\n                        if (browserRedirect()) { window.location.href = "./M_Guide/html/M_Welcome.html";} else { window.location.href = "./P_Guide/html/P_Welcome.html"; }\r\n                    }else{\r\n                        alert(\'\xe7\xb3\xbb\xe7\xbb\x9f\xe9\x94\x99\xe8\xaf\xaf\xef\xbc\x8c\xe8\xaf\xb7\xe9\x87\x8d\xe8\xaf\x95\');\r\n                    }\r\n                }\r\n            }\r\n        });\r\n        \r\n    });\r\n    var initUserLogin = function (htmlHref) {\r\n        $.ajax({\r\n            type: "post",\r\n            url: "http://" + htmlHref + "/jdcapi",\r\n            async:false,\r\n            data: JSON.stringify({\r\n                "jsonrpc":"2.0",\r\n                "id":1,\r\n                "method":"call",\r\n                "params":[\r\n                    "00000000000000000000000000000000",\r\n                    "session",\r\n                    "login",\r\n                    {\r\n                        "username": "root",\r\n                        "password": "admin",\r\n                        "timeout":0\r\n                    }\r\n                ]\r\n            }),\r\n            dataType: "json",\r\n            success: function (data) {\r\n                if(data.result[0] == 0){\r\n                    errNo = 1;\r\n                    $.cookie("sessionid", data.result[1].ubus_rpc_session, {\r\n                        expires: 7, path: \'/\'\r\n                    });\r\n                }else{\r\n                    errNo = 0;\r\n                }\r\n            }\r\n        });\r\n    };\r\n  </script>\r\n\r\n</html>'

常用的代理有

?快代理:http://www.kuaidaili.com/

?代理云:http://www.dailiyun.com/

不使用代理访问:

from urllib import request

url = 'http://httpbin.org/ip'
resp = request.urlopen(url)
print(resp.read())
executed in 544ms, finished 19:51:12 2022-01-23
b'{\n  "origin": "222.163.139.128"\n}\n'

使用代理访问:

1、使用ProxyHandler,传入代理构建的一个handler

2、使用创建的handler构建一个opener

3、使用opener发送一个请求

 from urllib import request

url = 'http://httpbin.org/ip'
# 使用ProxyHandler,传入代理构建的一个handler
handler = request.ProxyHandler({'http':'122.226.57.50:8888'})
# 使用创建的handler构建一个opener
opener = request.build_opener(handler)
# 使用opener发送一个请求
resp = opener.open(url)
print(resp.read())

结果如下:

executed in 698ms, finished 20:04:30 2022-01-23
b'{\n  "origin": "122.226.57.70"\n}\n'

总结:

1、代理的原理:在请求目的网站之前,先请求代理服务器,然后让代理服务器去请求目的网站,代理服务器拿到目的网站的数据后,再转发给我们的代码。

2、http://httpbin.org:这个网站可以方便的查看http请求的一些参数。格式如下:

http://httpbin.org/get
http://httpbin.org/user-agent
http://httpbin.org/ip

3、在代码中使用代理:

? ? 使用‘url lib.request.ProxyHandler’传入一个代理,这个代理是一个字典,字典的key是‘http’或者’https’

? ? key依赖于代理服务器能够接受的类型,value是:‘ip:port’,然后使用创建的’handler’以及request.build_opener’创 建一个’opener’。

? ? 使用创建的’opener’,调用’open’函数,发送请求。

什么是cookie

在网站中,http请求是无状态的,也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求的是谁。cookie的出现就解决了这个问题,第一次登录服务器后返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求时候,就会自动把上次存储的cookie数据自动携带给服务器,服务器通过浏览器携带的数据能判断当前用户是哪个了。cookie存储的数据量有限,不同的浏览器有不同的存储大小,但一般不超过4KB,因此使用cookie只能存储一些小量的数据。

cookie的格式:

Set-Cookie:NAME=VALUE; Expires/Max-age = DATE; Path=PATH;Domain=DOMAIN_NAME;SECURE

参数意义:

? NAME:cookie的名字

? VALUE:cookie的值

? Expires:cookie的过期时间

? Path:cookie作用的路径

? Domain:cookie作用的域名

? SECURE:是否只在https协议下起作用。

使用cookielib库和HTTPCookieProcessor模拟登录

Cookie是指网站服务器为了辨别用户身份和进行Session跟踪,而存储在用户浏览器上的文本文件,Cookie可以保持登录信息到用户下次与服务器会话。下面以登录人人网为例,要访问某个人的主页,必须先登录才能访问,也就是说登录就要有cookie信息。那么我们那想用代码的方式访问,就必须要有正确的cookie信息才能访问。解决方案两种,第一种是使用浏览器访问,然后将cookie信息复制下来,放到headers中。示例代码如下:

from urllib import request

# 在浏览器地址栏输入http://httpbin.org/user-agent即可获得headers里的User-Agent
headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36", 
 'Cookie':'taihe_bi_sdk_uid=1034eaf8795b3aa571215b0229493246; taihe_bi_sdk_session=74f6c86d2578f7944791f18bc8de8141; Hm_lvt_ad6b0fd84f08dc70750c5ee6ba650172=1642950134,1642950199,1642990773; LOCAL_STORAGE_KEY_RENREN_USER_BASIC_INFO={"userName":"Bruce_liu","userId":2147694583,"headUrl":"http://rrfmn.rrimg.com/","secretKey":"32d3ccb0d3f81e9bfec587d6b2b8074c","sessionKey":"g1c1iAHmWq1VXPxR"}; Hm_lpvt_ad6b0fd84f08dc70750c5ee6ba650172=1642990794' }
# 不使用cookie去请求个人主页(Bruce_liu)本人的个人主页
url = 'http://www.renren.com/personal/2147694583'

req = request.Request(ul=url, headers=headers)
resp = request.urlopen(req)
with open('renren.html', 'w') as fp:
  # write函数必须写入一个str的数据类型
  # resp.read()读出来的是一个bytes数据类型
  # bytes -> decode -> str
  # str -> encode ->bytes
  fp.write(resp.read().decode('utf-8'))

http.cookiejar模块

该模块主要的类有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。四个类的作用分别如下:

1、CookieJar:管理HTTPcookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。

2、FileCookieJar(filename,delayload=None,policy=None):从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据。

3、MozillaCookieJar(filename,delaylod=None,policy=None):从FileCookieJar派生而来,创建与Mozilla浏览器cookies.txt兼容的FileCookieJar实例。

4、LWPCookieJar(filename,delayload=None, polciy=None):从FileCookieJar派生而来,创建与libwww.perl标准的Set-Cookie3文件格式兼容的FileCookieJar实例。

利用http.cookiejar和request.HTTPCookieProcessor登录人人网,示例代码如下:

from urllib import request
from urllib import parse
from http.cookiejar import CookieJar


headers = {
    "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"}

# 定义一个返回opener的函数
def get_opener():
    # 登录
    # 创建一个cookiejar对象
    cookiejar = CookieJar()
    # 使用cookiejar创建一个HTTPCookieProcessor对象
    handler = request.HTTPCookieProcessor(cookiejar)
    
    # 使用上一步创建的handler创建一个opener
    opener = request.build_opener(handler)
    
    return opener
   
    
# 定义一个登录人人网函数
def login_renren(opener):    
    
    # 使用opener发送登录的请求(人人网邮箱和密码)


    data = {
        'email': '11343154@qq.com',
        'password': '2008-lxw'
        }
    login_url = 'http://www.renren.com/personal/2147694583'
    req = request.Request(login_url, data=parse.urlencode(data).encode('utf-8'), headers=headers)

    opener.open(req)
    
# 定义一个访问个人主页函数
def vist_profile(opener):

    # 访问个人主页
    bruce_liu_url = 'http://www.renren.com/personal/2147694583'

    # 获取个人主页的页面的时候,不用新建一个opener
    # 因为之前那个opener已经包含了登录需要的cookie信息
    req = request.Request(bruce_liu_url, headers=headers)
    resp = opener.open(req)
    with open('renren2.html', 'w', encoding='utf-8') as fp:
        fp.write(resp.read().decode('utf-8'))

if __name__=='__main__':
    opener1 = get_opener()
    login_renren(opener1)
    vist_profile(opener1)

保存cookie到本地

保存cookie到本地,可以使用cookiejar的save方法,并且需要指定一个文件名。

                                                              
from urllib import request                                    
from http.cookiejar import MozillaCookieJar                   
                                                              
headers = {"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS
# 先生成cookie小罐                                                 
cookiejar = MozillaCookieJar('cookie.txt')                    
# 利用cookie小罐生成句柄handler                                       
handler = request.HTTPCookieProcessor(cookiejar)              
# 利用handler生成opener                                           
opener = request.build_opener(handler)                        
                                                              
req = request.Request('http://www.baidu.com/cookies/set/course/spider', headers=headers)
                                                              
resp = opener.open(req)                                       
# print(resp.read())                                            
cookiejar.save(ignore_discard=True, ignore_expires=True)      

那么加载本地cookie,代码如下:

from urllib import request
from http.cookiejar import MozillaCookieJar
import  ssl
ssl._create_default_https_context=ssl._create_unverified_context
headers = {"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"}
# 先生成cookie小罐
cookiejar = MozillaCookieJar('cookie.txt')
# 利用load()函数,参数设置为ignore_discard=True
cookiejar.load(ignore_discard=True)
# 利用cookie小罐生成句柄handler
handler = request.HTTPCookieProcessor(cookiejar)
# 利用handler生成opener
opener = request.build_opener(handler)

resp = opener.open('http://httpbin.org/cookies')
for cookie in cookiejar:
    print(cookie)

requests库

虽然Python的标准库中urllib模块已经包含了平常我们使用的大多数功能,但是它的API使用起来让人感觉比较繁琐,而Requests的宣传是“HTTP for Humans",说明使用更简洁方便。

安装和文档地址:

利用pip可以非常方便安装

pip install requests

gihut地址:https://github.com/requests/requests

发送GET请求

1、最简单的发送get请求就是通过requests.get来调用

import requests
url = 'http://www.baidu.com/'
resp = requests.get(url)

2、添加headers和查询参数,如果要添加headers,可以传入headers参数来增加请求头中的headers信息。如要将参数放在url中传递,可以利用params参数。示例代码如下:

import requests
kw = {'wd': 'python'}
headers = {
  "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"
}

# params接收一个字典或字符串的查询参数,字典类型自动转换为url编码,不需要urlencode()
resp = requests.get('http://www.baidu.com/s', params=kw, headers=headers)

# 查看响应内容,response.text返回的是unicode格式数据
print(resp.text)

# 查看响应内容,resp.content返回的字节数据
print(resp.content)

# 查看完整url地址
print(resp.url)

# 查看响应头部字符编码
print(resp.encoding)

# 查看响应码
print(resp.status_code)

# 如果把响应内容解码写成html文件
with open('baidu.html', 'w', encoding='utf-8') as fp:
    fp.write(resp.content.decode('utf-8'))

response.text和response.content的区别

  1. response.content:这个是直接从网络上面抓取的数据,没有经过任何编码,所以是个bytes类型。在硬盘和网络上传输的字符串都是bytes类型。
  2. response.text:这个是requests,将response.content进行解码的字符串。解码需要指定一个编码方式,requests会根据自己的猜测来判断编码的方式。所以有时间可能会猜测错误,就会导致解码产生乱码。这时候应该使用"response.content.decode(‘utf-8’)"进行手动解码。

发送POST请求

1、最基本的POST请求可以使用post方法,若返回的是json数据,那么可以调用‘response.json()‘来将json字符串转换为字典或者列表。

response = requests.post('http://www.baidu.com/', data=data)

2、传入data数据

这时候就不要再使用urlencode进行编码了,直接传入一个字典进去就可以了。比如请求拉勾网的数据的代码:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 创建时间   :1/24/22 6:06 PM
# 文件      :post.py
# IDE      :PyCharm

import requests

url = 'https://www.lagou.com/jobs/position'
headers = {
  "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"
}

data = {
    'first':'true',
    'pn':1,
    'kd':'python'
}

resp = requests.post(url, headers=headers, data=data)

# 如果是json数据,直接可以调用json方法
print(resp.json())

GE T请求和POST请求区别

get 请求参数为params=, post请求为data=

使用代理

使用requests添加代理也非常简单,只要在请求方法中(比如get或者post)传递proxies参数就可以,示例代码如下:

import requests

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

headers = {
  "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"
}

proxy = {
    'http':'61.150.96.27:36880'  # https://www.kuaidaili.com/free/inha/3/ 陕西汉中电信
}

resp = requests.get(url, headers=headers, proxies=proxy)
with open('xx.html', 'w', encoding='utf-8') as fp:
    fp.write(resp.text)
    
    
 结果如下:
{ "args": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36", "X-Amzn-Trace-Id": "Root=1-61eea7d1-0f1dae897b843858628d2d7e" }, "origin": "61.150.96.27", "url": "http://httpbin.org/get" }

测试代理IP,结果如下图:

cookie

如果在一个响应中包含了cookie,那么利用cookies属性拿到这个返回的cookie值:

import requests

url = 'http://www.renren.com/PLogin.do'
data = {'emai':'970138074@qq.com', 'password':'pythonspider'}
resp = requests.get('http://www.baidu.com/')
print(resp.cookies)
print(resp.cookies.get_dict())

结果如下:

executed in 102ms, finished 21:51:15 2022-01-24
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
{'BDORZ': '27315'}

session

之前使用urllib库,可以使用opener发送多个请求,多个请求之间是可以共享cookie的。那么如果使用requests,也要达到共享cookie的目的,那么可以使用requests库给我们提供的session对象。注意,这里的session不是web开发中的那个session,这个地方知识一个会话的对象而已。下面以人人网为例,使用requests实现,示例代码如下:

import requests

url = 'http://www.renren.com/PLogin.do'
headers = {
  "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"
}


data = {'emai':'970138074@qq.com', 'password':'pythonspider'}
session = requests.Session()
session.post(url, data=data, headers=headers)

resp = session.get('http://www.renren.com/880151247/profile')

with open('renren.html', 'w', encoding='utf-8') as fp:
    fp.write(resp.text)

处理不信任的SSL证书

对于那些已经不信任的SSL证书的网站,比如:https://www.baidu.com/,那么使用requests直接就可以正常返回响应。示例代码如下:

resp = requests.get(url,verify=False)  # verify设置False
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-01-25 10:32:27  更:2022-01-25 10:33:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 2:42:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码