天天看點

pythonurllib新浪微網誌_Python模拟新浪微網誌登入(urllib、cookielib、urllib2模拟登入)

python模拟登入新浪微網誌抓取資料。

對于新浪微網誌來說,隻要登入了以後,微網誌以及關注和被關注等等資訊才是可見的,是以要抓取,第一步是要模拟登入。

一開始,我打算按照這裡的方法登入weibo.com并擷取資訊,但是發現新浪微網誌初始的頁面的資料是放在JS中并以json格式存放的,頁面加載的時候才渲染到HTML中,于是我解析了JS代碼,證明此法可行,但是接下來遇到問題,因為我們打開新浪微網誌是不會一次性加載的,移到頁面低端的時候才會加載一部分,這個很難模拟,雖然可以通過分析ajax資料得到,但是由于GET的參數多達十幾個,這需要時間來分析這些參數的含義,這麼做很麻煩。(腳本學堂 www.# 收集整理)

可以通過登入手機版的微網誌:weibo.cn來擷取,而手機版的頁面幾乎沒有JS,資料幾乎都在HTML中,而且加載剩餘的資料是通過分頁進行的。

weibo.cn和weibo.com不是使用一種登入機制.

注意研究登入流程。

代碼中用到了lxml庫來解析HTML。Windows系統可以在這裡下載下傳二進制包。

完整代碼: 代碼示例:

#!/usr/bin/python

# www.#

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解析了。