想獲取某人發(fā)的所有微博信息,發(fā)現(xiàn)新浪微博的API里存在局限性,不僅需要申請高級接口,而且還要用戶授權(quán)才能獲取他發(fā)的全部微博。既然沒有接口,那么就自己寫個爬蟲吧!
先附上項目代碼地址:微博爬蟲源碼
項目的執(zhí)行需要安裝 selenium,requests以及BeautifulSoup庫,還需要chromeDriver來配合。
首先,我們要在瀏覽器里打開微博去分析獲取某個人的微博都需要哪些參數(shù),以及調(diào)用了哪些請求。
分析得出結(jié)果如下:
獲取微博的請求都需要有一個cookie,并且cookie存在的有效時間還是比較長的。
登錄微博多次會需要驗證碼,為了避免驗證碼的阻礙,盡量把cookie存起來,等cookie失效了再去模擬登錄獲取cookie。
微博的每一頁可以分為3屏,首屏的接口與2,3屏接口不一致。下面4,5兩點的接口用的是MRJ臺灣官方的微博為例子。
每一頁的首屏接口為:http://weibo.com/mrj168?is_all=1&profile_ftype=1&page=1 page為第幾頁
每一頁的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均為第幾頁。rnd為當前時間戳,單位是毫秒。id為100505+“微博的ID”,script_uri為“/”+“個性域名”或者"/"+"/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)#打開微博登錄頁面
time.sleep(10)#因為加載頁面需要時間,所以這里延時10s來確保頁面已加載完畢
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和更新時間。如果Cookie有效,則直接讀取本地的Cookie。
有了Cookie之后,我們就可以拿著Cookie去調(diào)用上面分析出的兩個接口啦!
通過個性域名和Cookie及頁碼去請求某一頁的首屏。
通過微博ID和個性域名及頁碼和第幾屏去獲取某一頁的第幾屏。
接口返回的內(nèi)容并不是json,而是HTML格式的文本,所以需要我們自己去解析。這里我使用的是BeautifulSoup來分析HTML的元素的。
以每頁首屏的接口為例子:
def get_object_top_weibo_by_person_site_name_and_cookie(person_site_name,cookie,page):#每一頁頂部微博
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。
然后我的微博爬蟲就這樣實現(xiàn)了,好像也不難的樣子。。。但是面對微博接口返回的一大堆數(shù)據(jù),需要耐心去分析。