转自:http://blog.csdn.net/shomy_liu/article/details/37658701
上一篇大致介绍了python爬取网页的两种简单的情况;接着又学习了一下登录的情况;并实现了登录人人网
先大致总结一下登录的几个步骤
1,添加Cookie配置
一般需要账号密码登陆的,直接网址或者模仿浏览器操作是无法进入的,一般的解决方法是用python的一个模块是cookielib,用来记住登录成功之后保存到本地的cookie;
具体代码看人人登录吧
2,添加登录需要提交的表单信息
一般postdata的信息为登陆的用户名,密码什么的,还有许多其他的信息,其余的数据是否必要,需要测试一下; 查看这个就可以用httpfox 或者审查元素的nextwork里面,当你点击登录的时候,在审查元素的network里面可以看到post 、get的数据信息;这里就可以按照我们需要的来拿;
下面是模仿登录人人网的代码;代码注释挺细的。以便以后回忆~~ 由于对正则不太会,就没有做爬取(正则后面在学QAQ)
转自:http://zipperary.com/2013/08/16/python-login/
我的博客中曾经贴过几个爬虫程序的代码,用来批量下载图片非常方便。这样的爬虫实现起来比较简单。而有些网站需要用户登录之后才可以下载文件,之前的方法就办不到了。今天就说说用Python模拟浏览器的登录过程,为之后的登录下载做好准备。
登录的情况,需要额外用到的一个模块是cookielib,用来记住登录成功之后保存到本地的cookie,方便在网站的各个页面之间穿越。
先上代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#encoding=utf8 import urllib import urllib2 import cookielib ###登录页的url lgurl = 'http://mlook.mobi/member/login' ###用cookielib模块创建一个对象,再用urlllib2模块创建一个cookie的handler cookie = cookielib.CookieJar() cookie_handler = urllib2.HTTPCookieProcessor(cookie) ###有些网站反爬虫,这里用headers把程序伪装成浏览器 hds = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36' } ###登录需要提交的表单 pstdata = {'formhash':'', #填入formhash 'person[login]':'', #填入网站的用户名 'person[password]':'', #填入网站密码 } dt = urllib.urlencode(pstdata) #表单数据编码成url识别的格式 req = urllib2.Request(url = lgurl,data = dt,headers = hds) #伪装成浏览器,访问该页面,并POST表单数据,这里并没有实际访问,只是创建了一个有该功能的对象 opener = urllib2.build_opener(cookie_handler) #绑定handler,创建一个自定义的opener response = opener.open(req)#请求网页,返回句柄 page = response.read()#读取并返回网页内容 print page #打印到终端显示 |
说明一下:
我这里就不提供用户名密码了。关于需要提交的表单数据,chrome用户可以F12 -> Network -> 填好账号密码并登录 -> 在Network找到POST...
,请看截图。
点击「login」进入下图界面。
「From Data」里面数据比较多,通常需要用户名、密码,其余的数据是否必要,需要测试一下。对于这个网站,还需要「formhash」。
Linux下无编码问题,win下如果出现编码问题应该是终端对编码的支持不到位。
登录成功之后,我们创建的cookie_handler会自动管理cookie,程序的后面如果需要访问其他页面,用opener打开其url即可。
「User-Agent」同样可以通过F12查看到。
更详细更nice的说明请参考这里
这篇博客重点不在介绍原理,重点是记录下这个简单的代码块,其他需要登录的爬虫仿写就可以了。
这个程序的目的是批量下载mlook的电子书。现在遇到一个问题:
下载时网站会验证cookie,不通过就没法下载。但是,我们用python下载文件一般是通过urllib.urlretrieve()
。问题来了,这种方式没办法跟opener绑定到一起。
一种可能的解决办法是用opener打开下载链接,用open和write方式保存。但这个方法消耗比较大。