99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀利用python實(shí)現(xiàn)新浪微博爬蟲_python新浪微博爬蟲
利用python實(shí)現(xiàn)新浪微博爬蟲_python新浪微博爬蟲
2016-12-30
收藏

利用python實(shí)現(xiàn)新浪微博爬蟲_python新浪微博爬蟲

本文后面的解決動(dòng)態(tài)加載的程序依然有效

重新編輯了一次,出了點(diǎn)兒問題

第一個(gè)模塊,模擬登陸sina微博,創(chuàng)建weiboLogin.py文件,輸入以下代碼:

[python]
  1. #! /usr/bin/env python
  2. # -*- coding: utf-8 -*-

  3. import sys
  4. import urllib
  5. import urllib2
  6. import cookielib
  7. import base64
  8. import re
  9. import json
  10. import hashlib

  11. class weiboLogin:
  12.     cj = cookielib.LWPCookieJar()
  13.     cookie_support = urllib2.HTTPCookieProcessor(cj)
  14.     opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
  15.     urllib2.install_opener(opener)
  16.     postdata = {
  17.         ‘entry’: ‘weibo’,
  18.         ‘gateway’: ‘1’,
  19.         ‘from’: ”,
  20.         ‘savestate’: ‘7’,
  21.         ‘userticket’: ‘1’,
  22.         ‘ssosimplelogin’: ‘1’,
  23.         ‘vsnf’: ‘1’,
  24.         ‘vsnval’: ”,
  25.         ‘su’: ”,
  26.         ‘service’: ‘miniblog’,
  27.         ‘servertime’: ”,
  28.         ‘nonce’: ”,
  29.         ‘pwencode’: ‘wsse’,
  30.         ‘sp’: ”,
  31.         ‘encoding’: ‘UTF-8’,
  32.         ‘url’: ‘http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack’,
  33.         ‘returntype’: ‘META’
  34.     }

  35.     def get_servertime(self):
  36.         url = ‘http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=dW5kZWZpbmVk&client=ssologin.js(v1.3.18)&_=1329806375939’
  37.         data = urllib2.urlopen(url).read()
  38.         p = re.compile(‘(.?)‘)
  39.         try:
  40.             json_data = p.search(data).group(1)
  41.             data = json.loads(json_data)
  42.             servertime = str(data[‘servertime’])
  43.             nonce = data[‘nonce’]
  44.             return servertime, nonce
  45.         except:
  46.             print ‘Get severtime error!’
  47.             return None

  48.     def get_pwd(self, pwd, servertime, nonce):
  49.         pwd1 = hashlib.sha1(pwd).hexdigest()
  50.         pwd2 = hashlib.sha1(pwd1).hexdigest()
  51.         pwd3_ = pwd2 + servertime + nonce
  52.         pwd3 = hashlib.sha1(pwd3_).hexdigest()
  53.         return pwd3

  54.     def get_user(self, username):
  55.         username_ = urllib.quote(username)
  56.         username = base64.encodestring(username_)[:-1]
  57.         return username


  58.     def login(self,username,pwd):
  59.         url = ‘http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.18)’
  60.         try:
  61.             servertime, nonce = self.get_servertime()
  62.         except:
  63.             print ‘get servertime error!’
  64.             return
  65.         weiboLogin.postdata[‘servertime’] = servertime
  66.         weiboLogin.postdata[‘nonce’] = nonce
  67.         weiboLogin.postdata[‘su’] = self.get_user(username)
  68.         weiboLogin.postdata[‘sp’] = self.get_pwd(pwd, servertime, nonce)
  69.         weiboLogin.postdata = urllib.urlencode(weiboLogin.postdata)
  70.         headers = {‘User-Agent’:‘Mozilla/5.0 (X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0 Chrome/20.0.1132.57 Safari/536.11’}
  71.         req  = urllib2.Request(
  72.             url = url,
  73.             data = weiboLogin.postdata,
  74.             headers = headers
  75.         )
  76.         result = urllib2.urlopen(req)
  77.         text = result.read()
  78.         p = re.compile(‘location\.replace\’(.??)\’‘)
  79.         try:
  80.             login_url = p.search(text).group(1)
  81.             urllib2.urlopen(login_url)
  82.             print “Login success!”
  83.         except:
  84.             print ‘Login error!’

然后創(chuàng)建main.py文件,輸入以下代碼:

[python]
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-

  3. import weiboLogin
  4. import urllib
  5. import urllib2

  6. username = ‘你的微博用戶名’
  7. pwd = ‘你的微博密碼’

  8. WBLogin = weiboLogin.weiboLogin()
  9. WBLogin.login(username, pwd)

注意:若登陸失敗,可能是你的賬號在登陸的時(shí)候需要輸入驗(yàn)證碼!你在網(wǎng)頁上登陸你的賬號試試看,在賬號設(shè)置里面可以設(shè)置某些地區(qū)不輸入驗(yàn)證碼。


接下來,考慮實(shí)現(xiàn)抓取微博的內(nèi)容。

此時(shí)遇到一個(gè)困難,當(dāng)抓取指定URL的微博時(shí),初始顯示只有15條。后面的是延遲顯示的(ajax里面叫l(wèi)azy load?)。也就是說,當(dāng)滾動(dòng)條第一次拖到最下面的時(shí)候,會(huì)顯示第二部分,再拖到最下面,會(huì)顯示第三部分。此時(shí)一個(gè)頁面的微博才是完整的。所以,要獲取一個(gè)微博頁面的全部微博,需要訪問這個(gè)頁面三次。創(chuàng)建getWeiboPage.py文件,相應(yīng)代碼如下:

[python] view plain copy
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-

  3. import urllib
  4. import urllib2
  5. import sys
  6. import time

  7. reload(sys)
  8. sys.setdefaultencoding(‘utf-8’)

  9. class getWeiboPage:
  10.     body = {
  11.         ‘__rnd’:”,
  12.         ‘_k’:”,
  13.         ‘_t’:‘0’,
  14.         ‘count’:’50’,
  15.         ‘end_id’:”,
  16.         ‘max_id’:”,
  17.         ‘page’:1,
  18.         ‘pagebar’:”,
  19.         ‘pre_page’:‘0’,
  20.         ‘uid’:”
  21.     }
  22.     uid_list = []
  23.     charset = ‘utf8’

  24.     def get_msg(self,uid):
  25.         getWeiboPage.body[‘uid’] = uid
  26.         url = self.get_url(uid)
  27.         self.get_firstpage(url)
  28.         self.get_secondpage(url)
  29.         self.get_thirdpage(url)
  30.     def get_firstpage(self,url):
  31.         getWeiboPage.body[‘pre_page’] = getWeiboPage.body[‘page’]-1
  32.         url = url +urllib.urlencode(getWeiboPage.body)
  33.         req = urllib2.Request(url)
  34.         result = urllib2.urlopen(req)
  35.         text = result.read()
  36.         self.writefile(‘./output/text1’,text)
  37.         self.writefile(‘./output/result1’,eval(“u”'”+text+“”'”))

  38.     def get_secondpage(self,url):
  39.         getWeiboPage.body[‘count’] = ’15’
  40.     #   getWeiboPage.body[‘end_id’] = ‘3490160379905732’
  41.     #   getWeiboPage.body[‘max_id’] = ‘3487344294660278’
  42.         getWeiboPage.body[‘pagebar’] = ‘0’
  43.         getWeiboPage.body[‘pre_page’] = getWeiboPage.body[‘page’]

  44.         url = url +urllib.urlencode(getWeiboPage.body)
  45.         req = urllib2.Request(url)
  46.         result = urllib2.urlopen(req)
  47.         text = result.read()
  48.         self.writefile(‘./output/text2’,text)
  49.         self.writefile(‘./output/result2’,eval(“u”'”+text+“”'”))
  50.     def get_thirdpage(self,url):
  51.         getWeiboPage.body[‘count’] = ’15’
  52.         getWeiboPage.body[‘pagebar’] = ‘1’
  53.         getWeiboPage.body[‘pre_page’] = getWeiboPage.body[‘page’]

  54.         url = url +urllib.urlencode(getWeiboPage.body)
  55.         req = urllib2.Request(url)
  56.         result = urllib2.urlopen(req)
  57.         text = result.read()
  58.         self.writefile(‘./output/text3’,text)
  59.         self.writefile(‘./output/result3’,eval(“u”'”+text+“”'”))
  60.     def get_url(self,uid):
  61.         url = ‘http://weibo.com/’ + uid + ‘?from=otherprofile&wvr=3.6&loc=tagweibo’
  62.         return url
  63.     def get_uid(self,filename):
  64.         fread = file(filename)
  65.         for line in fread:
  66.             getWeiboPage.uid_list.append(line)
  67.             print line
  68.             time.sleep(1)
  69.     def writefile(self,filename,content):
  70.         fw = file(filename,‘w’)
  71.         fw.write(content)
  72.         fw.close()

在剛剛的main.py中加入相應(yīng)內(nèi)容,完整內(nèi)容為:

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-

  3. import weiboLogin
  4. import getWeiboMsg
  5. import urllib
  6. import urllib2

  7. username = ‘你的微博用戶名’
  8. pwd = ‘你的微博密碼’

  9. WBLogin = weiboLogin.weiboLogin()
  10. WBLogin.login(username, pwd)

  11. WBmsg = getWeiboMsg.getWeiboMsg()
  12. url = ‘http://weibo.com/1624087025?from=otherprofile&wvr=3.6&loc=tagweibo’

  13. WBmsg.get_firstpage(url)
  14. WBmsg.get_secondpage(url)
  15. WBmsg.get_thirdpage(url)

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }