python模拟浏览器登录

转自:http://blog.csdn.net/shomy_liu/article/details/37658701

上一篇大致介绍了python爬取网页的两种简单的情况;接着又学习了一下登录的情况;并实现了登录人人网

先大致总结一下登录的几个步骤

1,添加Cookie配置

一般需要账号密码登陆的,直接网址或者模仿浏览器操作是无法进入的,一般的解决方法是用python的一个模块是cookielib,用来记住登录成功之后保存到本地的cookie;

具体代码看人人登录吧

2,添加登录需要提交的表单信息

一般postdata的信息为登陆的用户名,密码什么的,还有许多其他的信息,其余的数据是否必要,需要测试一下; 查看这个就可以用httpfox 或者审查元素的nextwork里面,当你点击登录的时候,在审查元素的network里面可以看到post 、get的数据信息;这里就可以按照我们需要的来拿;

下面是模仿登录人人网的代码;代码注释挺细的。以便以后回忆~~ 由于对正则不太会,就没有做爬取(正则后面在学QAQ)

[python]  view plain copy
  1. # -*- coding: cp936 -*-  
  2. #renren login  
  3. #Filename: renren.py  
  4.   
  5. import urllib2,urllib,cookielib  
  6.   
  7. #设置cookie  
  8. cookiejar= cookielib.CookieJar()  
  9. cookie=urllib2.HTTPCookieProcessor(cookiejar)  
  10. opener= urllib2.build_opener(cookie,urllib2.HTTPHandler())  
  11. urllib2.install_opener(opener)  
  12.   
  13. #账号信息  
  14. email=raw_input('输入邮箱')  
  15. password=raw_input('输入密码')  
  16. domain='renren.com'#域名  
  17. url='http://www.renren.com/PLogin.do'#可以通过审查元素得到  
  18.   
  19.   
  20. #httpfox抓取数据包信息, 其中headers和domain 可有可无 postdata里面很多元素;最主要的用户名密码  
  21. #d对付反爬虫  
  22. headers={  
  23.    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0'  
  24.     }  
  25. data={  
  26.     'email' : email,  
  27.     'password' : password,  
  28.     'domain': domain  
  29.     }  
  30. #编码data  
  31. postdata = urllib.urlencode(data)  
  32.   
  33.   
  34. #发起请求  
  35. req=urllib2.Request(url,postdata,headers)  
  36. #获取源码  
  37. print urllib2.urlopen(req).read()  
  38.                       

转自: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 #打印到终端显示

说明一下:

  1. 我这里就不提供用户名密码了。关于需要提交的表单数据,chrome用户可以F12 -> Network -> 填好账号密码并登录 -> 在Network找到POST...,请看截图。

    python模拟浏览器登录_第1张图片

    点击「login」进入下图界面。

    python模拟浏览器登录_第2张图片
    「From Data」里面数据比较多,通常需要用户名、密码,其余的数据是否必要,需要测试一下。对于这个网站,还需要「formhash」。

  2. Linux下无编码问题,win下如果出现编码问题应该是终端对编码的支持不到位。

  3. 登录成功之后,我们创建的cookie_handler会自动管理cookie,程序的后面如果需要访问其他页面,用opener打开其url即可。

  4. 「User-Agent」同样可以通过F12查看到。

  5. 更详细更nice的说明请参考这里

  6. 这篇博客重点不在介绍原理,重点是记录下这个简单的代码块,其他需要登录的爬虫仿写就可以了。

这个程序的目的是批量下载mlook的电子书。现在遇到一个问题:

下载时网站会验证cookie,不通过就没法下载。但是,我们用python下载文件一般是通过urllib.urlretrieve()。问题来了,这种方式没办法跟opener绑定到一起。

一种可能的解决办法是用opener打开下载链接,用open和write方式保存。但这个方法消耗比较大。




你可能感兴趣的:(Python)