最早的起因是有一次想看看乙個微博好友是否在知乎上,但知乎提供了通往微博的介面,而微博沒有反向的介面,所以無異***撈針,故而作罷。
最近學習python,學了點爬蟲,忽然又想起這茬事兒,就想能否寫個程式把一些使用者的使用者名稱微博位址(如果有的話)記錄下來呢?那我到時候只要搜尋微博位址就行了。那我想先模擬登入知乎,然後在爬取使用者資訊頁就好了,但模擬登入就給我帶來了巨大的挫敗……但我發現其實不登入也能檢視使用者資訊頁,它的形式為「使用者名稱」,於是檢視其源**,發現有對應微博位址的內容。
那我解析這個網頁然後用正規表示式就可以獲取微博位址啦~順帶還可以獲取使用者名稱以便對應。
但這樣乙個個去解析太慢了,有什麼好點的方法呢?「關注了」和「關注者」這兩個網頁是需要登陸後才能檢視的,而模擬登入對我來說又太難了……那麼只有手動了!
在瀏覽器上登入知乎後,進入「關注了」介面,它的形式是「使用者名稱/followees」,檢視源**,然後儲存在本地成為「followees.htm」,從這個頁面中解析出被關注者的使用者資訊頁位址,然後再用之前的方法獲取微博位址並記錄進檔案就ok了~
寫了2個模組(readusername.py、zhihuspider.py)和1個主程式(weibolog.py),模組化可以方便維護,**如下:
(1)readusername.py用於讀取乙個檔案並從中提取出形如「使用者名稱」的使用者資訊頁,然後將所有這類**放在乙個列表中返回。
import re
from bs4 import beautifulsoup
#匯入模組
#搜尋所有含有username的標籤
user=[tag.string for tag in hreftag if hashttp(tag.string)]#列表過濾
return user
#獲取使用者資訊頁面位址
這個模組用了正規表示式(re)和beautifulsoup來提取html中的特定內容。關於其中的hashttp這個函式,由於光用正規表示式和find_all會提取出來好幾個頁面:
u'/people/使用者名稱'
u'使用者名稱'
u'/people/使用者名稱/followers'
u'/people/使用者名稱/asks'
u'/people/使用者名稱/answers'
u'/people/使用者名稱'
其中第二項就是我們要的使用者資訊頁的位址,所以我用這個函式過濾列表,只留下u'使用者名稱'的內容。
(2)zhihuspider.py用於獲取並解析使用者資訊頁,提取使用者名稱,暱稱和微博位址(如果有),返回三者組成的字串(以逗號分隔)。
最終輸出結果如圖:import urllib2
另外就是pattern1和pattern2的匹配,由於微博位址有兩種形式,一種是「/一串數字」(pattern1),另一種是「一串字元」(pattern2),所以必須先匹配pattern1,否則就會出現返回「」的情況。import re
from bs4 import beautifulsoup
#匯入模組
def getweibo(userurl):
username=userurl.split('/')[4]
#獲取username
try:
resp=urllib2.urlopen(userurl)
except urllib2.urlerror,e:#異常處理
print e.reason
else:
contents=resp.read()
soup=beautifulsoup(contents,'lxml')
#獲取網頁
nickname_=soup.select('span[class="name"]')
if nickname_:
nickname=str(nickname_).split('>')[1].split('
else:
nickname=''
nickname=eval("u'"+nickname+"'")#用於輸出中文
#獲取使用者名稱
pattern1=re.compile(r'')
pattern2=re.compile(r'')
result = re.findall(pattern1,contents)+re.findall(pattern2,contents)
#必須先匹配pattern1,否則會返回''
if result:
weibourl=result[0]
else:
weibourl=''
#若有微博位址則返回位址,若無則返回空白
return '%s,%s,%s\r\n'%(username,nickname,weibourl)
#返回「username,使用者名稱,微博位址」
(3)最後是主程式模組weibolog.py,它匯入另外兩個模組,然後讀取本地儲存的followees.htm,呼叫readusername獲取「使用者名稱」列表,再用乙個迴圈呼叫getweibo把列表裡的位址都處理一邊,最終將結果寫入weblog.txt,並顯示成功加入了多少條。
from zhihuspider import getweibo
from readusername import readusername
#匯入模組
un=readusername('g:\\zhihuspider\\followees.htm')
#讀取htm中的使用者資訊
wblog=open('g:\\zhihuspider\\weibolog.txt','a')
count=0
for name in un:
wb=getweibo(name).encode('utf-8')
wblog.write(wb)
count+=1#計數用
wblog.close()
#將解析出的結果存入檔案
print 'successed! %d added.'%count
爬蟲 抓取百萬知乎使用者設計之實體設計
點選我前往github檢視源 一.實體的關係 實體是根據返回的json資料來設計的 教育經歷方面 使用者可以有很多教育經理,user和education是一對多的關係,乙個education對應乙個education 乙個使用者可以有多個工作,當然很多人可以從事同乙份工作,每份工作對應一家公司,對應...
爬蟲 抓取知乎百萬使用者資訊之爬蟲模組
點選我前往github檢視源 別忘記star usermanage是獲取使用者資訊的爬蟲模組 public class usermanage 建構函式 使用者主頁的url格式為 url token following public usermanage string urltoken 先封裝乙個獲取...
微博 使用者畫像 微博的使用者畫像是怎樣構建的
1.概述 從使用者模型維度的劃分可以看出,屬性和興趣維度的使用者模型都可以歸入使用者畫像 user profile 的範疇。所謂使用者畫像,簡單來說就是對使用者的資訊進行標籤化。如圖1所示。一方面,標籤化是對使用者資訊進行結構化,方便計算機的識別和處理 另一方面,標籤本身也具有準確性和非二義性,也有...