一、常见的反爬虫手段
1、User_Agent 浏览器类型、版本信息等
2、Referer 表示我们从哪个连接跳转过来的
3、Cookis 登录信息
二、常用的反反爬虫手段
1、模拟用户浏览器的User_Agent
2、模拟用户登录
(1) requestes 的 post 请求
(2) WebDriver(Selenium ) 模拟浏览器行为
3、验证码
三、实例
1、模拟用户浏览器的User_Agent
(1)使用第三方库
#安装第三方库
pip install fake-useragent
from fake_useragent import UserAgent
# 不进行ssl验证,否者会造成请求UserAgent失败
ua = UserAgent(verify_ssl=False)
# 模拟不同的浏览器
print(f'Chrome浏览器: {ua.chrome}')
# print(ua.safari) #safari浏览器
# print(ua.ie) #ie浏览器
# 随机返回头部信息,推荐使用
print(f'随机浏览器: {ua.random}')
(2)查看网页返回头中的User_Agent
当我们的爬虫无法获取到网页信息的时候,我们可以比对我们用浏览器访问时的头部信息,检查自己缺少了那些头部信息。
2、Referer
Referer 可以在Response headers找到,写到我们的请求头就可以了
对于简单的爬虫,在Request Headers 里面就能够找到很多用于爬虫的信息。
3、模拟用户登录
cookies 其实我们可以直接在Request Headers中获得,但是cookies有是有租期限制的,手动更改对于复杂的爬虫程序太过繁琐。cookis可以用来模拟用户登录,里面有用户的登录信息。
HTTP的GET和POST请求方法
1、GET 方法
import requests
r = requests.get('https://github.com')
#打印状态码
print(r.status_code)
#答应头部信息的内容类型
print(r.headers['content-type'])
# r.text
#返回字符编码
print(r.encoding)
# r.json()
2、 POST 方法
import requests
r = requests.post('http://httpbin.org/post', data = {'key':'value'})
r.json()
使用cookies模拟登录
1.找到登录请求发送到那个URL
2.定义post请求,参照Form Data的格式
request实现模拟登陆
import time
import requests
from fake_useragent import UserAgent
#
ua = UserAgent(verify_ssl=False)
headers = {
'User-Agent' : ua.random,
'Referer' : 'https://accounts.douban.com/passport/login_popup?login_source=anony'
}
#使得多个请求在一个Session会话中
s = requests.Session()
# 会话对象:在同一个 Session 实例发出的所有请求之间保持 cookie,
# 期间使用 urllib3 的 connection pooling 功能。
# 向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升。
login_url = 'https://accounts.douban.com/j/mobile/login/basic'
form_data = {
'ck':'',
'name':'15055495@qq.com',
'password':'',
'remember':'false',
'ticket':''
}
# post数据前获取cookie
pre_login = 'https://accounts.douban.com/passport/login'
pre_resp = s.get(pre_login, headers=headers)
#携带这个cookies 进行登陆
response = s.post(login_url, data=form_data, headers=headers, cookies=s.cookies)
# 登陆后可以进行后续的请求
# url2 = 'https://accounts.douban.com/passport/setting'
#使用已经登陆的会话发起后续的请求
# response2 = s.get(url2,headers = headers)
#开启新的会话,但是携带了经过登录的会话的cookies
# response3 = newsession.get(url3, headers = headers, cookies = s.cookies)
#对返回信息进行保存
# with open('profile.html','w+') as f:
# f.write(response2.text)
为什么要在post请求前进行一次请求,并在post请求时,携带cookies,因为如果不携带cookies未登录前的页面都有可能访问失败
有时候我们在输入完密码登录时,会有一个滑动验证码,这时候我们可以使用 WebDriver 来完成这个验证操作。