Loading

Python爬虫requests请求库

requests:pip install  request 安装

实例:

import requests
url = 'http://www.baidu.com'
response = requests.get(url=url)
print(type(response)) #请求类型
print(response.status_code) #网站响应状态码
print(type(response.text)) #网站内容类型
print(response.text) #网站内容
print(response.cookies) #网站cookies


requests.post()
requests.get()
requests.put()
requests.delete()
requests.head()
requests.options() #requests可以直接实现各种请求,比urllib方便很多




基本实例
构建一个最简单的get请求,链接为 http://httpbin.org/get
import requests
r = requests.get('http://httpbin.org/get')
print(r.text)
传参
import requests
data = {
  'name':'germey',
  'age':'18'

r = requests.get('http://httpbin.org/get',dat=data)
print(r.text)

转换数据类型
import requests
r = requests.get('http://httpbin.org/get')
print(type(r.text)) #打印出类型是json格式的字符串
pritn(r.json) #将返回结果是json格式的字符串转化为字典,如果返回结果不是json,便会出现解析错误,抛出json.decoder.JSONDecodeError异常
print(type(r.json())) #打印出类型是字典

抓取网页
import requests

headers = {
  'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}


r.requests.get(url='www.zhihu.come/explpre',headers=headers)
#这里加入headers请求头,其中包括user-agent字段信息,也就是浏览器标识信息,如果不加,知乎会禁止抓取

抓取二进制数据
#图片、视频、音频这些文件本质是由二进制码组成,犹豫有特定的保存格式和对应的解析方式,我们才可以看到这些 形形色色的媒体,如果抓取他们,就要拿到他们的二进制码
import requests
r = requests.get(url='https://github.com/favicon.ico')
print(r.text) #text结果出现乱码
print(r.content) #结果前带个B,代表是bytes类型数据,由于图片是二进制数据,打印时候转化为str类型,图片直接存为字符串,当然会出现乱码

#将提取的图片保存下来
with open('favicon.ico','wb') as f:
  f.write(r.content)
#这里用了open方法,第一个参数是文件名称,第二个参数代表以二进制写的形式打开,可以向文件写入二进制数据



POST请求
import requests
data = {'name':'germey','age':'22'}
r = requests.post(url='http://httpbin.org/post',data=data)
print(r.text) #可以发现获得返回结果,其中form部分就是提交的数据

响应
import requests

r = requests.get(url='http://www.jianshu.com')
print(type(r.status_code),r.status_code) #响应状态码类型以及状态码
print(type(r.headers),r.headers)       #请求头的类型以及打印请求头
print(type(r.cookies),r.cookies)       #cookies的类型以及打印cookies
print(type(r.url),r.url) #url类型以及打印url
print(type(r.history),r.history)       #history


文件上传

requests 可以模拟提交一些数据,如果一些网站需要上传文件
import requests
files = {'file':open('favicon.ico','rb')} #文件需要与当前脚本在同一目录下
r = requests.get('http://httpbin.org/post',files=fiels)



Cookies
import requests
r = requests.get('http://www.baidu.com')
pritn(r.cookies) #调用cookies属性得到cookies,可以发现是RequestCookieJar类型
for key.value in r.cookies.items(): #使用items()方将其转化为远足组成的列表,遍历输出每个cookies的名称和值
  print(key + '=' + vlaue)


会话维持

在requests中,直接利用get和post等方法可以做到模拟网页的请求,但是这实际是相当于不相同的会话,也就是说相当于你用两个浏览器打开不同的页面
设想这样一个场景,第一个请求用post方法登录的某个网站,第二次想获取登录后的个人信息,你又用了一次get方法请求个人信息页面,这相当于打开两个
浏览器,两个不相干的会话,不能获取到个人信息,如果两个请求设置同样的cookies可以获取到,但是有些繁琐,可以有更简单的方法

import requests
s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789') #请求测试网址时设置一个cookies,名字叫做number,内容是123456789
r = s.get('http://httpbin.org/cookies/') #随后请求这个网址,可以网址可以获取当前的cookies
print(r.text)



SSL证书验证
requests提供了证书验证功能,当发送HTTP请求时,会检查SSL证书,我们可以使用verify参数控制是否检查此证书,如果不加verify参数的话
默认是True,会自动验证


import requests
response = requests.get('http://www.12306.cn')
pritn(response.status_code) #这样会提示一个错误SLLError表示证书验证错误
--------------------------------
response = requests.get('http://www.12306.cn',verify=False)
pritn(response.status_code) #这样就会打印一个请求成功的状态码

不过我们发现了一个警告,简易我们给它指定证书,我们可以通过设置忽略警告的方式来屏蔽这个警告
import requests
from requests.packages import urllib3
urllib3.disable_warnings()
response = requests.get('https://www.12306.cn',verify=Falsh)
print(response.status_code)

或者通过捕获警告到日志的方式忽略警告:

import logging
import requests
logging.CaptureWarnings(True)
response = requests.get('https://www.12306.cn',verify=False)
pritn(response.status_code)

我们也可以指定一个本地证书用作客户端证书,可以是单个文件(包含密钥和证书)或者一个包含两个文件路径的元祖
import requests
response = requests.get('https://www.12306.cn',cert=('/path/server.crt',/path/key)) #我们需要有crt和key文件,并且指定他们的路径
                                                  #本地私有证书key必须是解密状态
pritn(response.status_code)


 
代理设置
某些网站,请求频繁的时候,网站会弹出验证码,跳转到登录认证页面,或者封禁IP,导致一定时间内无法访问
为了防止这样的情况,我们可以设置代理IP ,使用proxies

import requests
proxies = {
    'http':'http://10.10.1.10:3128', #这个代理是无效的
    'https':'http://10.10.1.10:3128'         #需要换成我们有效的代理IP
  }
requests.get('https://www.taobao.com',proxies=proxies)

若代理需要使用 HTTP Basic Auth,可以使用类似 http://user:password@host:post 这样的语法来设置代理
import requests
proxies = {
  'http':'http://user:password@10.10.1.10:3128'
}
requests.get('https://www.taobao.com',proxies=proxies)

除了最基本的HTTP代理之外,requests还支持socks协议的代理
import requests
proxies = {
   'http':'socks5://user:password@host:port',
   'https':'socks5://user:password@host:port'
}
requests.get('https://www.taobao.com',proxies=proxies)

超时设置
在本机网络状况不好或者服务器网络响应太慢甚至无响应时,我们可能会等特别久的时间才能收到响应,甚至到最后收不到响应而报错。
为了防止服务器不能及时响应,应该设置一个超时设置,即超过这个时间还没收到响应,就报错,需要用到timeout参数

import requests
response = requests.get('https://www.taobao.com',timeout=1) #超时时间设置为1秒,如果1秒没有响应,那就抛出异常


实际上,请求分为两个阶段,即连接(connect)和读取(read),上面设置的timeout将作用于这二者的timeout总和
如果要分别指定,就可以传入一个元组
r= requests.get('https://www.taobao.com',timeout(5,30)) #如果想永久等待,就设置为None或者直接留空,默认是None

身份验证
访问网站时没如果遇到认证页面, 需要进行身份验证(用户名和密码),此时就可以使用requests自带的身份认证功能
import requests
from requests.auth import HTTPBasicAuth
r = requests.get('http://localhost:5000',auth=HttpBasicAuth('username','password'))
pritn(r.status.code)

#如果用户名和密码正确,请求时就会认证成功,返回200状态码,如果认证失败,则返回401状态码
#如果每个参数都传一个HTTPBasicAuth类,显得有些繁琐,所以requests可以直接传递远足,它会默认使用HTTPBasicAuth方法

import requests
r= r.requests.get('http://localhost:5000',auth('username','password'))
pritn(r.status_code)















posted @ 2019-01-21 08:38  木子七  阅读(723)  评论(0编辑  收藏  举报