上次我写了第一个网络爬虫是抓取的天气状况,这次来尝试一下登录。
首先,像之前一样,取得header的信息。
和之前的例子不同,登录需要向服务器发送一些信息,如账号、密码等。
同样,可以使用chrome的开发者工具 在network里勾选Preseve log。
然后手动执行一次登录的过程,找到一个叫email的网络请求,在header的底部有data所包含的字段,为 _xsrf,password,remember_me和 email。其中_xsrf字段可从登录页面的源码中获取。
这次,我们要创建一个session来保存相关信息和记住登录状态。
代码如下:
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
def login():
header = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.235'
}
session = requests.session()
res = session.get('http://www.zhihu.com',headers = header).content
_xsrf = BeautifulSoup(res, "html.parser").find('input', attrs={'name': '_xsrf'})['value']
login_data = {
'_xsrf':_xsrf,
'password':'xxxx',
'remember_me':'true',
'email':'xxxx'
}
session.post('https://www.zhihu.com/#signin',data = login_data,headers = header)
res = session.get('http://www.zhihu.com')
print(res.text)
if __name__ == '__main__':
login()
2018-02-15更新
之前的代码是写于2016年3月,现在知乎已做较大改变,已不适用。