这次我们用B站作为例子来进行讲解
首先,用requests模块来请求一下B站:
import requests
response = requests.get('https://www.bilibili.com/')
print(response.status_code)
运行:
这里返回了 200,没返回失败也是挺神奇的
如果有报错SSLError,表示证书验证错误,把verify参数设置为False即可
import requests
response = requests.get('https://www.bilibili.com/',verify = False) #requests设置移除SSL认证
print(response.status_code)
运行:
我们可以看到警告信息,警告:Adding certificate verification is strongly advised(缺少证书)
我们有两种方法可以消除这个警告
第一种:设置忽略警告
import requests
from requests.packages import urllib3
urllib3.disable_warnings()
response = requests.get('https://www.bilibili.com/',verify = False)
print(response.status_code)
运行
第二种:通过捕获警告到日志来忽略警告
import requests
import logging
logging.captureWarnings(True)
response = requests.get('https://www.bilibili.com/',verify = False)
print(response.status_code)
运行:
import requests
proxies = {
'http': '182.105.54.104:9000',
'https': '182.105.54.104:9000',#无效代理,仅仅是个实例演示
}
requests.get('https://www.bilibili.com/', proxies = proxies)
因为这里用的是无效代理,所以直接运行会出现错误,可以自己用有效代理尝试一下,有问题请在评论区告诉我呀
运行:
如果代理需要HTTP Basic Auth,可以这样来写:
import requests
proxies = {
'https':'http://user:password@182.105.54.104:9000/',#无效代理,仅仅是个实例演示
}
requests.get('https://www.bilibili.com/',proxies = proxies)
除了基本的HTTP代理,requests也支持SOCKS协议的代理,SOCKS是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递
首先,安装SOCKS库
!pip install socks
安装之后就可以用SOCKS协议的代理了
import requests
proxy = '127.0.0.1:8080' #这里以本地代理作为示例,可以换成可用的进行测试
#proxy = 'username:password@127.0.0.1:8080'
proxies={
'http':'https://'+proxy,
'https':'https://'+proxy
}
try:
response = requests.get('http://httpbin.org/get',proxies = proxies)
print(response.text)
except requests.exceptions.ConnectionError as e:
print('错误:',e.args)
运行:
这里用的是本地代理,换成有用IP就可以了
有时由于网络速度或服务器问题,爬取网页需要时间。访问一个网页,如果长时间未响应就会返回超时,这时就需要根据自己的需要,来设置超时时间——timeout
import requests
response = requests.get('https://www.bilibili.com/')
print(response.status_code)
运行:
timeout=1,表示我们将超时时间设置为了1秒,如果1秒内没有相应,就抛出异常。
实际上请求是分两步:连接时间和读取时间,这里的 timeout=1 里面的1指的是这两步所用时间的总和。
如果需要分别指定,可以通过元祖来实现,比如:
import requests
response = requests.get('https://www.bilibili.com/',timeout = (10,20))
print(response.status_code)
运行:
如果想要永久等待,有两种方法,一种是不设置,因为timeout的默认值是None,一种是将timeout设置为None
import requests
response = requests.get('https://www.bilibili.com/')
print(response.status_code)
运行:
import requests
response = requests.get('https://www.bilibili.com/',timeout = None)
print(response.status_code)
运行:
在访问某些设置了身份认证的网站时,例如:点击打开,如果我们想要访问这个网站,就需要进行身份认证
我们可以看到这个网站用了身份认证,它是一种用来允许网页浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式,这时我们想要爬取就需要requests 自带的身份认证功能。
其基本格式为:
import requests
from requests.auth import HTTPBasicAuth
r = requests.get('https://static3.scrape.cuiqingcai.com/',auth = HTTPBasicAuth('admin','admin'))
print(r.status_code)
运行:
这里报错是说我们没有SSL验证,加上之后:
import requests
from requests.auth import HTTPBasicAuth
r = requests.get('https://static3.scrape.cuiqingcai.com/',auth = HTTPBasicAuth('admin','admin'),verify = False)
print(r.status_code)
这里认证成功了(用户名、密码都正确),所以返回200状态码
如果认证失败呢?
import requests
from requests.auth import HTTPBasicAuth
r = requests.get('https://static3.scrape.cuiqingcai.com/',auth = HTTPBasicAuth('username','password'),verify = False)
print(r.status_code)
认证失败就返回401状态码
摘要认证是基于挑战-应答模式的认证模型,比基础认证更安全
import requests
from requests.auth import HTTPBasicAuth
url = 'http://httpbin.org/digest-auth/auth/user/pass'
requests.get(url, auth = HTTPBasicAuth('user','pass'))
运行:
这一篇通篇都是以B站作为例子来展示,自己写的过程中遇到的问题比上一篇的要少,但是理解起来比上一篇要难,学的时候要好好记笔记、做总结,能感觉到自己在进步。



