Python模拟新浪微博登录

看到一篇Python模拟新浪微博登录的文章,想熟悉一下其中实现方式,并且顺便掌握python相关知识点。

代码

下面的代码是来自上面这篇文章,并稍作修改添加了一些注释。

# -*- coding: utf-8 -*

import urllib2
import urllib
import cookielib

import lxml.html as HTML

class Fetcher(object):
    def __init__(self, username=None, pwd=None, cookie_filename=None):
		#获取一个保存cookie的对象
        self.cj = cookielib.LWPCookieJar()
        if cookie_filename is not None:
            self.cj.load(cookie_filename)
		#将一个保存cookie对象,和一个HTTP的cookie的处理器绑定
        self.cookie_processor = urllib2.HTTPCookieProcessor(self.cj)
		#创建一个opener,将保存了cookie的http处理器,还有设置一个handler用于处理http的URL的打开
        self.opener = urllib2.build_opener(self.cookie_processor, urllib2.HTTPHandler)
		#将包含了cookie、http处理器、http的handler的资源和urllib2对象绑定在一起
        urllib2.install_opener(self.opener)

        self.username = username
        self.pwd = pwd
        self.headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/14.0.1',
                        'Referer':'','Content-Type':'application/x-www-form-urlencoded'}

    def get_rand(self, url):
        headers = {'User-Agent':'Mozilla/5.0 (Windows;U;Windows NT 5.1;zh-CN;rv:1.9.2.9)Gecko/20100824 Firefox/3.6.9',
                   'Referer':''}
        req = urllib2.Request(url ,"", headers)
        login_page = urllib2.urlopen(req).read()
        rand = HTML.fromstring(login_page).xpath("//form/@action")[0]
        passwd = HTML.fromstring(login_page).xpath("//input[@type='password']/@name")[0]
        vk = HTML.fromstring(login_page).xpath("//input[@name='vk']/@value")[0]
        return rand, passwd, vk

    def login(self, username=None, pwd=None, cookie_filename=None):
        if self.username is None or self.pwd is None:
            self.username = username
            self.pwd = pwd
        assert self.username is not None and self.pwd is not None

        url = 'http://3g.sina.com.cn/prog/wapsite/sso/login.php?ns=1&revalid=2&backURL=http%3A%2F%2Fweibo.cn%2F&backTitle=%D0%C2%C0%CB%CE%A2%B2%A9&vt='
		# 获取随机数rand、password的name和vk
        rand, passwd, vk = self.get_rand(url)
        data = urllib.urlencode({'mobile': self.username,
                                 passwd: self.pwd,
                                 'remember': 'on',
                                 'backURL': 'http://weibo.cn/',
                                 'backTitle': '新浪微博',
                                 'vk': vk,
                                 'submit': '登录',
                                 'encoding': 'utf-8'})
        url = 'http://3g.sina.com.cn/prog/wapsite/sso/' + rand

		# 模拟提交登陆
        page =self.fetch(url,data)
        link = HTML.fromstring(page).xpath("//a/@href")[0]
        if not link.startswith('http://'): link = 'http://weibo.cn/%s' % link

		# 手动跳转到微薄页面
        self.fetch(link,"")

		# 保存cookie
        if cookie_filename is not None:
            self.cj.save(filename=cookie_filename)
        elif self.cj.filename is not None:
            self.cj.save()
        print 'login success!',data

    def fetch(self, url,data):
        print 'fetch url: ', url
        req = urllib2.Request(url,data, headers=self.headers)
        return urllib2.urlopen(req).read()

# 开始运行
fet=Fetcher();
fet.login("huaiyu2006","XXXXXX")

以上代码引入了一些python的模块,然后创建了一个class封装了login方法。

以上代码的登录逻辑:

  • 1、进入到登陆页面,获取一些关键参数,包括随机数rand、password的name和vk。
  • 2、模拟提交登陆,登陆之后跳到微薄页面。
  • 3、手动跳转到微薄页面。

总结:

以上代码是模拟手机版微博的登陆,如果你想模拟登陆网页版的微博,你可以参考下面两个项目中的代码:

Python模块

## Python urllib模块

Python urllib模块提供了一个从指定的URL地址获取网页数据,然后对其进行分析处理,获取想要的数据。

1、urllib模块提供的urlopen函数

  py-test  python
Python 2.7.5+ (default, Feb 27 2014, 19:37:08)
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib
>>> help(urllib.urlopen)

Help on function urlopen in module urllib:

urlopen(url, data=None, proxies=None)
    Create a file-like object for the specified URL to read from.
