有些网页内容使用AJAX请求加载,这种数据无法直接对网页url进行获取。但是只要记住,AJAX请求一般返回给网页的是JSON文件,只要对AJAX请求地址进行POST或GET,就能返回JSON数据了。
如果非要从HTML页面里获取展现出来的数据,也不是不可以。但是要记住,作为一名爬虫工程师,你更需要关注的是数据的来源。
有些网页内容使用AJAX请求加载,这种数据无法直接对网页url进行获取。但是只要记住,AJAX请求一般返回给网页的是JSON文件,只要对AJAX请求地址进行POST或GET,就能返回JSON数据了。
如果非要从HTML页面里获取展现出来的数据,也不是不可以。但是要记住,作为一名爬虫工程师,你更需要关注的是数据的来源。
Content-Length: 100: 是指发送的表单数据长度为100,也就是url编码字符串的字符个数是100个。
Content-Type: application/x-www-form-urlencoded : 表示浏览器提交 Web 表单时使用,表单数据会按照 name1=value1&name2=value2 键值对形式进行编码。
X-Requested-With: XMLHttpRequest :表示AJAX异步请求
1.解析页面
输入要翻译的文本,显示出翻译内容,html发生了变化,其url没有发生改变,这是一个动态页面。
通过浏览器自带的抓包工具,抓取动态页面。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qFi2DX6k-1572593825007)(./assets/腾讯翻译01.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PerqBiCg-1572593825008)(assets/腾讯翻译02.png)]
2.分析数据
输入不同的文本内容,分析post携带的表单数据有何异同
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k8fFmZ1L-1572593825008)(assets/腾讯翻译03.png)]
根据文本内容不同(例如,翻译框输入“你好” 和“中国”后对比表单信息),发现表单的所有字段都相同,唯有要翻译的文本信息和时间戳不一样,其他都相同,那我们可以针对这两个字段,替换成符合要求的内容。
"sourceText": input("请输入要翻译的内容") # 时间戳 # 根据经验,15或16开头的10-15位数字,一般优先考虑是时间戳 "sessionUuid": "translate_uuid" + str(int(time.time() * 1000))[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7s3OJSkg-1572593825008)(assets/时间戳.png)]
尝试用POST方式发送请求
import json import requests import time # post请求的url地址, 通过浏览器抓包获取 base_url = "https://fanyi.qq.com/api/translate" headers = { "Accept": "application/json, text/javascript, */*; q=0.01", "Connection": "keep-alive", "Content-Length": "294", "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8", "Cookie": "fy_guid=94af8e98-08f4-49a2-9562-1c93b5299969; qtv=c03f8898e63faaf1; qtk=c0VhySUiXAQjye4yzCLCCnS2VJiX3nO+PguX/CLuhKsDkPu2+aN5vr0fr0/6hfpi+jVIS4Z0Ys7bm4xK1jsYymyeF3qbhP1xI3kbKmqf1UBe/TnrdmhbwkYPdmjP61aqIZfIN89ZyLDagGo2fjNESg==; openCount=1; gr_user_id=6edf2548-7b4e-4c34-9c05-6831c2ebb552; 8507d3409e6fad23_gr_session_id=8577a037-6ae8-4d6e-b898-3eb27a84dc16; grwng_uid=d7ac9b1f-70f3-48b1-8e56-a1d004132d66; 8c66aca9f0d1ff2e_gr_session_id=c74395eb-6342-4057-8224-077764c5a5eb; 8507d3409e6fad23_gr_session_id_8577a037-6ae8-4d6e-b898-3eb27a84dc16=false", "Host": "fanyi.qq.com", "Origin": "https://fanyi.qq.com", "Referer": "https://fanyi.qq.com/", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36", "X-Requested-With": "XMLHttpRequest" } # 需要传递的表单数据 form_data = { "source": "auto", "target": "auto", # 翻译的内容 "sourceText": input("请输入要翻译的内容"), "qtv": "c03f8898e63faaf1", "qtk": "c0VhySUiXAQjye4yzCLCCnS2VJiX3nO+PguX/CLuhKsDkPu2+aN5vr0fr0/6hfpi+jVIS4Z0Ys7bm4xK1jsYymyeF3qbhP1xI3kbKmqf1UBe/,TnrdmhbwkYPdmjP61aqIZfIN89ZyLDagGo2fjNESg==", # 时间戳 "sessionUuid": "translate_uuid" + str(int(time.time() * 1000)) } def send_request(): # requests是urllib的封装 response2 = requests.post(base_url, data=form_data, headers=headers) return response2 def parse_response(response): # 获取响应字符串 str_content = response.content.decode("utf-8") # 将响应字符串转为Python数据类型 dict_json = json.loads(str_content) print("翻译结果", dict_json["translate"]["records"][0]["targetText"]) def main(): response2 = send_request() parse_response(response2) if __name__ == '__main__': main() 练习: 有道翻译:根据输入的内容实现翻译功能 # youdaofanyi.py发送POST请求时,需要了解的headers一些属性:
Content-Length: 100: 是指发送的表单数据长度为100,也就是url编码字符串的字符个数是100个。
Content-Type: application/x-www-form-urlencoded : 表示浏览器提交 Web 表单时使用,表单数据会按照 name1=value1&name2=value2 键值对形式进行编码。
X-Requested-With: XMLHttpRequest :表示AJAX异步请求。
问题:GET和POST的区别?
GET方式是直接以链接形式访问,链接中包含了所有的参数,服务器端用Request.QueryString获取变量的值。如果包含了密码的话是一种不安全的选择,不过你可以直观地看到自己提交了什么内容。POST则不会在网址上显示所有的参数,服务器端用Request.Form获取提交的数据,在Form提交的时候。但是HTML代码里如果不指定 method 属性,则默认为GET请求,Form中提交的数据将会附加在url之后,以?分开与url分开。表单数据可以作为 URL 字段(method=“get”)或者 HTTP POST (method=“post”)的方式来发送。比如在下面的HTML代码中,表单数据将因为 (method=“get”) 而附加到 URL 上: <form action="https://movie.douban.com/subject_search" method="get"> <fieldset> <legend>搜索:</legend> <label for="inp-query"> </label> <div class="inp"><input id="inp-query" name="search_text" size="22" maxlength="60" placeholder="搜索电影、电视剧、综艺、影人" value="" autocomplete="off"></div> <div class="inp-btn"><input type="submit" value="搜索"></div> <input type="hidden" name="cat" value="1002"> </fieldset> </form>————————————————————————————————————————————
opener是 urllib2.OpenerDirector 的实例,我们之前一直都在使用的urlopen,它是一个特殊的opener(也就是模块帮我们构建好的)。
但是基本的urlopen()方法不支持代理、Cookie等其他的 HTTP/HTTPS高级功能。所以要支持这些功能:
使用相关的 Handler处理器 来创建特定功能的处理器对象;然后通过 urllib2.build_opener()方法使用这些处理器对象,创建自定义opener对象;使用自定义的opener对象,调用open()方法发送请求。注意:如果程序里所有的请求都使用自定义的opener,可以使用urllib2.install_opener() 将自定义的 opener 对象 定义为 全局opener,表示如果之后凡是调用urlopen,都将使用这个opener(根据自己的需求来选择)。这种方式发送请求得到的结果,和使用urllib2.urlopen()发送HTTP/HTTPS请求得到的结果是一样的。
如果在 HTTPHandler()增加 debuglevel=1参数,还会将 Debug Log 打开,这样程序在执行的时候,会把收包和发包的报头在屏幕上自动打印出来,方便调试,有时可以省去抓包的工作。
# 仅需要修改的代码部分: # 构建一个HTTPHandler 处理器对象,支持处理HTTP请求,同时开启Debug Log,debuglevel 值默认 0 http_handler = urllib2.HTTPHandler(debuglevel=1) # 构建一个HTTPHSandler 处理器对象,支持处理HTTPS请求,同时开启Debug Log,debuglevel 值默认 0 https_handler = urllib2.HTTPSHandler(debuglevel=1)使用代理IP,这是爬虫/反爬虫的第二大招,通常也是最好用的。
很多网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问次数多的不像正常人,它会禁止这个IP的访问。
所以我们可以设置一些代理服务器,每隔一段时间换一个代理,就算IP被禁止,依然可以换个IP继续爬取。
urllib2中通过ProxyHandler来设置使用代理服务器,下面代码说明如何使用自定义opener来使用代理:
#urllib2_proxy1.py import urllib2 # 构建了两个代理Handler,一个有代理IP,一个没有代理IP httpproxy_handler = urllib2.ProxyHandler({"http" : "124.88.67.81:80"}) nullproxy_handler = urllib2.ProxyHandler({}) proxySwitch = True #定义一个代理开关 # 通过 urllib2.build_opener()方法使用这些代理Handler对象,创建自定义opener对象 # 根据代理开关是否打开,使用不同的代理模式 if proxySwitch: opener = urllib2.build_opener(httpproxy_handler) else: opener = urllib2.build_opener(nullproxy_handler) request = urllib2.Request("http://www.baidu.com/") # 1. 如果这么写,只有使用opener.open()方法发送请求才使用自定义的代理,而urlopen()则不使用自定义代理。 response = opener.open(request) # 2. 如果这么写,就是将opener应用到全局,之后所有的,不管是opener.open()还是urlopen() 发送请求,都将使用自定义代理。 # urllib2.install_opener(opener) # response = urlopen(request) print(response.read())免费的开放代理获取基本没有成本,我们可以在一些代理网站上收集这些免费代理,测试后如果可以用,就把它收集起来用在爬虫上面。
免费短期代理网站举例:
西刺免费代理IP快代理免费代理Proxy360代理全网代理IP如果代理IP足够多,就可以像随机获取User-Agent一样,随机选择一个代理去访问网站。
import urllib2 import random proxy_list = [ {"http" : "124.88.67.81:80"}, {"http" : "124.88.67.81:80"}, {"http" : "124.88.67.81:80"}, {"http" : "124.88.67.81:80"}, {"http" : "124.88.67.81:80"} ] # 随机选择一个代理 proxy = random.choice(proxy_list) # 使用选择的代理构建代理处理器对象 httpproxy_handler = urllib2.ProxyHandler(proxy) opener = urllib2.build_opener(httpproxy_handler) request = urllib2.Request("http://www.baidu.com/") response = opener.open(request) print(response.read())但是,这些免费开放代理一般会有很多人都在使用,而且代理有寿命短,速度慢,匿名度不高,HTTP/HTTPS支持不稳定等缺点(免费没好货)。
匿名度:通常情况下,使用免费代理是可以看到真实IP的,所以也叫透明代理。透明代理的请求报头有X-Forwarded-For部分,值是原始客户端的 IP。()
所以,专业爬虫工程师或爬虫公司会使用高品质的私密/验证代理,这些代理通常需要找专门的代理供应商购买,再通过用户名/密码授权使用(舍不得孩子套不到狼)。
#urllib2_proxy2.py import urllib2 import urllib # 1. 构建一个附带Auth验证的的ProxyHandler处理器类对象,注意代理的格式 username:password@ip:port proxyauth_handler = urllib2.ProxyHandler({"http" : "1412780938:vidasedf@61.158.163.130:16816"}) # 2. 通过 build_opener()方法使用这个代理Handler对象,创建自定义opener对象,参数包括构建的 proxy_handler opener = urllib2.build_opener(proxyauth_handler) # 3. 构造Request 请求 request = urllib2.Request("http://www.baidu.com/") # 4. 使用自定义opener发送请求 response = opener.open(request) # 5. 打印响应内容 print(response.read())HTTP是无状态的面向连接的协议,服务器和客户端的交互仅限于请求/响应过程,结束之后便断开,在下一次请求时,服务器会认为新的客户端。为了维护他们之间的链接,让服务器知道这是之前某个用户发送的请求,则必须在一个地方保存客户端的信息。
Cookie:通过在 客户端 记录的信息确定用户的身份。
Session:通过在 服务器端 记录的信息确定用户的身份。
Cookie 是指某些网站服务器为了辨别用户身份和进行Session跟踪,而储存在用户浏览器上的文本文件,Cookie可以保持登录信息到用户下次与服务器的会话。
Cookie是http请求报头中的一种属性,包括:
Cookie名字(Name) Cookie的值(Value) Cookie的过期时间(Expires/Max-Age) Cookie作用路径(Path) Cookie所在域名(Domain), 使用Cookie进行安全连接(Secure)。前两个参数是Cookie应用的必要条件,另外,还包括Cookie大小(不同浏览器对Cookie个数及大小限制是有差异的)。
Cookie由变量名和值组成,根据 Netscape公司的规定,Cookie格式如下:
Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURECookies在爬虫方面最典型的应用是判定注册用户是否已经登录网站,在下一次进入此网站时保留用户信息,可以简化登录或其他验证过程。
#coding:utf-8 # 获取一个有登录信息的Cookie模拟登陆 import urllib2 # 1. 构建一个已经登录过的用户的headers信息 headers = { "Host":"www.renren.com", "Connection":"keep-alive", "Upgrade-Insecure-Requests":"1", "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36", "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language":"zh-CN,zh;q=0.8,en;q=0.6", # 便于终端阅读,表示不支持压缩文件 # Accept-Encoding: gzip, deflate, sdch, # 重点:这个Cookie是一个保存了用户登录状态的Cookie "Cookie": "anonymid=jwg5px9223orjc; depovince=GW; _r01_=1; ln_uact=18825497183; ln_hurl=http://head.xiaonei.com/photos/0/0/women_main.gif; jebe_key=92178614-d76c-4b30-ae4c-cf5230f40a6b%7C8929088c513cf05dd96eed20f4a679a3%7C1559553449912%7C1%7C1559553448004; _ga=GA1.2.2038660007.1559553454; _de=0CCE9B3A71DB756E78A87E0C943704C1; p=b3ad31d72e376df8848e6ca0793411344; ap=833691044; wp=0; jebecookies=ff92123f-5c84-44c1-992b-a60957847141|||||; first_login_flag=1; t=07dff644a650c9f2b1911f59cd199db14; societyguester=07dff644a650c9f2b1911f59cd199db14; id=833691044; xnsid=d44688bb; ver=7.0; loginfrom=null; wp_fold=0" } # 2. 通过headers里的报头信息(主要是Cookie信息),构建Request对象 request = urllib2.Request("http://www.renren.com/", headers = headers) # 3. 直接访问renren主页,服务器会根据headers报头信息(主要是Cookie信息),判断这是一个已经登录的用户,并返回相应的页面 response = urllib2.urlopen(request) # 4. 打印响应内容 print(response.read())思考:但是这样做太过复杂,我们先需要在浏览器登录用户名和密码,并且通过抓包才能获取这个Cookie,那有没有更简单方便的方法呢?
在Python处理Cookie,一般是通过cookielib模块和 urllib2模块的HTTPCookieProcessor处理器类一起使用。
cookielib模块:主要作用是提供用于存储cookie的对象
HTTPCookieProcessor处理器:主要作用是处理这些cookie对象,并构建handler对象。
该模块主要的对象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。
CookieJar:管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。FileCookieJar (filename,delayload=None,policy=None):从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据。MozillaCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例。LWPCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与libwww-perl标准的 Set-Cookie3 文件格式兼容的FileCookieJar实例。其实大多数情况下,我们只用CookieJar(),如果需要和本地文件交互,就用 MozillaCookjar() 或 LWPCookieJar()
我们来做几个案例:
我们使用以上方法将Cookie保存到cookiejar对象中,然后打印出了cookie中的值,也就是访问百度首页的Cookie值。
运行结果如下:
BAIDUID=FBCA5399B860A3D097BE86726D8462CD:FG=1;BIDUPSID=FBCA5399B860A3D097BE86726D8462CD;H_PS_PSSID=1423_28939_21093_28518_29099_29139_29134_28831_28585_29133_28701;PSTM=1559630032;delPer=0;BDSVRTM=0;BD_HOME=0[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V67kVDX3-1572593825009)(assets/cookie_file.png)]
这个测试案例中,为了想让大家快速理解知识点,我们使用的人人网登录接口是人人网改版前的隐藏接口,只需要账户米和密码即可登录。
所以,想做通用的模拟登录还得选别的技术,比如用内置浏览器引擎的爬虫(关键词:Selenium ,PhantomJS),这个我们将在以后会学习到。
模拟登录的注意事项:
登录一般都会先有一个HTTP GET,用于拉取一些信息及获得Cookie,然后再HTTP POST登录。HTTP POST登录的链接有可能是动态的,从GET返回的信息中获取。大多数网站的登录整体流程是类似的,可能有些细节不一样,所以不能保证其他网站登录成功。———————————————————————————————————————————————————————————
在我们用urlopen或opener.open方法发出一个请求时,如果urlopen或opener.open不能处理这个response,就产生错误。
这里主要说的是URLError和HTTPError,以及对它们的错误处理。
URLError 产生的原因主要有:
没有网络连接服务器连接失败找不到指定的服务器我们可以用try except语句来捕获相应的异常。下面的例子里我们访问了一个不存在的域名:
# urllib2_urlerror.py import urllib2 request = urllib2.Request("http://www.ajkfhafwjqh.com") try: urllib2.urlopen(request, timeout=5) except urllib2.URLError, err: print(err)运行结果如下:
<urlopen error [Errno 8] nodename nor servname provided, or not known>urlopen error,错误代码8,错误原因是没有找到指定的服务器。
HTTPError是URLError的子类,我们发出一个请求时,服务器上都会对应一个response应答对象,其中它包含一个数字"响应状态码"。
如果urlopen或opener.open不能处理的,会产生一个HTTPError,对应相应的状态码,HTTP状态码表示HTTP协议所返回的响应的状态。
注意,urllib2可以为我们处理重定向的页面(也就是3开头的响应码),100-299范围的号码表示成功,所以我们只能看到400-599的错误号码。
# urllib2_httperror.py import urllib2 request = urllib2.Request("http://www.baidu.com/fad") try: urllib2.urlopen(request) except urllib2.HTTPError, err: print(err.code) print(err)运行结果如下:
404 HTTP Error 404: Not FoundHTTP Error,错误代号是404,错误原因是Not Found,说明服务器无法找到被请求的页面。
通常产生这种错误的,要么url不对,要么ip被封。
由于HTTPError的父类是URLError,所以父类的异常应当写到子类异常的后面,所以上述的代码可以这么改写:
# urllib2_botherror.py import urllib2 request = urllib2.Request("http://www.baidu.com") try: urllib2.urlopen(request) except urllib2.HTTPError, err: print(err.code) except urllib2.URLError, err: print(err) else: print("Good Job")运行结果如下:
404这样我们就可以做到,首先捕获子类的异常,如果子类捕获不到,那么可以捕获父类的异常。
—————————————————————————————————————————————————————————————————————————————————————
虽然Python的标准库中 urllib2 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 “HTTP for Humans”,说明使用更简洁方便。
Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用:)
Requests 继承了urllib2的所有特性。Requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码。
requests 的底层实现其实就是 urllib3
Requests的文档非常完备,中文文档也相当不错。Requests能完全满足当前网络的需求,支持Python 2.6—3.5,而且能在PyPy下完美运行。
开源地址:https://github.com/kennethreitz/requests
中文文档 API: http://docs.python-requests.org/zh_CN/latest/index.html
利用 pip 安装 或者利用 easy_install 都可以完成安装:
$ pip install requests $ easy_install requests1. 最基本的GET请求可以直接用get方法
response = requests.get("http://www.baidu.com/") # 也可以这么写 # response = requests.request("get", "http://www.baidu.com/")2. 添加 headers 和 查询参数
如果想添加 headers,可以传入headers参数来增加请求头中的headers信息。如果要将参数放在url中传递,可以利用 params 参数。
import requests kw = {'wd':'长城'} headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"} # params 接收一个字典或者字符串的查询参数,字典类型自动转换为url编码,不需要urlencode() response = requests.get("http://www.baidu.com/s?", params = kw, headers = headers) # 查看响应内容,response.text 返回的是Unicode格式的数据 print(response.text) # 查看响应内容,response.content返回的字节流数据 print(respones.content) # 查看完整url地址 print(response.url) # 查看响应头部字符编码 print(response.encoding) # 查看响应码 print(response.status_code)运行结果
...... ...... 'http://www.baidu.com/s?wd=%E9%95%BF%E5%9F%8E' 'utf-8' 200 使用response.text 时,Requests 会基于 HTTP 响应的文本编码自动解码响应内容,大多数 Unicode 字符集都能被无缝地解码。使用response.content 时,返回的是服务器响应数据的原始二进制字节流,可以用来保存图片等二进制文件。1. 最基本的GET请求可以直接用post方法
response = requests.post("http://www.baidu.com/", data = data)2. 传入data数据
对于 POST 请求来说,我们一般需要为它增加一些参数。那么最基本的传参方法可以利用 data 这个参数。
#import urllib #import urllib2 #import json import requests # POST请求的目标URL url = "http://fanyi.qq.com/api/translate" headers={"User-Agent": "Mozilla...."} keyword = { "source":"auto", "target" : "auto", "sourceText" : "你好Python", # 需要翻译的内容 "sessionUuid ": "translate_uuid15617720945431" #translate_uuid + Unix时间戳(毫秒) } # data = urllib.urlencode(keyword) # request = urllib2.Request(url, data) # response = urllib2.urlopen(request) # 获取响应字符串 # html = response.read() # 将响应字符串转为Python数据类型 # result = json.loads(html) result = requests.post(url, headers = headers, data = keyword).json() print(result['translate']['records'][0]['targetText']) # Hello, Python.运行结果
{"type":"EN2ZH_CN","errorCode":0,"elapsedTime":2,"translateResult":[[{"src":"i love python","tgt":"我喜欢python"}]],"smartResult":{"type":1,"entries":["","肆文","高德纳"]}} {u'errorCode': 0, u'elapsedTime': 0, u'translateResult': [[{u'src': u'i love python', u'tgt': u'\u6211\u559c\u6b22python'}]], u'smartResult': {u'type': 1, u'entries': [u'', u'\u8086\u6587', u'\u9ad8\u5fb7\u7eb3']}, u'type': u'EN2ZH_CN'}如果需要使用代理,你可以通过为任意请求方法提供 proxies 参数来配置单个请求:
import requests # 根据协议类型,选择不同的代理 proxies = {"http": "http://12.34.56.79:9527"} response = requests.get("http://www.baidu.com", proxies = proxies) print(response.text)如果一个响应中包含了cookie,那么我们可以利用 cookies参数拿到:
import requests response = requests.get("http://www.baidu.com/") # 7. 返回CookieJar对象: cookiejar = response.cookies # 8. 将CookieJar转为字典: cookiedict = requests.utils.dict_from_cookiejar(cookiejar) print(cookiejar) print(cookiedict)运行结果:
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]> {'BDORZ': '27315'}在 requests 里,session对象是一个非常常用的对象,这个对象代表一次用户会话:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开。
会话能让我们在跨请求时候保持某些参数,比如在同一个 Session 实例发出的所有请求之间保持 cookie 。
Requests也可以为HTTPS请求验证SSL证书:
要想检查某个主机的SSL证书,你可以使用 verify 参数(也可以不写) import requests response = requests.get("https://www.baidu.com/", verify=True) # 也可以省略不写 # response = requests.get("https://www.baidu.com/") print(r.text)运行结果:
<!DOCTYPE html> <!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge>百度一下,你就知道 .... 如果SSL证书验证不通过,或者不信任服务器的安全证书,则会报出SSLError:来测试一下:
import requests response = requests.get("https://www.12306.cn/mormhweb/") print(response.text)果然:
SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",)如果我们想跳过 12306 的证书验证,把 verify 设置为 False 就可以正常请求了。
r = requests.get("https://www.12306.cn/mormhweb/", verify = False)登录后的Cookie值,保存在ssion里 ssion.post(“http://www.renren.com/PLogin.do”, data = data)
response = ssion.get(“http://www.renren.com/928944480/profile”)
print(response.text)
## 处理HTTPS请求 SSL证书验证 Requests也可以为HTTPS请求验证SSL证书: - 要想检查某个主机的SSL证书,你可以使用 verify 参数(也可以不写) ```python import requests response = requests.get("https://www.baidu.com/", verify=True) # 也可以省略不写 # response = requests.get("https://www.baidu.com/") print(r.text)运行结果:
<!DOCTYPE html> <!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge>百度一下,你就知道 .... 如果SSL证书验证不通过,或者不信任服务器的安全证书,则会报出SSLError:来测试一下:
import requests response = requests.get("https://www.12306.cn/mormhweb/") print(response.text)果然:
SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",)如果我们想跳过 12306 的证书验证,把 verify 设置为 False 就可以正常请求了。
r = requests.get("https://www.12306.cn/mormhweb/", verify = False)————————————————————————————————————————————