想獲取某人發(fā)的所有微博信息认境,發(fā)現(xiàn)新浪微博的API里存在局限性彬坏,不僅需要申請(qǐng)高級(jí)接口,而且還要用戶授權(quán)才能獲取他發(fā)的全部微博童太。既然沒有接口米辐,那么就自己寫個(gè)爬蟲吧胸完!
先附上項(xiàng)目代碼地址:微博爬蟲源碼
項(xiàng)目的執(zhí)行需要安裝 selenium,requests以及BeautifulSoup庫(kù),還需要chromeDriver來配合翘贮。
首先赊窥,我們要在瀏覽器里打開微博去分析獲取某個(gè)人的微博都需要哪些參數(shù),以及調(diào)用了哪些請(qǐng)求狸页。
分析得出結(jié)果如下:
獲取微博的請(qǐng)求都需要有一個(gè)cookie锨能,并且cookie存在的有效時(shí)間還是比較長(zhǎng)的。
登錄微博多次會(huì)需要驗(yàn)證碼芍耘,為了避免驗(yàn)證碼的阻礙址遇,盡量把cookie存起來,等cookie失效了再去模擬登錄獲取cookie斋竞。
微博的每一頁(yè)可以分為3屏倔约,首屏的接口與2,3屏接口不一致坝初。下面4跺株,5兩點(diǎn)的接口用的是MRJ臺(tái)灣官方的微博為例子。
每一頁(yè)的首屏接口為:http://weibo.com/mrj168?is_all=1&profile_ftype=1&page=1 page為第幾頁(yè)
每一頁(yè)的2脖卖,3屏接口為:http://weibo.com/p/aj/v6/mblog/mbloglist?ajwvr=6&domain=100505&pagebar=0&is_tag=0&is_search=0&pre_page=1&profile_ftype=1&id=1005051837498771&script_uri=%2Fmrj168&feed_type=0&__rnd=1490768727000&pl_name=Pl_Official_MyProfileFeed__22&is_all=1&domain_op=100505&page=1 需要修改的參數(shù)為pagebar,第二屏和第三屏分別為0,1巧颈。以及pre_page和page均為第幾頁(yè)畦木。rnd為當(dāng)前時(shí)間戳,單位是毫秒砸泛。id為100505+“微博的ID”十籍,script_uri為“/”+“個(gè)性域名”或者"/"+"/u/"+"微博的ID"
?
通過以上的分析,把邏輯轉(zhuǎn)換成代碼唇礁。大致流程如下:
result = is_valid_cookie()
print result
if result == False:
driver = webdriver.Chrome("/Users/fantasy/Downloads/chromedriver")#打開Chrome
driver.maximize_window()#將瀏覽器最大化顯示
driver.get(weibo_url)#打開微博登錄頁(yè)面
time.sleep(10)#因?yàn)榧虞d頁(yè)面需要時(shí)間勾栗,所以這里延時(shí)10s來確保頁(yè)面已加載完畢
cookie = login_weibo_get_cookies()
save_cookie(cookie)
save_cookie_update_timestamp(get_timestamp())
else :
cookie = get_cookie_from_txt()
for x in xrange(1,page_size+1):
profile_html = get_object_top_weibo_by_person_site_name_and_cookie(person_site_name,cookie,x)
image_url_list = get_img_urls_form_html(profile_html)
write_image_urls(image_url_list)
for y in xrange(0,2):#有兩次下滑加載更多的操作
print "pagebar:"+str(y)
html = get_object_weibo_by_weibo_id_and_cookie(weibo_id,person_site_name,cookie,y,x)
image_url_list = get_img_urls_form_html(html)
write_image_urls(image_url_list)
首先判斷本地是否存在有效的Cookie,如果Cookie不存在或者過期了盏筐,那么使用webdriver去打開微博登錄并獲取Cookie围俘,然后更新本地的Cookie和更新時(shí)間。如果Cookie有效琢融,則直接讀取本地的Cookie界牡。
有了Cookie之后,我們就可以拿著Cookie去調(diào)用上面分析出的兩個(gè)接口啦漾抬!
通過個(gè)性域名和Cookie及頁(yè)碼去請(qǐng)求某一頁(yè)的首屏宿亡。
通過微博ID和個(gè)性域名及頁(yè)碼和第幾屏去獲取某一頁(yè)的第幾屏。
接口返回的內(nèi)容并不是json纳令,而是HTML格式的文本挽荠,所以需要我們自己去解析克胳。這里我使用的是BeautifulSoup來分析HTML的元素的。
以每頁(yè)首屏的接口為例子:
def get_object_top_weibo_by_person_site_name_and_cookie(person_site_name,cookie,page):#每一頁(yè)頂部微博
try:
profile_url = weibo_url+person_site_name+"?"
headers["Cookie"] = cookie
profile_request_params["page"] = page
response = requests.get(profile_url,headers=headers,params=profile_request_params)
print response.url
html = response.text
soup = BeautifulSoup(html,"html.parser")
script_list = soup.find_all("script")
script_size = len(script_list)
print "script_size:"+str(script_size)
tag = 0
for x in xrange(script_size):
if "WB_feed WB_feed_v3 WB_feed_v4" in str(script_list[x]):
tag = x
print "tag:"+str(tag)
# print script_list[script_size-1]
html_start = str(script_list[tag]).find("<div")
html_end = str(script_list[tag]).rfind("div>")
# print str(script_list[tag])[html_start:html_end+4]
return str(str(script_list[tag])[html_start:html_end+4])
except Exception, e:
print e
finally:
pass
直接使用find_all來獲取所有圖片圈匆,再用get("src")來獲取圖片的url漠另。
然后我的微博爬蟲就這樣實(shí)現(xiàn)了,好像也不難的樣子臭脓。酗钞。。但是面對(duì)微博接口返回的一大堆數(shù)據(jù)来累,需要耐心去分析砚作。