python3爬虫(2)--requests库的基本使用、高级应用、异常处理

本文试用环境:python3
比urllib更强大的python爬虫请求库requests,Cookies、登录验证、代理设置等操作都有很好的解决
安装:
pip install requests 
引入:
import requests

目录

一、基本使用

1.1、一句话的请求

1.2、get请求的params 参数

1.3、post请求的data参数

1.4、抓取网页通常加入headers、timeout、time.sleep信息

1.5、JSON格式的解析

1.6、抓取二进制数据的解析

1.7、响应

二、requests库高级应用

2.1、Cookies处理

2.2、会话维持,保持登陆状态。Session对象。

2.3、代理设置

2.4、身份认证

2.5、Prepared Request

2.6、其他:SSL 证书验证、文件上传、OAuth 认证等

三、异常处理


一、基本使用

1.1、一句话的请求

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# pip install requests #安装
import requests  #导入
r=requests.get("https://me.csdn.net/column/weixin_41685388")
print(type(r)) #类型:<class 'requests.models.Response'>
print(r. status_code)#状态:200 或者404、500...等
print(type(r.text)) #响应体的类型:<class 'str'>
print(r.cookies) #cookies:<RequestsCookieJar[<Cookie(.*)/>]>
print(r.text) #页面内容
#使用get()方法成功实现一个GET请求,这倒不算什么,
# 更方便之处在于其他的请求类型依然可以用一句话来完成,示例如下:
r1=requests.post('http://httpbin.org/post')
r2=requests.put('http://httpbin.org/put')
r3=requests.delete('http://httpbin.org/delete')
r4=requests.head('http://httpbin.org/get')
r5=requests.options("http://httpbin.org/get")

1.2、get请求的params 参数

import requests
r=requests.get('http://httpbin.org/get?name=germey&age=22')
#<==>等价于
data={'name':'germey','age':22}
r1=requests. get("http://httpbin.org/get", params=data)
print(r1.text)

1.3、post请求的data参数

response=requests.post(url,data=data,headers= Headers,timeout=30) #data为字典类型
def youdao(input):
    import requests
    from requests.exceptions import ConnectTimeout
    import time
    import random
    url=r"http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
    Headers = { }
    Headers["Cookie"]=r'OUTFOX_SEARCH_USER_ID_NCOO=1564612197.2237918; OUTFOX_SEARCH_USER_ID="[email protected]"; _ga=GA1.2.269278628.1571982437; _ntes_nnid=db62add68d78e9de1c202b8b131b32a4,1579175684866; JSESSIONID=aaaGcKLB2j8UhdX6Q3V_w; SESSION_FROM_COOKIE=unknown; ___rl__test__cookies=1579203741289'
    Headers["User-Agent"]=r"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
    data = { } #post请求需要的data参数,在网页检查的Form Data中,
    #data["i"]="I am jalen" #认真一点你会发现这就是我们输入的值,自己做一个简单的有道翻译只需要修改这里就可以实现
    data["i"] = input  #那就按照习惯在函数外单独输入经常变化的值
    data["from"]="AUTO"
    data["to"]="AUTO"
    data["smartresult"]="dict"
    data["client"]="fanyideskweb"
    data["salt"]="15792037412906"
    data["sign"]="324404ee89ccb63c2ea1efb7d311db26"
    data["ts"]="1579203741290"
    data["bv"]="74b3450c611e373bdb05dc0a4ecdedd0"
    data["doctype"]="json"
    data["version"]="2.1"
    data["keyfrom"]="fanyi.web"
    data["action"]="FY_BY_CLICKBUTTION"
    rand = random.randint(2, 5)
    time.sleep(rand) #延时提交
    #请求时data直接用字典格式
    try:
        response=requests.post(url,data=data,headers= Headers,timeout=30)
        #print(response.text)
        html = response.json()
        #print(html)
        tgt = html['translateResult'][0][0][ 'tgt']
        print(tgt)
    except (ConnectTimeout) as e:
        print("ConnectTimeout")
        return
if __name__ == '__main__':
    input='I am jalen'
    youdao(input)

1.4、抓取网页通常加入headers、timeout、time.sleep信息

  • headers:url网页-->右击-->检查(N)-->Network-->F5-->(找到包含所需内容的Name)-->Headers-->Response Headers,常用"Cookie"和"User-Agent"
  • timeout:请求响应超时时间限定,超出设定时间报错:requests.exceptions.ConnectTimeout
  • time.sleep:设置延时提交的时间,在实际爬虫过程中和随机数联合使用
import requests
import random
import time
import json
r=requests.get('http://httpbin.org/get?name=germey&age=22')
#<==>等价于
data={'name':'germey','age':22}
Headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36'}
rand = random.randint(2, 5)
time.sleep(rand) #延时提交
r1=requests.get("http://httpbin.org/get", params=data,headers= Headers,timeout = 30)
print(type(r1.text))
#print(r1.text)
r1 = r1.json() #str-->json-->dict
print(type(r1)) #查看类型:dict
print(r1) #输出json格式的结果
'''
<class 'str'>
<class 'dict'>
{'args': {'age': '22', 'name': 'germey'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.22.0'}, 'origin': '27.47.130.215, 27.47.130.215', 'url': 'https://httpbin.org/get?name=germey&age=22'}

'''

