python爬虫知乎

在以前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提升爬虫的效率。因为电影天堂上的资源获取权限是全部人都同样的,因此不须要进行登陆验证操做,写完那篇文章后又花了些时间研究了一下python模拟登录,网上关于这部分的资料不少,不少demo都是登录知乎的,缘由是知乎的登录比较简单,只须要post几个参数,保存cookie。并且尚未进行加密,很适合用来作教学。我也是是新手,一点点的摸索终于成功登录上了知乎。就经过这篇文章分享一下学习这部分的心得,但愿对那些和我同样的初学者有所帮助。前端

先来讲一下,爬虫模拟登录的基本原理吧,我也是刚开始接触对于一些深层次的东西也不是掌握的很清楚。首先比较重要的一个概念就是cookie,咱们都知道HTTP是一种无状态的协议,也就是说当一个浏览器客户端向服务器提交一个request,服务器回应一个response后,他们之间的联系就中断了。这样就致使了这个客户端在向服务器发送请求时,服务器没法判别这两个客户端是否是一个了。这样确定是不行的。这时cookie的做用就体现出来了。当客户端向服务器发送一个请求后,服务器会给它分配一个标识(cookie),并保存到客户端本地,当下次该客户端再次发送请求时连带着cookie一并发送给服务器,服务器一看到cookie,啊原来是你呀,这是你的东西,拿走吧。因此一个爬虫模拟登录就是要要作到模拟一个浏览器客户端的行为,首先将你的基本登陆信息发送给指定的url,服务器验证成功后会返回一个cookie,咱们就利用这个cookie进行后续的爬取工做就好了。python

我这里抓包用的就是chrome的开发者工具,不过你也能够使用Fiddler、Firebug等均可以,只不过做为一名前端er对chrome有一种特殊的喜好之情。准备好工具接下来就要打开知乎的登录页面并查看https://www.zhihu.com/#signin咱们能够很容易发现这个请求 发送的就是登陆信息,固然我使用手机登录的 用邮件登录的是最后结尾是email正则表达式

Python 爬虫模拟登录知乎

因此咱们只须要向这个地址post数据就好了chrome

phone_num 登陆名浏览器

password 密码服务器

captcha_type 验证码类型(这个参数着这里并无实质做用)cookie

rember_me 记住密码并发

_xsrf 一个隐藏的表单元素 知乎用来防护CSRF的(关于CSRF请打开这里) 我发现这个值是固定因此就在这里直接写死了 若果有兴趣的同窗能够写一个正则表达式 把这部分的值提取出来 这样更严谨一些。python爬虫

# -*- coding:utf-8 -*-import urllib2import urllibimport cookielibposturl = 'https://www.zhihu.com/login/phone_num'headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) ' 'AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/52.0.2743.116 Safari/537.36', 'Referer':'https://www.zhihu.com/'}value = { 'password':'*****************', 'remember_me':True, 'phone_num':'*******************', '_xsrf':'**********************'}data=urllib.urlencode(value)#初始化一个CookieJar来处理CookiecookieJar=cookielib.CookieJarcookie_support = urllib2.HTTPCookieProcessor(cookieJar)#实例化一个全局openeropener=urllib2.build_opener(cookie_support)request = urllib2.Request(posturl, data, headers)result=opener.open(request)print result.read

当你看到服务器返回这个信息的时候就说明你登录成功了工具

{"r":0, "msg": "\u767b\u5f55\u6210\u529f"}
#翻译过来就是 “登录成功” 四个大字

而后你就能够用这个身份去抓取知乎上的页面了

page=opener.open("https://www.zhihu.com/people/yu-yi-56-70")content = page.read.decode('utf-8')print(content)

这段代码 就是经过实例化一个opener对象保存成功登录后的cookie信息,而后再经过这个opener带着这个cookie去访问服务器上关于这个身份的完整页面。更复杂的好比微博的登录这种对请求的数据进行加密了的后面有时间再写出来,与你们分享

相关文章
相关标签/搜索