Scrapy項目 - 實現斗魚直播網站信息爬取的爬蟲設計




      要求編寫的程序可爬取斗魚直播網站上的直播信息,如:房間數,直播類別和人氣等。熟悉掌握基本的網頁和url分析,同時能靈活使用Xmind工具對Python爬蟲程序(網絡爬蟲)流程圖進行分析。  


一、項目分析

1. 網頁分析

      斗魚直播網站按直播類型明顯在網頁上划分區域,同時在每一種類型區域中,視頻標簽框都將具有相同的class名稱,如:直播房間的class名稱為:ellipsis,直播類型class為:tag ellipsis,主播名稱為:dy-name ellipsis fl,人氣活躍度為:dy-num fr,這使得本實驗的進行更為便捷。

      這里使用xpath_helper_2_0_2工具,對網頁中的class進行分析並轉換成相應的xpath表達式,如下:

       ellipsis為:

                //div[@id='live-list-content']//h3[@class='ellipsis']/text()

      dy-num fr為:

               //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')方法進行判斷是否為模塊中的最后一頁。


二、項目工具

      Python 3.7.1     、 JetBrains PyCharm 2018.3.2


三、項目過程

(一)使用Xmind工具對Python爬蟲程序(網絡爬蟲)流程圖進行分析,繪制如圖3-1所示的程序邏輯框架圖

clip_image002

圖3-1 程序邏輯框架圖


(二)爬蟲程序調試過程BUG描述(截圖)

clip_image002[8]

圖3-1   爬蟲程序BUG描述①


clip_image002[10]

圖3-2 爬蟲程序BUG描述②


四、項目結果

clip_image002[14]


五、項目心得

   關於本例實驗心得可總結如下:

1、 當程序運行結果提示錯誤為:ModuleNotFoundError: No module named 'lxml',最好的解決方法是:首先排除是否lxml是否安裝,再檢查lxml是否被導入。本實驗中,是由於工程項目為能成功導入lxml,解決方法如圖5-1所示,在“Project Interperter”中選擇python安裝目錄,即可。

clip_image002[16]

圖5-1 錯誤解決過程


2、 當出現如圖4-6的爬蟲程序BUG描述時,可以確定為phantomjs沒有設置環境變量,或者編程程序沒有成功加載環境,后者的解決方法只需重新啟動JetBrains PyCharm 2018.3.2即可,對於前者可在系統中設置環境即可


3、 新版selenium不支持phantomJS的解決方法:使用Chrome+headless或Firefox+headless,headless:無頭參數,如圖5-2所示:

clip_image002[18]

圖5-2 解決方法


六、項目源碼

     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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM