半自動抓取知乎使用者的微博位址(python)(1)

2021-07-06 07:32:43 字數 3456 閱讀 2490

最早的起因是有一次想看看乙個微博好友是否在知乎上,但知乎提供了通往微博的介面,而微博沒有反向的介面,所以無異***撈針,故而作罷。

最近學習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

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,使用者名稱,微博位址」

另外就是pattern1和pattern2的匹配,由於微博位址有兩種形式,一種是「/一串數字」(pattern1),另一種是「一串字元」(pattern2),所以必須先匹配pattern1,否則就會出現返回「」的情況。

(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所示。一方面,標籤化是對使用者資訊進行結構化,方便計算機的識別和處理 另一方面,標籤本身也具有準確性和非二義性,也有...