知乎熱榜?微博熱門?爬!
一直也沒寫過爬蟲的代碼,一來是接觸練習的少,二來也對爬蟲心存偏見:老有種做賊偷數(shù)據(jù)的感覺。
最近在體驗過爬蟲的高效便捷后,覺得確實有必要多實踐一下。其實我本身學爬蟲沒多久,遠沒到分享爬蟲技術的水平。但公眾號平臺嘛,又不是課堂,分享點實戰(zhàn)經(jīng)驗和思路,相互交流下心得,也是挺不錯的。
今天來分享下這兩天寫的入門級的爬取知乎熱榜和微博熱門數(shù)據(jù)的代碼和思路。首先明確下爬蟲、知乎熱榜和微博熱門這些概念。
網(wǎng)絡爬蟲(又稱為網(wǎng)頁蜘蛛,網(wǎng)絡機器人,在FOAF社區(qū)中間,更經(jīng)常的稱為網(wǎng)頁追逐者),是一種按照一定的規(guī)則,自動地抓取萬維網(wǎng)信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。
——百度百科,“網(wǎng)絡爬蟲”
知乎熱榜中的內(nèi)容熱度值,是根據(jù)該條內(nèi)容近24小時內(nèi)的瀏覽量、互動量、專業(yè)加權、創(chuàng)作時間及在榜時間等維度,綜合計算得出的。知乎熱榜即根據(jù)內(nèi)容熱度值制定的排行榜。
知乎熱榜鏈接:https://www.zhihu.com/billboardhttps://www.zhihu.com/hot

微博的熱度值是根據(jù)該篇微博被轉發(fā)、點贊數(shù)和微博發(fā)布時間等各項因素,來算出熱度基數(shù),再與熱度權重相加,得出最終的熱度值。微博熱門即話題熱度排行榜。
微博熱門鏈接:https://s.weibo.com/top/summary

今天我們要做的就是將相關排行榜中的話題內(nèi)容爬取下來當作數(shù)據(jù)素材。換句話說,我們要把頁面上排好的信息,通過代碼讀取并保存起來。
1. 爬取網(wǎng)頁內(nèi)容
Python 爬蟲通常采用 requests 庫來處理網(wǎng)絡請求。這里關于 requests 的方法和參數(shù)暫不展開。

?知乎熱榜

微博熱門
這里有兩點要注意:
我們選用的網(wǎng)址鏈接在未登錄狀態(tài)下也可訪問,因此 requests 方法中的參數(shù)為空也不影響。但爬蟲時更多的情況是需要登陸狀態(tài),因此也就要求通過設置不同參數(shù)來模擬登陸去進行相關操作。
通過 requests 模塊獲取的網(wǎng)頁內(nèi)容,對應的是在網(wǎng)站上右鍵單擊,選擇“顯示網(wǎng)頁源代碼”后展現(xiàn)的頁面。它與我們實際看到的網(wǎng)頁內(nèi)容或者 F12 進入開發(fā)者模式中看到的網(wǎng)頁 elements 是不同的。前者是網(wǎng)絡請求后返回結果,后者是瀏覽器對頁面渲染后結果。
2.?解析爬到的內(nèi)容
第一步爬到的是整個頁面內(nèi)容,接下來要在所有內(nèi)容中去對目標定位,然后將其讀取并保存起來。
這里我采用的是 BeautifulSoup,因為學爬蟲最先接觸這個,用起來也蠻順手。通過 BeautifulSoup 提供的方法和參數(shù),可以很便捷定位到目標。
Beautiful Soup 是一個可以從HTML或XML文件中提取數(shù)據(jù)的Python庫.它能夠通過你喜歡的轉換器實現(xiàn)慣用的文檔導航,查找,修改文檔的方式.Beautiful Soup會幫你節(jié)省數(shù)小時甚至數(shù)天的工作時間。
Beautiful Soup 4.4.0 文檔;https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/
之前講到爬蟲所獲取的網(wǎng)頁對應的是網(wǎng)頁源代碼,那么在定位網(wǎng)頁中目標時可以結合網(wǎng)頁源代碼來制定解析策略。
這里提一點特別的,在知乎熱榜的網(wǎng)頁源代碼中,拉到最下方可以看到如下:

在源代碼中網(wǎng)頁的 script 部分,有現(xiàn)成的整理好的熱榜數(shù)據(jù)。所以我們?yōu)榱藴p少工作量,直接通過 BeautifulSoup 取出 script 中內(nèi)容,再用正則表達式匹配熱榜數(shù)據(jù)列表處的內(nèi)容。
import requestsimport refrom bs4 import BeautifulSoupheaders={"User-Agent":"","Cookie":""}zh_url = "https://www.zhihu.com/billboard"zh_response = requests.get(zh_url,headers=headers)webcontent = zh_response.textsoup = BeautifulSoup(webcontent,"html.parser")script_text = soup.find("script",id="js-initialData").get_text()rule = r'"hotList":(.*?),"guestFeeds"'result = re.findall(rule,script_text)temp = result[0].replace("false","False").replace("true","True")hot_list = eval(temp)print(hot_list)
這里我利用了 script 中熱榜數(shù)據(jù)的列表結構,在定位取出相關字符串后,先將 js 中的 true 和 false 轉化為 Python 中的 True 和 False,最后直接通過 eval() 來將字符串轉化為直接可用的數(shù)據(jù)列表。
運行代碼結果如圖:

至于對微博熱門的解析,就是中規(guī)中矩地利用 BeautifulSoup 來對網(wǎng)頁元素進行定位獲?。?/span>
import requestsfrom bs4 import BeautifulSoupurl = "https://s.weibo.com/top/summary"headers={"User-Agent":"","Cookie":""}wb_response = requests.get(url,headers=headers)webcontent = wb_response.textsoup = BeautifulSoup(webcontent,"html.parser")index_list = soup.find_all("td",class_="td-01")title_list = soup.find_all("td",class_="td-02")level_list = soup.find_all("td",class_="td-03")topic_list = []for i in range(len(index_list)):item_index = index_list[i].get_text(strip = True)if item_index=="":item_index = "0"item_title = title_list[i].a.get_text(strip = True)if title_list[i].span:item_mark = title_list[i].span.get_text(strip = True)else:item_mark = "置頂"item_level = level_list[i].get_text(strip = True)topic_list.append({"index":item_index,"title":item_title,"mark":item_mark,"level":item_level,"link":f"https://s.weibo.com/weibo?q=%23{item_title}%23&Refer=top"})print(topic_list)
通過解析,將微博熱門數(shù)據(jù)逐條存入列表中:

后續(xù)對拿到的數(shù)據(jù)加以處理展示,即可得到很多有趣的應用或?qū)崿F(xiàn)某些功能。例如集成諸多平臺排行榜的 “今日熱榜”:

今日熱榜鏈接:https://tophub.today
因為并未展開爬蟲細節(jié),今天的總結也比較簡單:
首先在選取要爬的網(wǎng)址時要給自己降低難度,例如同樣是知乎熱榜,zhihu.com/hot?需要登陸,而?zhihu.com/billboard?無需登錄便可訪問
解析爬取到的內(nèi)容時,要結合具體頁面內(nèi)容選擇最便捷的方式。當需要批量爬取相似頁面時,也要盡量整理通用的解析策略。
代碼下載移步留言區(qū)!
當然,拿到數(shù)據(jù)只是開始,后續(xù)如何去處理才是關鍵和價值所在,之后我們繼續(xù)探討。
以上,感謝閱讀!
