栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

爬虫第三篇——requests高阶教程

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

爬虫第三篇——requests高阶教程

爬虫requests高阶 一、SSL验证

这次我们用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)

运行:

四、身份认证

在访问某些设置了身份认证的网站时,例如:点击打开,如果我们想要访问这个网站,就需要进行身份认证

4.1 基本身份认证

我们可以看到这个网站用了身份认证,它是一种用来允许网页浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式,这时我们想要爬取就需要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状态码

4.2 摘要式身份认证

摘要认证是基于挑战-应答模式的认证模型,比基础认证更安全

import requests
from requests.auth import HTTPBasicAuth

url = 'http://httpbin.org/digest-auth/auth/user/pass'
requests.get(url, auth = HTTPBasicAuth('user','pass'))

运行:

五、总结

这一篇通篇都是以B站作为例子来展示,自己写的过程中遇到的问题比上一篇的要少,但是理解起来比上一篇要难,学的时候要好好记笔记、做总结,能感觉到自己在进步。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/488293.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号