在Python中使用mechanize模块模拟浏览器功能


Posted in Python onMay 05, 2015

知道如何快速在命令行或者python脚本中实例化一个浏览器通常是非常有用的。
每次我需要做任何关于web的自动任务时,我都使用这段python代码去模拟一个浏览器。
 

import mechanize
import cookielib
# Browser
br = mechanize.Browser()
# Cookie Jar
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
# Browser options
br.set_handle_equiv(True)
br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
# Follows refresh 0 but not hangs on refresh > 0
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
# Want debugging messages?
#br.set_debug_http(True)
#br.set_debug_redirects(True)
#br.set_debug_responses(True)
# User-Agent (this is cheating, ok?)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]

现在你得到了一个浏览器的示例,br对象。使用这个对象,便可以打开一个页面,使用类似如下的代码:
 

# Open some site, let's pick a random one, the first that pops in mind:
r = br.open('http://google.com')
html = r.read()
# Show the source
print html
# or
print br.response().read()
# Show the html title
print br.title()
# Show the response headers
print r.info()
# or
print br.response().info()
# Show the available forms
for f in br.forms():
  print f
# Select the first (index zero) form
br.select_form(nr=0)
# Let's search
br.form['q']='weekend codes'
br.submit()
print br.response().read()
# Looking at some results in link format
for l in br.links(url_regex='stockrt'):
  print l

如果你访问的网站需要验证(http basic auth),那么:
 

# If the protected site didn't receive the authentication data you would
# end up with a 410 error in your face
br.add_password('http://safe-site.domain', 'username', 'password')
br.open('http://safe-site.domain')

由于之前使用了Cookie Jar,你不需要管理网站的登录session。也就是不需要管理需要POST一个用户名和密码的情况。
通常这种情况,网站会请求你的浏览器去存储一个session cookie除非你重复登陆,
而导致你的cookie中含有这个字段。所有这些事情,存储和重发这个session cookie已经被Cookie Jar搞定了,爽吧。
同时,你可以管理你的浏览器历史:
 

# Testing presence of link (if the link is not found you would have to
# handle a LinkNotFoundError exception)
br.find_link(text='Weekend codes')
# Actually clicking the link
req = br.click_link(text='Weekend codes')
br.open(req)
print br.response().read()
print br.geturl()
# Back
br.back()
print br.response().read()
print br.geturl()

下载一个文件:
 

# Download
f = br.retrieve('http://www.google.com.br/intl/pt-BR_br/images/logo.gif')[0]
print f
fh = open(f)

为http设置代理
 

# Proxy and user/password
br.set_proxies({"http": "joe:password@myproxy.example.com:3128"})
# Proxy
br.set_proxies({"http": "myproxy.example.com:3128"})
# Proxy password
br.add_proxy_password("joe", "password")

但是,如果你只想要打开网页,而不需要之前所有神奇的功能,那你可以:
 

# Simple open?
import urllib2
print urllib2.urlopen('http://stockrt.github.com').read()
# With password?
import urllib
opener = urllib.FancyURLopener()
print opener.open('http://user:password@stockrt.github.com').read()

你可以通过 mechanize官方网站 , mechanize文档 和ClientForm的文档 了解更多。

原文来自:http://reyoung.me/index.php/2012/08/08/%E7%BF%BB%E8%AF%91%E4%BD%BF%E7%94%A8python%E6%A8%A1%E4%BB%BF%E6%B5%8F%E8%A7%88%E5%99%A8%E8%A1%8C%E4%B8%BA/

——————————————————————————————

最后来聊下通过代码访问页面时的一个很重要的概念和技术:cookie

我们都知道HTTP是无连接的状态协议,但是客户端和服务器端需要保持一些相互信息,比如cookie,有了cookie,服务器才能知道刚才是这个用户登录了网站,才会给予客户端访问一些页面的权限。
比如用浏览器登录新浪微博,必须先登录,登陆成功后,打开其他的网页才能够访问。用程序登录新浪微博或其他验证网站,关键点也在于需要保存cookie,之后附带cookie再来访问网站,才能够达到效果。
这里就需要Python的cookielib和urllib2等的配合,将cookielib绑定到urllib2在一起,就能够在请求网页的时候附带cookie。
具体做法,首先第一步,用firefox的httpfox插件,在浏览器衷开始浏览新浪微博首页,然后登陆,从httpfox的记录中,查看每一步发送了那些数据请求了那个URL;之后再python里面,模拟这个过程,用urllib2.urlopen发送用户名密码到登陆页面,获取登陆后的cookie,之后访问其他页面,获取微博数据。

cookielib模块的主要作用是提供可存储cookie的对象,以便于与urllib2模块配合使用来访问Internet资源。例如可以利用本模块的CookieJar类的对象来捕获cookie并在后续连接请求时重新发送。coiokielib模块用到的对象主要有下面几个:CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。
urllib模块和urllib模块类似,用来打开URL并从中获取数据。与urllib模块不同的是,urllib模块不仅可以使用urlopen()函数还可以自定义Opener来访问网页。同时要注意:urlretrieve()函数是urllib模块中的,urllib2模块中不存在该函数。但是使用urllib2模块时一般都离不开urllib模块,因为POST的数据需要使用urllib.urlencode()函数来编码。

