在进入正题之前,我们先复习一个关于requests模块的相关知识点:
requests中解决编码的三种方法:
①response.content
类型:bytes
解码类型:没有指定
如何修改编码方式:response.content.decode()
②response.content.decode()
类型:str
解码类型:解码成python文本的字符串类型
如何修改编码方式:respsonse.content.decode(encoding="utf-8")
③response.txt
类型:str
解码类型:根据HTTP头部对响应的编码作出有根据的推测,推测的文本编码。
如何修改编码方式:response.encoding="gbk"
所以,综上所述,最好的方式就是使用response.content.decode()来获取响应的html页面。
那么现在,回到正题:
我们做爬虫的时候,一定要学会伪装自己。
因为一旦有一天,你不采取措施,但是你需求的量多,频率也快,是很容易被识别为爬虫的,从而对你拦截处理。
思路很简单,就是我一个人模拟多个人,那么从人的属性分析:
浏览器名称,ip地址,cookie和session信息。
所以我们写爬虫的时候,要准备一堆User-Agent,一堆ip地址和一堆cookie信息。
①使用代理ip
ip参数是proxies,依旧是字典的形式{"http":"http://www.baidu.com"}
ip的选择
-准备一堆的ip地址,组成ip池,使用代理时随机选择一个ip使用。
-{"ip":"times":0}
-[{},{},{},{}],对这个ip地址的列表进行排序,按照使用次数进行那个排序。
-选择使用次数较少的10个ip,从中随机选择一个。
检查ip的可用性
-可以使用requests添加超时参数,判断ip地址的质量
-在线代理ip质量检测的网站
import requests
proxies={"http":"http://132.232.52.79:80"} #选择代理IP地址的时候,要选对跟自己网络符合的端口哦,否则就是407
headers={"User-Agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1"}
url="http://www.baidu.com"
response=requests.get(url,proxies=proxies,headers=headers)
print(response.status_code)
②使用cookie和session
cookie存放在客户的浏览器上,session数据放在服务器上。
一组cookie和session的信息对应于一个用户的信息。
使用过快过多会被识别会爬虫。
但是要获取登陆之后的页面,必须发送带有cookies的请求。
携带cookie请求
跟ip池一样的是,这次需要携带一堆cookie进行请求,把cookie组成cookie池。
使用requests提供的session类来请求登陆之后的网站的思路
实例化sessin,
先使用session发送post请求,登录到正确的网站,把cookie保存在session中,
再使用session请求get登陆之后才能访问的网站,session能够自动地携带登录成功时保存在其中的cookie,进行请求。
import requests
session=requests.session()
url="http://www.renren.com/SysHome.do"
data={"email":"177********","password":"***123456789"}
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6814.400 QQBrowser/10.3.3005.400"}
#使用session发送post请求,cookie保存在其中
session.post(url,data=data,headers=headers)
#使用session进行登陆之后才能访问的地址
response=session.get("http://www.renren.com/969398979/profile",headers=headers)
#保存页面
with open("renrenwang.html","w",encoding="utf-8") as f:
f.write(response.content.decode())
cookie和session的使用思路,我再复述一遍:
首先实例化一个session,然后准备好post请求的表单内容,里面包含账号密码等登陆信息。
然后用session发送post请求,登陆上网站,这个时候已经完成cookie和session的自动保存。
于是就再用session直接发送get请求,登陆上一个需要登陆账号密码的网页,这个时候,依旧能访问成功。
值得一提的是,这个过程可以简化,当遇到一下三种情况的时候:
1.cookie过期时间很长的网站
2.在cookie过期之前能够拿到所有的数据,比较麻烦
3.配合其他程序一起使用,其他程序专门获取cookie,当前程序专门请求页面
我们可以直接加入cookie信息,直接登陆上去。方法是和headrs字典一样的,创造一个cookie字典放进去,然后get请求里面放一个cookies参数。
具体过程我就不放代码了,结合headers类似的方法应该都懂。
总结一下今后的爬虫之路,就是准备一堆浏览器名称,一堆IP地址和一堆cookie信息,做到对自己的完美伪装。