(END)

urllib.urlopen创建一个类文件对象为指定的url来读取:

  • 参数url表示远程数据的路径,一般是http或者ftp路径。
  • 参数data表示以get或者post方式提交到url的数据。
  • 参数proxies表示用于代理的设置。

示例:

import urllib

print urllib.urlopen('http://www.baidu.com').read()

urlopen返回一个类文件对象,它提供了如下方法:

  • 1)read() , readline() , readlines(),fileno()和close(): 这些方法的使用与文件对象完全一样。
  • 2)info():返回一个httplib.HTTPMessage 对象,表示远程服务器返回的头信息。
  • 3)getcode():返回Http状态码,如果是http请求,200表示请求成功完成;404表示网址未找到。
  • 4)geturl():返回请求的url地址。

2.urllibe模块提供的urlretrieve函数。

urlretrieve方法直接将远程数据下载到本地。

  • 参数finename指定了保存本地路径(如果参数未指定,urllib会生成一个临时文件保存数据。)
  • 参数reporthook是一个回调函数,当连接上服务器、以及相应的数据块传输完毕时会触发该回调,我们可以利用这个回调函数来显示当前的下载进度。
  • 参数data指post到服务器的数据,该方法返回一个包含两个元素的(filename, headers)元组,filename表示保存到本地的路径,header表示服务器的响应头。

示例:urlretrieve方法下载文件实例,可以显示下载进度。

#!/usr/bin/python
#encoding:utf-8
import urllib
import os
def Schedule(a,b,c):
    '''''
    a:已经下载的数据块
    b:数据块的大小
    c:远程文件的大小
   '''
    per = 100.0 * a * b / c
    if per > 100 :
        per = 100
    print '%.2f%%' % per
url = 'http://www.python.org/ftp/python/2.7.5/Python-2.7.5.tar.bz2'
#local = url.split('/')[-1]
local = os.path.join('/data/software','Python-2.7.5.tar.bz2')
urllib.urlretrieve(url,local,Schedule)

3.辅助方法

urllib中还提供了一些辅助方法,用于对url进行编码、解码。

  • urllib.quote(string[, safe]):对字符串进行编码。参数safe指定了不需要编码的字符;
  • urllib.unquote(string) :对字符串进行解码;
  • urllib.quote_plus(string [ , safe ] ) :与urllib.quote类似,但这个方法用’+’来替换’ ‘,而quote用’%20’来代替’ ‘
  • urllib.unquote_plus(string ) :对字符串进行解码;
  • urllib.urlencode(query[, doseq]):将dict或者包含两个元素的元组列表转换成url参数。例如 字典{‘name’: ‘dark-bull’, ‘age’: 200}将被转换为”name=dark-bull&age=200”
  • urllib.pathname2url(path):将本地路径转换成url路径;
  • urllib.url2pathname(path):将url路径转换成本地路径;

通过上面的练习可以知道,urlopen可以轻松获取远端html页面信息,然后通过python正则对所需要的数据进行分析,匹配出想要用的数据,在利用urlretrieve将数据下载到本地。对于访问受限或者对连接数有限制的远程url地址可以采用proxies(代理的方式)连接,如果远程数据量过大,单线程下载太慢的话可以采用多线程下载,这个就是传说中的爬虫。

Python urllib2模块

客户端与服务器端通过request与response来沟通,客户端先向服务端发送request,然后接收服务端返回的response

urllib2提供了request的类,可以让用户在发送请求前先构造一个request的对象,然后通过urllib2.urlopen方法来发送请求

更详细的说明请参考:http://zhuoqiang.me/python-urllib2-usage.html

Python cookielib模块

cookielib模块的主要作用是提供可存储cookie的对象,以便于与urllib2模块配合使用来访问Internet资源。例如可以利用本模块的CookieJar类的对象来捕获cookie并在后续连接请求时重新发送。coiokielib模块用到的对象主要有下面几个:CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。

  • CookieJar管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。
  • FileCookieJar检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据。
  • MozillaCookieJar创建与Mozilla浏览器cookies.txt兼容的FileCookieJar实例。
  • LWPCookieJar创建与libwww-perl的Set-Cookie3文件格式兼容的FileCookieJar实例。

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 content2.read().decode("utf-8").encode("gbk")

Python lxml模块

具体用法可以参考 使用由 Python 编写的 lxml 实现高性能 XML 解析

上面python脚本主要是使用了lxml的xpath语法进行快速查找。

时间: 2024-11-08 20:52:43

Python模拟新浪微博登录的相关文章

