Python 利用爬虫模拟登录知乎
python是一个很好用的编程语言,目前自己也还只是一个Python使用者,在这里先写写python爬虫的使用方式吧。
python爬虫的原理其实很简单,把网页的源码扒下来,如果你用的是chrome,只要在一个网页右键-查看源码就可以了。
利用Python去做这么简单的工作的原因就是… 好玩吧=.=
模拟登录知乎,我用的工具为,python, beatifulsoup,requests, chrome后面两个为python中的库,安装方法用pip install在命令行中执行就可以了
如果安装出现关于vc的问题,可能是windows系统下的编译问题,可以去http://www.lfd.uci.edu/~gohlke/pythonlibs/这里找一些非官方的python库,好处就在于它们都是编译过的,不会出现问题。(在命令行中cd到文件夹,或者shift+右键-在此处打开命令窗口,pip install 文件名)
安装的细节就不再讲了。
##模拟登录
对于网站有几种传输数据的方法,比较简单的是get和post,get就是向网页发送请求,然而网页传回给你数据,post就是把你的数据上传给网页。
###登录所需的数据 要模拟登录,就要观察登录的过程,所以我们可以先前往浏览器打开zhihu.com,进行登录,在chrome浏览器下F12,打开network,它可以帮助你监视网站的活动,记得要勾选Preserve log,以此来观察完整的登录活动。
###进行登录 通过监视network的活动我们发现,点击登陆之后,出现了email,以及captcha.git。
可以发现真正登录知乎的url是http://www.zhihu.com/login/email 产生验证码的网站是http://www.zhihu.com/captcha.gif
并且在email中拉到最低,我们可以看到有四个数据传给了这个url, 分别是_xsrf,password, remember_me, email
_xsrf我们通过看网站源码可以找到。
BeautifulSoup是用来解析的html的很好的工具,用法不赘述,可以查看文档,也可以查看网上其他爬虫教程。上面这段代码就是搜寻_xsrf的位置,因为在知乎的html中,_xsrf是有一个标签type = ‘hidden’的,所以通过这样的方式找到了_xsrf
这里使用requests.Session()
的原因是它能够保存cookie,而不只是一次性的访问。
还要提一下的是,登录网站,或者向网页传输数据的时候,大部分都需要一个表头header,有些网站反感爬虫的访问,但是可以模拟浏览器的表头,以此通过访问。下面是登录知乎的表头,多写一些保险。
Header同样可以在chrome F12之后的Request headers查看到
贴出完整代码,
解释一下,由于以下代码运行,
会在你当前目录下产生一个captcha.gif,把验证码输进去之后就可以登录成功了。
###如何判断是否登录成功了呢?
最后我们通过
向网页发送了我们要登录的请求,网页就会把根据传输过去的数据把内容返还给r。
所以我们要判断是否成功登录很简单,
结果是
{"r":0,
"msg": "\u767b\u9646\u6210\u529f"
}
这段字符应该是unicode,我们用print打印一下看看
结果是
登陆成功
至此我们模拟登录知乎已经成功了。
##到底有什么用?
其实没多大用处,模拟登录成功之后,我们就可以用我们之前定义的s来胡作非为了。
这是你再用s去get网站,就是登录进入知乎后的html了。
比如说,
res = s.get('http://www.zhihu.com/people/jean-grean/followees', headers = headers, cookies = r.cookies)
soup = BeautifulSoup(res.content)
tag_with_followees = soup.find_all(re.compile(r'a'), class_ = 'zm-item-link-avatar')
for n in range(len(tag_with_followees)):
print tag_with_followees[n]['title']
试试看出现什么
以上的内容都要感谢知乎中的怎样用python设计一个爬虫模拟登陆知乎?答案,给我了许多帮助,包括如何处理验证码,以及如何使用requests.Session来保存cookie, 如果用python自带的urllib2要保存cookie的话要麻烦许多,还要建立cookiejar来保存。
问题下面的代码已经不能成功登录知乎了,但是还是受益良多。
comments powered by Disqus