打開今日熱榜網站,鼠標右鍵並查看網頁源代碼,是html結構,找到熱搜榜第一條標題所在的位置。
找到對應標簽span,發現class=‘t'是標題,class=’e'是熱度,此時爬取目標已經很明確了,
通過find_all()函數查找所有對應內容,最后再用.string方法將找到的內容轉化為字符串形式打印出來。
整體代碼如下:
1 import requests 2 from bs4 import BeautifulSoup 3 import pandas as pd 4 from pandas import DataFrame 5 6 #定義一個獲取html文本的函數 7 def getHTMLText(url): 8 try: 9 #為確保成功訪問網站,將爬蟲偽裝成瀏覽器 10 headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'} 11 r = requests.get(url,timeout = 30,headers=headers) 12 r.raise_for_status() 13 #更改為utf-8編碼以確保不會亂碼 14 r.encoding = 'utf-8' 15 return r.text 16 except: 17 return "" 18 19 #定義一個獲取並打印爬取數據的函數 20 def printWeiboHot(lst,html,num): 21 #煲湯 22 soup = BeautifulSoup(html, 'html.parser') 23 #查找需要爬取的數據,並將其存放於兩個列表里 24 lst1 = soup.find_all('span', class_='t') 25 lst2 = soup.find_all('span', class_='e') 26 #主標題 27 print('{:^55}'.format('微博熱搜榜')) 28 #列名 29 print('{:^5}\t{:^40}\t{:^10}'.format('排名', '標題', '熱度')) 30 #通過循環把爬取的數據一行一行打印出來 31 for i in range(num): 32 print('{:^5}\t{:^30}\t{:^10}'.format(i+1, lst1[i].string, lst2[i].string)) 33 #將爬取的數據整合到一個列表里,以便輸出 34 lst.append([i+1,lst1[i].string,lst2[i].string]) 35 36 #主函數 37 def main(): 38 num = 10 39 lst = [] 40 url = 'https://tophub.today/' 41 html = getHTMLText(url) 42 printWeiboHot(lst,html,num) 43 #創建一個DataFrame存放爬取的數據並將其用excel保存 44 df = pd.DataFrame(lst,columns=['排名','標題','熱度']) 45 WeiboHot = r'C:\Users\Yaoner\WeiboHot.xlsx' 46 df.to_excel(WeiboHot) 47 48 main()
輸出到Excel的結果如下: