用Python編寫簡(jiǎn)單的微博爬蟲
先說點(diǎn)題外話,我一開始想使用Sina Weibo API來獲取微博內(nèi)容,但后來發(fā)現(xiàn)新浪微博的API限制實(shí)在太多,大家感受一下:
只能獲取當(dāng)前授權(quán)的用戶(就是自己),而且只能返回最新的5條,WTF!
所以果斷放棄掉這條路,改為『生爬』,因?yàn)镻C端的微博是Ajax的動(dòng)態(tài)加載,爬取起來有些困難,我果斷知難而退,改為對(duì)移動(dòng)端的微博進(jìn)行爬取,因?yàn)橐苿?dòng)端的微博可以通過分頁(yè)爬取的方式來一次性爬取所有微博內(nèi)容,這樣工作就簡(jiǎn)化了不少。
最后實(shí)現(xiàn)的功能:
1、輸入要爬取的微博用戶的user_id,獲得該用戶的所有微博
2、文字內(nèi)容保存到以%user_id命名文本文件中,所有高清原圖保存在weibo_image文件夾中
具體操作:
首先我們要獲得自己的cookie,這里只說chrome的獲取方法。
1、用chrome打開新浪微博移動(dòng)端
2、option+command+i調(diào)出開發(fā)者工具
3、點(diǎn)開Network,將Preserve log選項(xiàng)選中
4、輸入賬號(hào)密碼,登錄新浪微博
5、找到m.weibo.cn->Headers->Cookie,把cookie復(fù)制到代碼中的#your cookie處
然后再獲取你想爬取的用戶的user_id,這個(gè)我不用多說啥了吧,點(diǎn)開用戶主頁(yè),地址欄里面那個(gè)號(hào)碼就是user_id
將python代碼保存到weibo_spider.py文件中
定位到當(dāng)前目錄下后,命令行執(zhí)行python weibo_spider.py user_id
當(dāng)然如果你忘記在后面加user_id,執(zhí)行的時(shí)候命令行也會(huì)提示你輸入
最后執(zhí)行結(jié)束
小問題:在我的測(cè)試中,有的時(shí)候會(huì)出現(xiàn)圖片下載失敗的問題,具體原因還不是很清楚,可能是網(wǎng)速問題,因?yàn)槲宜奚岬木W(wǎng)速實(shí)在太不穩(wěn)定了,當(dāng)然也有可能是別的問題,所以在程序根目錄下面,我還生成了一個(gè)userid_imageurls的文本文件,里面存儲(chǔ)了爬取的所有圖片的下載鏈接,如果出現(xiàn)大片的圖片下載失敗,可以將該鏈接群一股腦導(dǎo)進(jìn)迅雷等下載工具進(jìn)行下載。
另外,我的系統(tǒng)是OSX EI Capitan10.11.2,Python的版本是2.7,依賴庫(kù)用sudo pip install XXXX就可以安裝,具體配置問題可以自行stackoverflow,這里就不展開講了。
下面我就給出實(shí)現(xiàn)代碼
#-*-coding:utf8-*- import re import string import sys import os import urllib import urllib2 from bs4 import BeautifulSoup import requests from lxml import etree reload(sys) sys.setdefaultencoding('utf-8') if(len(sys.argv)>=2): user_id = (int)(sys.argv[1]) else: user_id = (int)(raw_input(u"請(qǐng)輸入user_id: ")) cookie = {"Cookie": "#your cookie"} url = 'http://weibo.cn/u/%d?filter=1&page=1'%user_id html = requests.get(url, cookies = cookie).content selector = etree.HTML(html) pageNum = (int)(selector.xpath('//input[@name="mp"]')[0].attrib['value']) result = "" urllist_set = set() word_count = 1 image_count = 1 print u'爬蟲準(zhǔn)備就緒...' for page in range(1,pageNum+1): #獲取lxml頁(yè)面 url = 'http://weibo.cn/u/%d?filter=1&page=%d'%(user_id,page) lxml = requests.get(url, cookies = cookie).content #文字爬取 selector = etree.HTML(lxml) content = selector.xpath('//span[@class="ctt"]') for each in content: text = each.xpath('string(.)') if word_count>=4: text = "%d :"%(word_count-3) +text+"\n\n" else : text = text+"\n\n" result = result + text word_count += 1 #圖片爬取 soup = BeautifulSoup(lxml, "lxml") urllist = soup.find_all('a',href=re.compile(r'^http://weibo.cn/mblog/oripic',re.I)) first = 0 for imgurl in urllist: urllist_set.add(requests.get(imgurl['href'], cookies = cookie).url) image_count +=1 fo = open("/Users/Personals/%s"%user_id, "wb") fo.write(result) word_path=os.getcwd()+'/%d'%user_id print u'文字微博爬取完畢' link = "" fo2 = open("/Users/Personals/%s_imageurls"%user_id, "wb") for eachlink in urllist_set: link = link + eachlink +"\n" fo2.write(link) print u'圖片鏈接爬取完畢' if not urllist_set: print u'該頁(yè)面中不存在圖片' else: #下載圖片,保存在當(dāng)前目錄的pythonimg文件夾下 image_path=os.getcwd()+'/weibo_image' if os.path.exists(image_path) is False: os.mkdir(image_path) x=1 for imgurl in urllist_set: temp= image_path + '/%s.jpg' % x print u'正在下載第%s張圖片' % x try: urllib.urlretrieve(urllib2.urlopen(imgurl).geturl(),temp) except: print u"該圖片下載失敗:%s"%imgurl x+=1 print u'原創(chuàng)微博爬取完畢,共%d條,保存路徑%s'%(word_count-4,word_path) print u'微博圖片爬取完畢,共%d張,保存路徑%s'%(image_count-1,image_path)
一個(gè)簡(jiǎn)單的微博爬蟲就完成了,希望對(duì)大家的學(xué)習(xí)有所幫助。
相關(guān)文章
python輸出100以內(nèi)的質(zhì)數(shù)與合數(shù)實(shí)例代碼
本文通過實(shí)例代碼給大家介紹了python輸出100以內(nèi)的質(zhì)數(shù)與合數(shù)的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-07-07對(duì)Python2與Python3中__bool__方法的差異詳解
今天小編就為大家分享一篇對(duì)Python2與Python3中__bool__方法的差異詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11Python可視化Matplotlib散點(diǎn)圖scatter()用法詳解
這篇文章主要介紹了Python可視化中Matplotlib散點(diǎn)圖scatter()的用法詳解,文中附含詳細(xì)示例代碼,有需要得朋友可以借鑒參考下,希望能夠有所幫助2021-09-09Flask登錄注冊(cè)項(xiàng)目的簡(jiǎn)單實(shí)現(xiàn)
一個(gè)簡(jiǎn)單的用戶注冊(cè)和登錄的頁(yè)面,涉及到驗(yàn)證,數(shù)據(jù)庫(kù)存儲(chǔ)等等,本文主要介紹了Flask登錄注冊(cè)項(xiàng)目的簡(jiǎn)單實(shí)現(xiàn),從目錄結(jié)構(gòu)開始,感興趣的可以了解一下2021-05-05python數(shù)據(jù)庫(kù)如何連接SQLite詳解
這篇文章主要介紹了Python實(shí)現(xiàn)連接SQLite數(shù)據(jù)庫(kù)的方法,在Python數(shù)據(jù)庫(kù)編程中有著廣泛的應(yīng)用,需要的朋友可以參考下,希望能給你帶來幫助2021-08-08Python+Pygame制作"長(zhǎng)沙版"大富翁
說到童年愛玩的電腦游戲,最國(guó)民的莫過于金山打字通,接著是掃雷、紅心大戰(zhàn),而紅極一時(shí)的單機(jī)游戲當(dāng)屬《大富翁》。本文將通過Python的Pygame模塊制作"長(zhǎng)沙版"的大富翁,需要的可以參考一下2022-02-02Python 實(shí)現(xiàn)輸入任意多個(gè)數(shù),并計(jì)算其平均值的例子
今天小編就為大家分享一篇Python 實(shí)現(xiàn)輸入任意多個(gè)數(shù),并計(jì)算其平均值的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07