因爲最近沒事在學python,正好最近也想趴下新浪微博上邊的一些數據,在這裏主要爬去的是一我的的粉絲具體信息(微博暱稱,我的介紹,地址,經過什麼方式進行關注),因此就學以至用,經過python來爬去微博上邊的數據。html
首先先說下環境啊,使用的是python3.5,而後使用的框架有:python
requests:用來獲取html頁面。json
BeautifulSoup:用來進行html的解析,是一個在python爬蟲中很是好用的一個工具,而且有中文的說明文檔,連接是:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html。能夠看其中具體的一些函數的使用的方法。數組
經過這兩個,則就能夠實現咱們想要實現的功能了。cookie
而後第二步,則是咱們須要模擬微博進行登陸,由於你會發現,若是你不登陸,是沒法看一我的的具體的粉絲信息的,所以咱們須要本身登陸下新浪微博,而後經過調試工具,把cookie複製出來,這樣纔可以進行爬蟲。,怎麼獲取cookie,在這進行一個簡單的介紹,登錄後看到我的主頁後,打開開發者工具,而後選擇network:python爬蟲
而後複製下這個cookie,在爬蟲中須要用到,接下來就上代碼了:框架
主程序類代碼:dom
import requests from html.parser import HTMLParser import person from bs4 import BeautifulSoup import json #獲取的cookie值存放在這 myHeader = {"Cookie":"SINAGLOBAL=1151648924265.729.1510207774298; YF-V5-G0=a9b587b1791ab233f24db4e09dad383c; login_sid_t=663888f6033b6f4a8f5fa48b26d9eb17; YF-Ugrow-G0=ea90f703b7694b74b62d38420b5273df; _s_tentry=passport.weibo.com; Apache=9283625770163.1.1512087277478; ULV=1512087277483:2:1:1:9283625770163.1.1512087277478:1510207774304; SSOLoginState=1512087292; wvr=6; YF-Page-G0=451b3eb7a5a4008f8b81de1fcc8cf90e; cross_origin_proto=SSL; WBStorage=82ca67f06fa80da0|undefined; crossidccode=CODE-gz-1ElEPq-16RrfZ-qpysbLqGTWJetzH095150; SCF=AnQFFpBKBne2YCQtu52G1zEuEpkY1WI_QdgCdIs-ANt1_wzGQ0_VgvzYW7PLnswMwwJgI9T3YeRDGsWhfOwoLBs.; SUB=_2A253IOm1DeThGeNG6lsU-CjOzTWIHXVUVFx9rDV8PUNbmtBeLWTSkW9NS2IjRFgpnHs1R3f_H3nB67BbC--9b_Hb; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9W5fUsSPaZjP3cB4EXR8M3gT5JpX5KzhUgL.Fo-ReK.f1hqESo.2dJLoIEXLxK.L1hzLBKeLxK-LBo.LBoBLxKML1-zL1-zLxK-LBKBL12qLxK-L1K-L122t; SUHB=0wnlry4ys0tunb; ALF=1543884132; wb_cusLike_5819586269=N; UOR=,,login.sina.com.cn"} #要爬去的帳號的粉絲列表頁面的地址
r = requests.get('https://weibo.com/p/1005051678105910/follow?relate=fans&from=100505&wvr=6&mod=headfans¤t=fans#place',headers=myHeader) f = open("test.html", "w", encoding="UTF-8") parser = HTMLParser() parser.feed(r.text) htmlStr = r.text # 經過script來切割後邊的幾個經過js來顯示的json數組,經過觀看源代碼 fansStr = htmlStr.split("</script>") #由於在測試的時候,發現微博每一次返回的dom的順序不同,粉絲列表的dom和一個其餘內容的dom的位置一直交替,因此在這加了一個判斷 tmpJson = fansStr[-2][17:-1] if fansStr[-2][17:-1].__len__()>fansStr[-3][17:-1].__len__() else fansStr[-3][17:-1] dict = json.loads(tmpJson) soup = BeautifulSoup(dict['html'], 'html') soup.prettify() f.write(soup.prettify()) for divTag in soup.find_all('div'): if divTag['class'] == ["follow_inner"]: followTag = divTag if locals().get("followTag"): for personTag in followTag.find_all('dl'): p = person.person(personTag) print(p.__dict__)
person類代碼:函數
在這中間進行主要的解析工具
from bs4 import BeautifulSoup
#具體解析在這 class person(object): def __init__(self, personTag = None): self.analysis(personTag) def analysis(self,personTag): self.analysisName(personTag) self.analysisFollowAndFansNumber(personTag) self.analysisCity(personTag) self.analysisIntroduce(personTag) self.analysisFollowWay(personTag) self.analysisID(personTag) def analysisName(self,personTag): self.name = personTag.div.a.string def analysisFollowAndFansNumber(self,personTag): for divTag in personTag.find_all('div'): if divTag['class'] == ["info_connect"]: infoTag = divTag if locals().get("infoTag"): self.followNumber = infoTag.find_all('span')[0].em.string self.fansNumber = infoTag.find_all('span')[1].em.a.string self.assay = infoTag.find_all('span')[2].em.a.string def analysisCity(self,personTag): for divTag in personTag.find_all('div'): if divTag['class'] == ['info_add']: addressTag = divTag if locals().get('addressTag'): self.address = addressTag.span.string def analysisIntroduce(self,personTag): for divTag in personTag.find_all('div'): if divTag['class'] == ['info_intro']: introduceTag = divTag if locals().get('introduceTag'): self.introduce = introduceTag.span.string def analysisFollowWay(self,personTag): for divTag in personTag.find_all('div'): if divTag['class'] == ['info_from']: fromTag = divTag if locals().get('fromTag'): self.fromInfo = fromTag.a.string def analysisID(self,personTag): personRel = personTag.dt.a['href'] self.id = personRel[personRel.find('=')+1:-5]+personRel[3:personRel.find('?')]
在這裏爬去的是孫儷下邊的第一頁列表的微博的粉絲,結果以下截圖:
其實這個相對仍是比較簡單的,主要比較麻煩的是須要看新浪的html的源代碼,須要瞭解其顯示的規律,而後使用beautiful soup進行解析節點,獲取數據。