Python模拟新浪微博登录(urllib、cookielib、urllib2模拟登录)

发布时间:2020-08-16编辑:脚本学堂
本文介绍了python模拟新浪微博登录的方法,有关urllib、cookielib、urllib2模块实现模拟登录的例子,需要的朋友参考下。

python/login/ target=_blank class=infotextkey>python模拟登录新浪微博抓取数据。
对于新浪微博来说,只要登录了以后,微博以及关注和被关注等等信息才是可见的,所以要抓取,第一步是要模拟登录。

一开始,我打算按照这里的方法登录weibo.com并获取信息,但是发现新浪微博初始的页面的数据是放在JS中并以json格式存放的,页面加载的时候才渲染到HTML中,于是我解析了JS代码,证明此法可行,但是接下来遇到问题,因为我们打开新浪微博是不会一次性加载的,移到页面低端的时候才会加载一部分,这个很难模拟,虽然可以通过分析ajax数据得到,但是由于GET的参数多达十几个,这需要时间来分析这些参数的含义,这么做很麻烦。(脚本学堂 www.jb200.com 收集整理)

可以通过登录手机版的微博:weibo.cn来获取,而手机版的页面几乎没有JS,数据几乎都在HTML中,而且加载剩余的数据是通过分页进行的。

weibo.cn和weibo.com不是使用一种登录机制.
注意研究登录流程。

代码中用到了lxml库来解析HTML。Windows系统可以在这里下载二进制包。

完整代码:
 

复制代码 代码示例:

#!/usr/bin/python
# www.jb200.com

import urllib2
import urllib
import cookielib
 
import lxml.html as HTML
 
class Fetcher(object):
    def __init__(self, username=None, pwd=None, cookie_filename=None):
        self.cj = cookielib.LWPCookieJar()
        if cookie_filename is not None:
            self.cj.load(cookie_filename)
        self.cookie_processor = urllib2.HTTPCookieProcessor(self.cj)
        self.opener = urllib2.build_opener(self.cookie_processor, urllib2.HTTPHandler)
        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 ,urllib.urlencode({}), headers)
        resp = urllib2.urlopen(req)
        login_page = resp.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, 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
        req = urllib2.Request(url, data, self.headers)
        resp = urllib2.urlopen(req)
        page = resp.read()
        link = HTML.fromstring(page).xpath("//a/@href")[0]
        if not link.startswith('http://'): link = 'http://weibo.cn/%s' % link
        req = urllib2.Request(link, headers=self.headers)
        urllib2.urlopen(req)
        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!'
        
    def fetch(self, url):
        print 'fetch url: ', url
        req = urllib2.Request(url, headers=self.headers)
        return urllib2.urlopen(req).read()
 

登录完成后,即可访问相应页面进行html解析了。