代理
- 浏览器 --> 服务器
- 反向代理:浏览器 --> nginx --> 服务器
- 正向代理:浏览器 --> 代理 --> 服务器
问题:为什么爬虫需要使用代理?
- 让服务器以为不是同一个客户端在请求
- 防止我们的真实地址被泄露,防止被追究
使用代理IP
- 准备一堆的ip地址,组成IP池,随机选择一个IP来使用
- 如何随机选择代理IP,让使用次数较少的IP地址有更大的可能性被用到
- {'ip':ip,'times':0}
- [{},{}]对这个IP的列表进行排序,按照使用次数进行排序
- 选择使用次数较少的10个IP,从中随机选择一个
- 检查IP的可用性
- 可以使用requests添加超市参数,判断IP地址的质量
- 在线代理IP质量检测的网站
import requests # 根据协议类型,选择不同的代理 proxies = { "http": "http://12.34.56.79:9527", "https": "http://12.34.56.79:9527", } response = requests.get("http://www.baidu.com", proxies = proxies) print response.text
- 也可以通过本地环境变量 HTTP_PROXY 和 HTTPS_PROXY 来配置代理
export HTTP_PROXY="http://12.34.56.79:9527"
export HTTPS_PROXY="https://12.34.56.79:9527"
cookie和session区别
- cookie数据存放在客户的浏览器上,session数据放在服务器上。
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗。
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
爬虫处理cookie和session
- 带上cookie、session的好处:
能够请求到登录之后的页面- 带上cookie、session的弊端:
一套cookie和session往往和一个用户对应请求太快,请求次数太多,容易被服务器识别为爬虫- 不需要cookie的时候尽量不去使用cookie,但是为了获取登录之后的页面,我们必须发送带有cookies的请求
处理cookies 、session请求
requests 提供了一个叫做session类,来实现客户端和服务端的会话保持
Cookies
import requests response = requests.get("http://www.baidu.com/") # 7\. 返回CookieJar对象: cookiejar = response.cookies # 8\. 将CookieJar转为字典: cookiedict = requests.utils.dict_from_cookiejar(cookiejar) print (cookiejar) print (cookiedict)
session
请求登陆之后的网站的思路
- 实例化session
- 先使用session发送请求,登录网站,把cookie保存在session中
- 再使用session请求登录之后才能访问网站,session能够自动的携带登录成功时保存在其中的cookie,进行请求
实现人人网登录
import requests # 1.创建session对象,可以保存Cookie值 ssion = requests.session() # 2.处理 headers headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"} # 3.需要登录的用户名和密码 data = {"email":"mr_mao_hacker@163.com", "password":"alarmchime"} # 4.发送附带用户名和密码的请求,并获取登录后的Cookie值,保存在ssion里 ssion.post("http://www.renren.com/PLogin.do", data = data) # 5.ssion包含用户登录后的Cookie值,可以直接访问那些登录后才可以访问的页面 response = ssion.get("http://www.renren.com/410043129/profile") # 6.打印响应内容 print (response.text)
Requests小技巧
- reqeusts.util.dict_from_cookiejar 把cookie对象转化为字典
requests.get(url,cookies={})- 请求 SSL证书验证
response = requests.get("https://www.12306.cn/mormhweb/ ", verify=False)- 设置超时
response = requests.get(url,timeout=10)- 配合状态码判断是否请求成功
assert response.status_code == 200
异常重试
-
pip install retrying
from retrying import retry @retry(stop_max_attempt_number=3) #只使用@retry,则会一直不停运行 #stop_max_attempt_number最大运行次数 #stop_max_delay 设置失败重试的最大时间, 单位毫秒,超出时间,则停止重试 #wait_fixed 设置失败重试的间隔时间 #wait_random_min, wait_random_max 设置失败重试随机性间隔时间 #wait_exponential_multiplier-间隔时间倍数增加,wait_exponential_max-最大间隔时间 #retry_on_exception:指定异常类型,指定的异常类型会重试,不指定的类型,会直接异常退出 def index(): print(1/0)
网友评论