新浪微博主站大法を登る

10202 ワード

最近授业の要求のため、新浪微博のデータに対する登り取りの研究を始めて、多くのブログの文章を见て、多くの方法を试みて、原理はアナログ登录にほかならないが、今のところ使える方法はあまりにも分散していると感じて、しかも微博が改版してから、多くの以前に适用した方法はほとんど役に立たない.ここでは、いくつかの利用可能な方法と、自分で研究した後に安定的に利用可能な方法をまとめます(すべての方法はpython 2.7に基づいています).
1、迂回する.comドメイン名
プライマリ・ステーションを取得する必要がなければ、マイクロブログに関するデータに興味があるだけで、マイクロブログcnドメイン名の下のコンテンツ(すなわち、http://weibo.cn)、親測が利用可能...最も簡単な方法は、あらかじめログインしてから戻ってきたクッキーを取得し、コードに要求としてheadersを貼り付けることです.
_header={
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.86 Safari/537.36",
        "Cookie":"_T_WM=03e77f532a8c1a437da863b36a62207d; SUB=_2A256KfecDeRxGeVP61MX9yzKyT-IHXVZ1ZnUrDV6PUNbvtANLRTVkW1LHesQJOUc8nbbLnoALvjmulMBSwDnAw..; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WhPUuFTXg4zll8rx_8Ap-XA5JpX5KMhUgL.Foepeh2cS0zceoet; SUHB=0cSXC9tcKk2RM7; SSOLoginState=1462601676; gsid_CTandWM=4uTtCpOz5hhWcws1tVSIdd0SYa3"    }
 request = urllib2.Request(url=url, headers=self._header)
 response = urllib2.urlopen(request)
 html = response.read()
次に、這い出したhtmlに対してxpath、またはbsによってデータ抽出を完了することができる.
2、urllibシミュレーションを用いてマイクロブログに登録する.comメインステーション
この過程は比較的に面倒で、前人は多くのマットを持って相応の変更をして直接持ってきて使えばいいので、以下のコードは親測で利用できます.
# -*- coding: utf-8 -*-import urllib2
import re
import rsa
import cookielib  #   cookielibimport base64
import json
import urllib
import binascii
from lxml import etree
import json
#           class launcher():


    cookieContainer=None    _headers={
            "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36"        }
    def __init__(self,username, password):
        self.password = password
        self.username = username


    def get_prelogin_args(self):
        json_pattern = re.compile('\((.*)\)')
        url = 'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&' + self.get_encrypted_name() + '&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.18)'        try:
            request = urllib2.Request(url)
            response = urllib2.urlopen(request)
            raw_data = response.read().decode('utf-8')
            print "get_prelogin_args"+raw_data;
            json_data = json_pattern.search(raw_data).group(1)
            data = json.loads(json_data)
            return data
        except urllib2.HTTPError as e:
            print("%d"%e.code)
            return None    def get_encrypted_pw(self,data):
        rsa_e = 65537 #0x10001        pw_string = str(data['servertime']) + '\t' + str(data['nonce']) + '
' + str(self.password) key = rsa.PublicKey(int(data['pubkey'],16),rsa_e) pw_encypted = rsa.encrypt(pw_string.encode('utf-8'), key) self.password = '' # password passwd = binascii.b2a_hex(pw_encypted) print(passwd) return passwd def get_encrypted_name(self): username_urllike = urllib.quote(self.username) byteStr=bytes(username_urllike) byteStrEncod=byteStr.encode(encoding="utf-8") username_encrypted = base64.b64encode(byteStrEncod) return username_encrypted.decode('utf-8') def enableCookies(self): # cookies self.cookieContainer = cookielib.MozillaCookieJar("/Users/lichao/desktop/weibo/cookie/cookie.txt"); # ckjar=cookielib.MozillaCookieJar("/Users/Apple/Desktop/cookie.txt") # cookies HTTP cookie cookie_support = urllib2.HTTPCookieProcessor(self.cookieContainer) # opener, handler http url opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler) # opener, urlopen() opener # proxy_handler = urllib2.ProxyHandler({"http": 'http://localhost:5000'}) # opener=urllib2.build_opener(proxy_handler) urllib2.install_opener(opener) def build_post_data(self,raw): post_data = { "entry":"weibo", "gateway":"1", "from":"", "savestate":"7", "useticket":"1", "pagerefer":"Sina Visitor System", "vsnf":"1", "su":self.get_encrypted_name(), "service":"miniblog", "servertime":raw['servertime'], "nonce":raw['nonce'], "pwencode":"rsa2", "rsakv":raw['rsakv'], "sp":self.get_encrypted_pw(raw), "sr":"1280*800", "encoding":"UTF-8", "prelt":"77", "url":"http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack", "returntype":"META" } data = urllib.urlencode(post_data).encode('utf-8') return data def login(self): url = ' ' self.enableCookies() data = self.get_prelogin_args() post_data = self.build_post_data(data) headers = { "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36" } try: request = urllib2.Request(url=url,data=post_data,headers=headers) response = urllib2.urlopen(request) html = response.read().decode('GBK') #print(html) except urllib2.HTTPError as e: print(e.code) p = re.compile('location\.replace\(\'(.*?)\'\)') p2 = re.compile(r'"userdomain":"(.*?)"') try: login_url = p.search(html).group(1) print(login_url) request = urllib2.Request(login_url) response = urllib2.urlopen(request) page = response.read().decode('utf-8') print(page) login_url = 'http://weibo.com/' + p2.search(page).group(1) request = urllib2.Request(login_url) response = urllib2.urlopen(request) final = response.read().decode('utf-8') print("Login success!") self.cookieContainer.save(ignore_discard=True, ignore_expires=True) except Exception, e: print('Login error!') print e return 0

3、seleniumによる模擬登録
     3.1selenium +phantomjs
第2の方法は、現在の新版のマイクロブログページのレンダリング方式がスライスレンダリングを採用しているため、第2の静的方式で登ったページは最終的なページではなく、jsに埋め込まれた中間ページであり、私たちが見たい結果ではないに違いない.そこで,シミュレーションブラウザがページをレンダリングする方法を考慮して最終的なプレゼンテーションページを取得する.seleniumというツールは、ブラウザの動作をシミュレートし、jqueryがdomオブジェクトを操作するように位置決め要素を検索することができ、非常に便利で、実現されたコアコードは以下の通りです.
import time
from selenium import webdriver
import urllib2
import selenium.webdriver.support.ui as ui
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
from selenium.webdriver.common.keys import Keys
#Chrome PhantomJS#driver = webdriver.PhantomJS("/Users/test/documents/phantomjs/bin/phantomjs")
driver.get('http://weibo.com/')


try:
    print "    "
    username = driver.find_element_by_xpath('//input[@name="username"]')
    password = driver.find_element_by_xpath('//input[@name="password"]')
    sbtn = driver.find_element_by_xpath('//a[@action-type="btn_submit"]')
    username.send_keys('') #send username       
    password.send_keys('') #send password    sbtn.click()  
    #         
    time.sleep(3)  #          
    # get the session cookie    
    cookie = {item["name"] + ":" + item["value"] for item in driver.get_cookies()}    cookie=driver.get_cookies()
    for item in driver.get_cookies():    cookieItem={"name":item["name"],"value":item["value"],"domain":item["domain"],"httponly":item["httponly"],"path":item["path"],"secure":item["secure"]}    cookie.append(cookieItem)    cookie_file= open("/Users/test/desktop/weibo/cookie/cookie.txt",'w')    cookie_file.write(str(cookie))    print str(str(cookie))
except urllib2.HTTPError as e:
    print e
    print "    "print "        "driver.get("http://service.account.weibo.com/show?rid=K1CaN7gJl8q8f")
page = driver.page_source
print page
driver.quit()

ログイン後に取得したクッキーをキー値ペアでテキストファイルに保存し、再ログインを必要とせずに次の直接loadを容易にします.

def loadCookie(self):
self._driver.get("http://www.sina.com.cn")
    cookie_file=open("/Users/test/desktop/weibo/cookie/cookie.txt",'r')
    cookieStr=cookie_file.read();
print "cookie is: "+cookieStr
    cookieList=list(eval(cookieStr))
for item in cookieList:
#cookieDic= type(eval(item))
        self._driver.add_cookie(item)
selenium +chromedriver

     3.2selenium +chromedirver
phantomjsを使用すると、ログインプロセスが常に失敗します.検証コードが認識できないため、ログインが常に失敗します.ここではchromedirverというツールを使用してseleniumと組み合わせて、オープン・レベルのpythonデータの取得を実現します.シミュレーション・ログインは万全です.コア・コードは次のとおりです.
print "    "
username = driver.find_element_by_xpath('//input[@name="username"]')
password = driver.find_element_by_xpath('//input[@name="password"]')
sbtn = driver.find_element_by_xpath('//a[@action-type="btn_submit"]')
veryfiCode=driver.find_element_by_xpath('//input[@name="verifycode"]')

プログラムが起動すると自動的にchromeウィンドウが開きますが、このブラウザの動作はプログラムで制御することができます.これは便利ではありませんか.私たちはusernameの行にブレークポイントを打って、それからプログラムはこのステップに実行して、ブラウザの中で相応のユーザー名、パスワード、検証コードを入力して、それからpycharmの中でクリックして続けて、ログインに成功しました!実际のブラウザはプログラムを结び付けて、本当にレベルの登って微博を取ります...