本文试用环境:python3 比urllib更强大的python爬虫请求库requests,Cookies、登录验证、代理设置等操作都有很好的解决 安装: pip install requests 引入: import requests
目录
1.4、抓取网页通常加入headers、timeout、time.sleep信息
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)