python使用rsa加密算法模块模拟新浪微博登录_python

PC登录新浪微博时,在客户端用js预先对用户名.密码都进行了加密,而且在POST之前会GET一组参数,这也将作为POST_DATA的一部分.这样,就不能用通常的那种简单方法来模拟POST登录(比如人人网). 通过爬虫获取新浪微博数据,模拟登录是必不可少的. 1.在提交POST请求之前,需要GET获取四个参数(servertime,nonce,pubkey和rsakv),不是之前提到的只是获取简单的servertime,nonce,这里主要是由于js对用户名.密码加密方式改变了. 1.1 由于加密

python模拟新浪微博登陆功能(新浪微博爬虫)_python

1.主函数(WeiboMain.py): 复制代码 代码如下: import urllib2import cookielib import WeiboEncodeimport WeiboSearch if __name__ == '__main__':    weiboLogin = WeiboLogin('×××@gmail.com', '××××')#邮箱(账号).密码    if weiboLogin.Login() == True:        print "登陆成功!" 前

Python模拟百度登录实例代码

本来写这个玩意儿是想用来自动登录百度,然后根据贴吧内的的排名抓取会员头像的,比如生成一个贴吧千人头像图或万人头像图.也算是练练手.完成后才发现抓那个贴吧排名完全不需要登录-也好,以后用来做自动一键签到(经常忘打卡),抢二楼什么的,也不错~~如今在博客上发个文章用不了多长时间就被抄走了,感觉自己能做的也只有在此鄙视一下它们.废话太多,容易招人恨,以下是代码: #-*- coding:gbk -*- # # 模拟百度登录 for Python2.7 # 其中显示验证码部分 需要使用PIL库 # 需要

python模拟登陆新浪微博,设置登录不需要验证码,代码返回验证码错误

问题描述 python模拟登陆新浪微博,设置登录不需要验证码,代码返回验证码错误 网页登陆不需要验证码 代码返回retcode=2070 验证码输入错误 求大神指点 解决方案 用fiddler调试下,看看是否带上了cookie,新浪是否传给你验证码,如果传了,必须先识别. 解决方案二: http://blog.csdn.net/ta790799213/article/details/44205351http://www.crazyant.net/796.htmlhttp://www.2cto.c

网络爬虫-关于用python模拟登陆新浪微博返回内容

问题描述 关于用python模拟登陆新浪微博返回内容 第一次提交登陆信息和参数后,按照网上大神们的代码应该是在返回的内容中找到location.replace(....)提取url然后再访问,但是我post表单后得到的似乎不是登陆页面也不是正常登陆的页面 不知道这是一个什么页面...算是登陆上去了吗? 解决方案 基于python的新浪微博模拟登陆2014_新浪微博模拟登陆_python模拟新浪微博登陆---------------------- 解决方案二: 看上去是一个登录后的判断页面,要看你

python模拟登陆csdn-python模拟csdn的登录页面,可是登录失败,只是返回登陆页面的代码

问题描述 python模拟csdn的登录页面,可是登录失败,只是返回登陆页面的代码 #!/usr/bin/python#encoding=utf-8import HTMLParserimport urlparseimport urllibimport urllib2import cookielibimport stringimport re hosturl = 'http://my.csdn.net'posturl = 'http://passport.csdn.net/account/logi

请问写python爬虫如何用urllib或者requests模拟用户登录

问题描述 请问写python爬虫如何用urllib或者requests模拟用户登录 比如我在百度文库下个课件,http://youke.baidu.com/view/05984a27b4daa58da0114ac6, 我用urllib2或者request,我可以用urllib2.open(url)或者requests.get(url)来打开页面,但是不知道如何写cookie的,就是让浏览器认为你已经登录了,请问如何写urllib或者requests.get呢?谢谢 解决方案 可以参考下,过程都关

Python模拟登录12306的方法_python

本文实例讲述了Python模拟登录12306的方法.分享给大家供大家参考. 具体实现方法如下: 复制代码 代码如下: #!/usr/bin/python # -*- coding: utf-8 -*-   import re; import sys; import cookielib; import urllib; import urllib2; import optparse; import json; import httplib2; reload(sys) sys.setdefaulten

模拟登陆-python模拟twitter登陆

问题描述 python模拟twitter登陆 这是我的代码,不知道为什么一直无法成功import urllib2import urllibimport cookielibimport re class Fetcher(object): def init(selfname=Nonepwd=None): self.cj = cookielib.LWPCookieJar() #获取一个保存cookie的对象. self.cookie_processor = urllib2.HTTPCookieProc