要求編寫的程序可爬取鬥魚直播網站上的直播信息,如:房間數,直播類別和人氣等。熟悉掌握基本的網頁和url分析,同時能靈活使用Xmind工具對Python爬蟲程序(網絡爬蟲)流程圖進行分析。 python
1、項目分析web
1. 網頁分析編程
鬥魚直播網站按直播類型明顯在網頁上劃分區域,同時在每一種類型區域中,視頻標籤框都將具備相同的class名稱,如:直播房間的class名稱爲:ellipsis,直播類型class爲:tag ellipsis,主播名稱爲:dy-name ellipsis fl,人氣活躍度爲:dy-num fr,這使得本實驗的進行更爲便捷。網絡
這裏使用xpath_helper_2_0_2工具,對網頁中的class進行分析並轉換成相應的xpath表達式,以下:app
ellipsis爲:框架
//div[@id='live-list-content']//h3[@class='ellipsis']/text()less
dy-num fr爲:scrapy
//div[@id='live-list-content']//span[@class='dy-num fr']/text()工具
dy-name ellipsis fl爲:網站
//div[@id='live-list-content']//span[@class='dy-name ellipsis fl']/text()
tag ellipsis爲:
//div[@id='live-list-content']//span[@class='tag ellipsis']/text()
2. url分析
這裏的網頁加載可由self.driver調用get()方法完成,同時在網頁模塊判斷的時候,可由其調用find_element_by_class_name('shark-pager-next').click()方法串,自動完成下一頁的模擬翻轉。
同時可調用page_source.find('shark-pager-disable-next')方法進行判斷是否爲模塊中的最後一頁。
2、項目工具
Python 3.7.1 、 JetBrains PyCharm 2018.3.2
3、項目過程
(一)使用Xmind工具對Python爬蟲程序(網絡爬蟲)流程圖進行分析,繪製如圖3-1所示的程序邏輯框架圖
圖3-1 程序邏輯框架圖
(二)爬蟲程序調試過程BUG描述(截圖)
圖3-2 爬蟲程序BUG描述②
4、項目結果
5、項目心得
關於本例實驗心得可總結以下:
一、 當程序運行結果提示錯誤爲:ModuleNotFoundError: No module named 'lxml',最好的解決方法是:首先排除是否lxml是否安裝,再檢查lxml是否被導入。本實驗中,是因爲工程項目爲能成功導入lxml,解決方法如圖5-1所示,在「Project Interperter」中選擇python安裝目錄,便可。
圖5-1 錯誤解決過程
二、 當出現如圖4-6的爬蟲程序BUG描述時,能夠肯定爲phantomjs沒有設置環境變量,或者編程程序沒有成功加載環境,後者的解決方法只需從新啓動JetBrains PyCharm 2018.3.2便可,對於前者可在系統中設置環境便可
三、 新版selenium不支持phantomJS的解決方法:使用Chrome+headless或Firefox+headless,headless:無頭參數,如圖5-2所示:
圖5-2 解決方法
6、項目源碼
doyu.py
from selenium import webdriver from lxml import etree import twisted import scrapy from openpyxl import Workbook import time class Douyu(object): def __init__(self): self.driver = webdriver.PhantomJS() def start(self): self.driver.get('https://www.douyu.com/directory/all') room_sum=0 host_sum=0 type_sum=0 while True: time.sleep(2) content=etree.HTML(self.driver.page_source) roomnames=content.xpath("//div[@id='live-list-content']//h3[@class='ellipsis']/text()") hots=content.xpath("//div[@id='live-list-content']//span[@class='dy-num fr']/text()") names=content.xpath("//div[@id='live-list-content']//span[@class='dy-name ellipsis fl']/text()") types=content.xpath("//div[@id='live-list-content']//span[@class='tag ellipsis']/text()") for roomname,hot,name,type in zip(roomnames,hots,names,types): roomname=roomname.strip() print("\t熱度數",hot," \t主播名:",name," \t主播類型:",type," \t房間名:",roomname) room_sum+=1 if hot[-1]=='萬': hot=hot[:-1] hot=int(float(hot)*10000) host_sum+=hot #host_sum=host_sum+hot else: host_sum+=int(hot) if type=='絕地求生': type_sum+=1 else: a=0 a+=1 ret=self.driver.page_source.find('shark-pager-disable-next') if ret>0: break else: # 非最後一頁,點擊下一頁 self.driver.find_element_by_class_name('shark-pager-next').click() print('房間總數:',room_sum) print('熱度總數:', host_sum) print('主播名總數:', room_sum) print('絕地求生主播總數:',type_sum) class DoubanPipeline(object): wb = Workbook() ws = wb.active # 設置表頭 ws.append(['標題', '評分']) def process_item(self, item): # 添加數據 line = [item['title'], item['star']] self.ws.append(line) # 按行添加 self.wb.save('douban.xlsx') return item if __name__=="__main__": douyu=Douyu() douyu.start() #//div[@id='live-list-content']//h3[@class='ellipsis']/text() #//div[@id='live-list-content']//span[@class='dy-num fr']/text() #ret= driver.page_source.find('shark-pager-disable-next') #print(ret)