Python爬蟲入門庫之selenium+chromedriver的組合拳來爬取鬥魚主播信息

經過之前的介紹,學會了requests,BeautifulSoup庫的簡單使用,現在將介紹selenium+chromedriver的方式來實現爬蟲

1.首先準備庫

pycharm的話在File->Settings->
在這裏插入圖片描述
然後
在這裏插入圖片描述
對了,在國內,可以設置鏡像,不然會很不方便,有時候安裝不上,有時候搜索不出來
鏡像:
https://mirrors.aliyun.com/pypi/simple/
https://pypi.tuna.tsinghua.edu.cn/simple/
設置鏡像如下
在這裏插入圖片描述
迴歸正題,如上方法安裝下面這幾個庫
在這裏插入圖片描述

2.準備chromedriver

對於chromedriver,百度chromedriver,下載對應你chrome瀏覽器版本的版本
比如我的瀏覽器版本
在這裏插入圖片描述
淘寶鏡像下載,我選擇了81.4044.69相對接近我的版本,測試可用
在這裏插入圖片描述
下載之後,直接copy到你的python安裝路徑
在這裏插入圖片描述
方法不止這一種
還可以直接copy到你pycharm的project文件裏面
還可以設置環境變量
還可以在創建chromedriver對象的時候添加路徑參數
還可以…

作者推薦正使用的方法,一勞永逸

3.分析鬥魚的HTML框架

可以看到,每一個li就是一個主播
在這裏插入圖片描述
每個li裏面找到相應信息的位置
在這裏插入圖片描述
簡單分析完畢

4.終於可以擼代碼了

from selenium import webdriver  # 用於創建瀏覽器對象
from selenium.webdriver.chrome.options import Options  # 用於創建參數設置對象
from selenium.webdriver.common.by import By  # 用於查找元素時的簡單
from selenium.webdriver.support.ui import WebDriverWait  # 用於設置瀏覽器等待DOM對象創建完成之後再進行獲取
from selenium.webdriver.support import expected_conditions as EC  # 同上
from bs4 import BeautifulSoup
import pandas
import time
import random

URL = 'https://www.douyu.com/directory/all'
driver = {}
op = {}
soup = {}

slogans = []
hotValues = []
names = []
zones = []
singleInfor = []


# 獲取網頁信息
def getInfor():
    global op, driver, URL
    # 打開網頁
    op = Options()
    # 爲設置對象添加屬性
    op.add_argument('--window-size=1600,600')
    # 這個參數爲了防止服務器在console查詢window.navigator.webdriver這個參數來識別是否使用selenium訪問
    # 在正常情況下,該參數位undefined,但在使用了selenium之後會變爲true,對op設置以下參數會避免這個問題發生
    # 同時,在chromeVer>=79版本,google修復非headless下window.navigator.webdriver爲undefined的問題
    # 如果要爬的網站不行,可以試試回滾瀏覽器,然後再設置下面這句話
    # 鬥魚沒有該反爬機制,故不用設置該參數
    # op.add_experimental_option('excludeSwitches', ['enable-automation'])
    driver = webdriver.Chrome(options=op)
    driver.get(URL)


# 每頁信息處理
def inforHandle():
    global soup, zones, names, hotValues, slogans, singleInfor, driver
    # 煲湯
    soup = BeautifulSoup(driver.page_source, 'lxml')
    # 找到每個主播的li標籤,這裏鬥魚是將每個主播所有信息放在一個li標籤裏面
    soup = soup.find_all(class_='layout-Module-container layout-Cover ListContent')
    for i in soup:
        temp = i.find_all(class_='layout-Cover-item')
        for j in temp:
            zones.append(j.find(class_='DyListCover-zone').text)
            slogans.append(j.find(class_='DyListCover-intro').text)
            hotValues.append(j.find(class_='DyListCover-hot').text)
            names.append(j.find(class_='DyListCover-user').text)
    singleInfor.append(names)
    singleInfor.append(hotValues)
    singleInfor.append(zones)
    singleInfor.append(slogans)


# 換頁
def nextPages():
    for i in range(150):
        inforHandle()
        # 每次等待的時間用隨機數
        sleepTime = round(random.random(), 1) + 2
        print('已處理第', i, '頁...', '用時', sleepTime)
        time.sleep(sleepTime)
        # 這裏是等待下一頁按鈕加載完成時菜點擊
        nextPage = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '.dy-Pagination-next>.dy-Pagination-item-custom')))
        nextPage.click()


# 存文件
def saveInCsv():
    # 用pandas很方便,儲存也用方便的csv文件,到時候要再excel文件使用,可以在excel直接導入就行
    df = pandas.DataFrame({'主播名': names, '分區': zones, '口號': slogans, '熱度': hotValues})
    df.to_csv('text.csv', index=False, sep=',')


def main():
    getInfor()
    nextPages()


try:
    main()
finally:
    saveInCsv()

# 最開始寫第一頁時的測試函數
def test():
    for i in range(len(names)):
        for j in range(4):
            print(singleInfor[j][i], end=' ')
        print('\n', end='')

#關閉瀏覽器驅動
# driver.close()

代碼比較簡單,同時註釋比較詳細,特別說明一些代碼API
1.對於等待元素加載完畢的API
在這裏插入圖片描述
2.對於數據儲存
在這裏插入圖片描述
這裏使用了
pandas官方文檔
selenium官方文檔
最後,附上
爬取結果
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章