爬虫基础学习笔记
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())
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
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编码的数据。示例代码如下:
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('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'}
req = request.Request(url, headers=headers)
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'))
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'
handler = request.ProxyHandler({'http':'122.226.57.50:8888'})
opener = request.build_opener(handler)
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
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' }
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:
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"}
def get_opener():
cookiejar = CookieJar()
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
return opener
def login_renren(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'
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
cookiejar = MozillaCookieJar('cookie.txt')
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
req = request.Request('http://www.baidu.com/cookies/set/course/spider', headers=headers)
resp = opener.open(req)
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"}
cookiejar = MozillaCookieJar('cookie.txt')
cookiejar.load(ignore_discard=True)
handler = request.HTTPCookieProcessor(cookiejar)
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"
}
resp = requests.get('http://www.baidu.com/s', params=kw, headers=headers)
print(resp.text)
print(resp.content)
print(resp.url)
print(resp.encoding)
print(resp.status_code)
with open('baidu.html', 'w', encoding='utf-8') as fp:
fp.write(resp.content.decode('utf-8'))
response.text和response.content的区别
- response.content:这个是直接从网络上面抓取的数据,没有经过任何编码,所以是个bytes类型。在硬盘和网络上传输的字符串都是bytes类型。
- 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进行编码了,直接传入一个字典进去就可以了。比如请求拉勾网的数据的代码:
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)
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'
}
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)
|