Python网络爬虫之模拟登录(以知乎为例)
2016-10-18 15:54
761 查看
参考:Web Crawler with Python - 08.模拟登录 (知乎)
在实践时,发现该行报错:
[python] view
plain copy
_xsrf = BeautifulSoup(session.get('https://www.zhihu.com/#signin').content).find('input', attrs={'name': '_xsrf'})['value']
于是在chrome下F12再次分析一下登录过程之后,在requests的headers中加入User-Agent,发现可以获得_xsrf 字段。
接下来获取验证码和请求时同理加上User-Agent。
之后再获取验证码时,发现获得的结果如下:
ERR_VERIFY_CAPTCHA_SESSION_INVALID
再次分析获得验证码的请求(更新验证码):
考虑请求时使用的requests的session机制,已经携带了cookie信息。于是怀疑是url的问题。
改成如下解决:
[python] view
plain copy
captcha_content = session.get('http://www.zhihu.com/captcha.gif?r=%d&type=login' % (time.time() * 1000), headers=headers).content
最后修改断言,返回结果如下:
[python] view
plain copy
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
import requests
from bs4 import BeautifulSoup
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36',
# 'Referer':'https://www.zhihu.com/',
# 'X-Requested-With': 'XMLHttpRequest',
# 'Origin':'https://www.zhihu.com'
}
def login(username, password, kill_captcha):
session = requests.session()
_xsrf = BeautifulSoup(session.get('https://www.zhihu.com/#signin', headers=headers).content).find('input', attrs={'name': '_xsrf'})['value']
session.headers.update({'_xsrf':str(_xsrf)})
#加入type=login 否则:ERR_VERIFY_CAPTCHA_SESSION_INVALID
captcha_content = session.get('http://www.zhihu.com/captcha.gif?r=%d&type=login' % (time.time() * 1000), headers=headers).content
data = {
'_xsrf': _xsrf,
'password': password,
'captcha': kill_captcha(captcha_content),
'email': username,
'remember_me': 'true'
# 字典的键值对顺序可以随机
}
print data
resp = session.post('http://www.zhihu.com/login/email', data=data, headers=headers).content
# 登录成功
print 'resp\n',resp
assert r'\u767b\u5f55\u6210\u529f' in resp
return session
def kill_captcha(data):
with open('1.gif', 'wb') as fp:
fp.write(data)
return raw_input('captcha : ')
if __name__ == '__main__':
session = login('email', 'password', kill_captcha)
print BeautifulSoup(session.get("https://www.zhihu.com",headers=headers).content).find('span', class_='name').getText()
三个问题:
在实践时,发现该行报错:[python] view
plain copy
_xsrf = BeautifulSoup(session.get('https://www.zhihu.com/#signin').content).find('input', attrs={'name': '_xsrf'})['value']
于是在chrome下F12再次分析一下登录过程之后,在requests的headers中加入User-Agent,发现可以获得_xsrf 字段。
接下来获取验证码和请求时同理加上User-Agent。
之后再获取验证码时,发现获得的结果如下:
ERR_VERIFY_CAPTCHA_SESSION_INVALID
再次分析获得验证码的请求(更新验证码):
考虑请求时使用的requests的session机制,已经携带了cookie信息。于是怀疑是url的问题。
改成如下解决:
[python] view
plain copy
captcha_content = session.get('http://www.zhihu.com/captcha.gif?r=%d&type=login' % (time.time() * 1000), headers=headers).content
最后修改断言,返回结果如下:
代码:
[python] viewplain copy
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
import requests
from bs4 import BeautifulSoup
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36',
# 'Referer':'https://www.zhihu.com/',
# 'X-Requested-With': 'XMLHttpRequest',
# 'Origin':'https://www.zhihu.com'
}
def login(username, password, kill_captcha):
session = requests.session()
_xsrf = BeautifulSoup(session.get('https://www.zhihu.com/#signin', headers=headers).content).find('input', attrs={'name': '_xsrf'})['value']
session.headers.update({'_xsrf':str(_xsrf)})
#加入type=login 否则:ERR_VERIFY_CAPTCHA_SESSION_INVALID
captcha_content = session.get('http://www.zhihu.com/captcha.gif?r=%d&type=login' % (time.time() * 1000), headers=headers).content
data = {
'_xsrf': _xsrf,
'password': password,
'captcha': kill_captcha(captcha_content),
'email': username,
'remember_me': 'true'
# 字典的键值对顺序可以随机
}
print data
resp = session.post('http://www.zhihu.com/login/email', data=data, headers=headers).content
# 登录成功
print 'resp\n',resp
assert r'\u767b\u5f55\u6210\u529f' in resp
return session
def kill_captcha(data):
with open('1.gif', 'wb') as fp:
fp.write(data)
return raw_input('captcha : ')
if __name__ == '__main__':
session = login('email', 'password', kill_captcha)
print BeautifulSoup(session.get("https://www.zhihu.com",headers=headers).content).find('span', class_='name').getText()
相关文章推荐
- Python网络爬虫之模拟登录(以知乎为例)
- python--python3爬虫之模拟登录知乎
- 【网络爬虫】【python】网络爬虫(三):模拟登录——伪装浏览器登录爬取过程
- Python 网络爬虫--简单的模拟登录
- Python 网络爬虫---四种方法模拟浏览器登录
- Python爬虫之模拟知乎登录的方法教程
- 【python爬虫01】使用requests库模拟登录知乎
- Python 网络爬虫--关于简单的模拟登录实例讲解
- 【python爬虫03】使用Scrapy框架模拟登录知乎
- Python爬虫初学(三)—— 模拟登录知乎
- 【爬虫】python requests模拟登录知乎
- Python爬虫模拟登录带验证码网站
- python模拟登录知乎
- Python爬虫实战(5):模拟登录淘宝并获取所有订单(1)
- python 爬虫——登录知乎
- Python使用Srapy框架爬虫模拟登陆并抓取知乎内容
- Python爬虫之模拟登录总结
- Python爬虫之模拟登录豆瓣获取最近看过的电影
- [python和大数据-1]利用爬虫登录知乎进行BFS搜索抓取用户信息本地mysql分析【PART1】
- python爬虫实践学习实例之模拟登录