在大数据时代,很多人会利用爬虫对网上一些数据进行采集,但有些网站为了反爬会出一些策略,在爬取某些网页时,登陆界面时经常遇到的一个坎,而现在大多数的网站在登陆时都会要求用户填写验证码,验证码的形式多种多样,例如静态图片、动态验证码、滑动、12306验证模式、甚至还用上短信验证码。虽然现在技术也可以解决图片识别,但万一网站改了验证方案,那么整套算法都有可能被推翻,很显然强行破解验证码是一个吃力不讨好的策略。可以利用python中的request模块进行的一个模拟登陆,其中用到了reqeust.session下的cookies来跳过登陆这一环节,本文的调试浏览器为chrome,不同浏览器可能有所差异,但逻辑是一样的。
agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36"
headers = {
"HOST": "xxx.com",
"Referer": "http://xxx.com/Manager/Main.aspx",
"User-Agent": agent
}
这一步比较重要,就是要人为成功登录一次以便于获取登录信息,F12然后依次F12>Application>Cookies找到成功登陆后的cookie数据。
图中打码是处于个人隐私,所以临时抹去,接着就是把其中的Name,Value值复制出来并以字典的形式存放在变量里。
cookies = {
'xxx_cookie_time':'2020-04-28+10%3a59%3a19',
'xxx_cookie_language': 'zh_CN',
'ASP.NET_SessionId': 'v0vszqppwpxxxxxxxx',
'ValidCode':'OicQ%2bxxxx',
'xxx_session_id':'FUl0%2b4kCmyEyxxxxxxxxxx',
'_ati':'1733720xxxx'
}
然后创建一个session对象,将headers和cookies赋给session
import requests
session = requests.session()
session.headers = headers
requests.utils.add_dict_to_cookiejar(session.cookies, cookies)
其中,值得注意的是,session.headers可以是dict,所以直接赋值没问题,而session.cookies必须是
url='http://xxx.com/Order/CodeByOrder.aspx?OrderCode=xxxxxx'
response = session.get(url)
>>> response
<Response [200]>
现在我们就可以成功获取页面源码,再则就可以对自己需要的数据进行解析提取了。
如果想发送方GET/POST请求,那么就可以把已有的cookie缓存下来,然后再以参数传回requests中即可实现那些需要登录才可以发送请求的操作:
cookies_dict = requests.utils.add_dict_to_cookiejar(session.cookies, cookies)
resget = requests.get(url, headers = headers, cookies = cookies_dict) # GET
respost = requests.post(url, headers = headers, cookies = cookies_dict) # POST
print(resget.text)
print(respost.text)
注:使用cookies模拟登录的方法,人为登录一次的cookies一旦失效,就又得再次登录获取cookies。
import requests
agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36"
headers = {
"HOST": "xxx.com",
"Referer": "http://xxx.com/Manager/Main.aspx",
"User-Agent": agent
}
cookies = {
'xxx_cookie_time':'2020-04-28xxxx',
'xxx_cookie_language': 'zh_CN',
'ASP.NET_SessionId': 'v0vszqppwpxxxxx',
'ValidCode':'OicQ%2b2xxxx',
'xxx_session_id':'FUl0%2b4kCmyEyxxxxxxxxxx',
'_ati':'1733720xxxx'
}
session = requests.session()
session.headers = headers
requests.utils.add_dict_to_cookiejar(session.cookies, cookies)
url='http://xxx.com/Order/CodeByOrder.aspx?OrderCode=xxxxxx'
response = session.get(url)
>>> response
<Response [200]>