cookielib模块一般与urllib2模块配合使用,主要用在urllib2.build_oper()函数中作为urllib2.HTTPCookieProcessor()的参数。使用方法如下面登录人人网的代码:
 

#! /usr/bin/env python
#coding=utf-8
import urllib2
import urllib
import cookielib
data={"email":"用户名","password":"密码"} #登陆用户名和密码
post_data=urllib.urlencode(data)
cj=cookielib.CookieJar()
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
headers ={"User-agent":"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1"}
req=urllib2.Request("http://www.renren.com/PLogin.do",post_data,headers)
content=opener.open(req)
print content.read().decode("utf-8").encode("gbk")

具体请参考:

http://www.crazyant.net/796.html  Python使用cookielib和urllib2模拟登陆新浪微博并抓取数据

http://my.oschina.net/duhaizhang/blog/69342  urllib2模块

https://docs.python.org/2/library/cookielib.html  cookielib — Cookie handling for HTTP clients

Python 相关文章推荐
Python实现全角半角转换的方法
Aug 18 Python
Python的SQLalchemy模块连接与操作MySQL的基础示例
Jul 11 Python
python 文件操作api(文件操作函数)
Aug 28 Python
python数据结构之链表详解
Sep 12 Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
Nov 24 Python
python 3调用百度OCR API实现剪贴板文字识别
Sep 04 Python
浅析Python3中的对象垃圾收集机制
Jun 06 Python
python实现在函数图像上添加文字和标注的方法
Jul 08 Python
Pandas实现dataframe和np.array的相互转换
Nov 30 Python
Python小白不正确的使用类变量实例
May 29 Python
selenium判断元素是否存在的两种方法小结
Dec 07 Python
Python开发.exe小工具的详细步骤
Jan 27 Python
python实现自动更换ip的方法
May 05 #Python
浅谈MySQL中的触发器
May 05 #Python
python去除所有html标签的方法
May 05 #Python
python实现将汉字转换成汉语拼音的库
May 05 #Python
python基于Tkinter库实现简单文本编辑器实例
May 05 #Python
python实现的简单窗口倒计时界面实例
May 05 #Python
给Python中的MySQLdb模块添加超时功能的教程
May 05 #Python
You might like
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
2012/10/24 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
2018/05/31 PHP
Yii框架常见缓存应用实例小结
2019/09/09 PHP
javascript实现的网页局布刷新效果
2008/12/01 Javascript
JS getAttribute和setAttribute(取得和设置属性)的使用介绍
2013/07/10 Javascript
时间戳转换为时间 年月日时间的JS函数
2013/08/19 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
JavaScript实现同一页面内两个表单互相传值的方法
2015/08/12 Javascript
jQuery获得字体颜色16位码的方法
2016/02/20 Javascript
AngularJS ng-style中使用filter
2016/09/21 Javascript
jQuery基本选择器和层次选择器学习使用
2017/02/27 Javascript
vue实现城市列表选择功能
2018/07/16 Javascript
vue2.0 可折叠列表 v-for循环展示的实例
2018/09/07 Javascript
微信小程序实现蒙版弹窗效果
2018/11/01 Javascript
vue+webpack中配置ESLint
2018/11/07 Javascript
vue里如何主动销毁keep-alive缓存的组件
2019/03/21 Javascript
react-native滑动吸顶效果的实现过程
2019/06/03 Javascript
JavaScript 扩展运算符用法实例小结【基于ES6】
2019/06/17 Javascript
vue数据更新UI不刷新显示的解决办法
2020/08/06 Javascript
一篇文章带你从零快速上手Rollup
2020/09/07 Javascript
[51:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第二局
2016/03/03 DOTA
python验证码识别的实例详解
2016/09/09 Python
新手常见6种的python报错及解决方法
2018/03/09 Python
使用EduBlock轻松学习Python编程
2018/10/08 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
Django框架 Pagination分页实现代码实例
2019/09/04 Python
Django 后台带有字典的列表数据与页面js交互实例
2020/04/03 Python
英国家庭家具、照明和花园家具购物网站:Furniture123
2018/12/31 全球购物
行政部主管岗位职责
2013/12/28 职场文书
出纳工作岗位责任制
2014/02/02 职场文书
2014县政府领导班子三严三实对照检查材料思想汇报
2014/09/26 职场文书
交通事故死亡赔偿协议书
2014/12/03 职场文书
2015年安全教育月活动总结
2015/03/26 职场文书
2015年幼儿园教育教学工作总结
2015/05/25 职场文书
幼儿园春季开学通知
2015/07/16 职场文书
「魔导具师妲莉亚永不妥协~从今天开始的自由职人生活~」1、2卷发售宣传CM公开
2022/03/21 日漫