1.5、JSON格式的解析

网页的返回类型实际上是str类型,但是需要JSON格式进行解析的。可以直接调用json()方法,就可以将返回结果是JSON格式的字符串转化为字典。【案例如:1.3、】。

1.6、抓取二进制数据的解析

案例:https://img-blog.csdnimg.cn/20191224145404163.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224

import requests
r=requests.get("https://img-blog.csdnimg.cn/20191224145404163.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224")
print(r.text) #结果:���� JFIF �� C
print(r.content) #结果:b'\xff\xd8\xff\xe0\x00\...代表是bytes类型的数据
with open('python.ico','wb') as f: #将图片以2进制的格式存在python.ico中,可以.png等其他格式
    f. write(r.content)

1.7、响应

发送请求后,得到的就是响应。在上面的实例中,我们使用text和content获取了响应的内容。此外,还有很多属性和方法可以用来获取其他信息,比如状态码、响应头、Cookies等。示例如下:

import requests
r=requests.get("https://blog.csdn.net/weixin_41685388/category_9426224.html")
print(type(r.status_code),r.status_code)  # 状态:200 或404、500等
print(type(r.headers),r.headers) # headers信息
print(type(r.cookies),r.cookies) # Cookie信息
print(type(r.history),r.history) # 请求历史记录
print(type(r.text),r.text) # 响应的内容 文本str格式
#print(type(r.json()),r.json()) # 响应的内容 json-->dict
#print(type(r.content),r.content) # 响应的内容 二进制文件

二、requests库高级应用

2.1、Cookies处理

(1)获取Cookies。

import requests 
r=requests. get("https://www.baidu.com/")
print(type(r.cookies),r.cookies) #获取cookies
for key, value in r.cookies.items(): 
    print(key+'='+value)

(2)使用Cookies。

Cookies在headers中应用,用于维持登陆状态,在实际爬取网页的过程中,可以在浏览器中找到。谷歌浏览器为例:url网页-->右击-->检查(N)-->Network-->F5-->(找到包含所需内容的Name)-->Headers-->Response Headers,常用"Cookie"和"User-Agent"。

2.2、会话维持,保持登陆状态。Session对象。

利用它,我们可以方便地维护一个会话,而且不用担心cookies的问题,它会帮我们自动处理好。你使用session成功的登录了某个网站,则在再次使用该session对象求求该网站的其他网页都会默认使用该session之前使用的cookie等参数。requests库的session对象还能为我们提供请求方法的缺省数据,通过设置session对象的属性来实现 。

尤其是在保持登陆状态时运用的最多,在某些网站抓取,或者app抓取时,有的时强制登陆,有的是不登陆返回的数据就是假的或者说是不完整的数据,那我们不可能去做到每一次请求都要去登陆一下怎么办,就需要用到保持会话的功能了,我们可以只登陆一次,然后保持这种状态去做其他的或者更多的请求。

import requests
import time
# session()中方法和requests()中一样
# session.get()  session.post()
session = requests.session()
# 使用session发送post请求获取cookie保存到本地session中。
# 以人人网登录为例。
post_url = "http://www.renren.com/PLogin.do"
headers = {"User-Agent": "Mozilla/5.0"}
session = requests.session()
post_data = {"email": "username", "password": "password"}
session.post(post_url, headers=headers, data=post_data)
# 使用session请求登录后的页面
# 得到登录后的网页内容
url = "http://www.renren.com/xxxxx/profile"
response = session.get(url, headers=headers)

2.3、代理设置

import requests
proxies = {
    'http': 'http://192.168.2.47:80',
    'https': 'https://157.245.54.87:8080'
} #临时代理ip会过期
r = requests.get("https://www.taobao.com",proxies=proxies)
print(r.text)

2.4、身份认证

import requests 
from requests.auth import HTTPBasicAuth 
r=requests.get("http://localhost:5000",auth=HTTPBasicAuth("username","password"))
print(r. status_code)
#或
import requests 
r=requests.get("http://localhost:5000",auth=("username","password"))
print(r. status_code)

2.5、Prepared Request

这里我们引入了Request,然后用url、data和headers参数构造了一个Request对象,这时需要再调用Session的prepare_request()方法将其转换为一个Prepared Request对象,然后调用send()方法发送即可,如下:

2.6、其他:SSL 证书验证、文件上传、OAuth 认证等

不再赘述

三、异常处理

在调试过程中根据实际情况处理,一般情况都是exceptions.xxxx异常,处理语法:

from requests import exceptions
try:
    "无异常执行代码"
except exceptions.xxxx as e:
    "异常执行代码"
def timeout_request(url):
    import json
    import requests
    from requests import exceptions
    try:
        response = requests.get(url,timeout=0.000000005)
        response.raise_for_status()
    except exceptions.ConnectTimeout as e:
        print(e)
    except (exceptions.HTTPError,exceptions.MissingSchema) as e:
        print(e)
        
urls= ["https://blog.csdn.net/weixin_41685388/category_9426224.html","www.baidu.com/"]
for url in urls:
    timeout_request(url)
发布了104 篇原创文章 · 获赞 82 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_41685388/article/details/104032962