selenium+phantomjs爬取bilibili

来源:https://www.cnblogs.com/cany/archive/2019/05/21/10897618.html
-Advertisement-
Play Games

selenium+phantomjs爬取bilibili 首先我們要下載phantomjs 你可以到 http://phantomjs.org/download.html 這裡去下載 下載完之後解壓到你想要放的位置 你需要配置一下環境變數哦 如下圖: 首先,我們怎麼讓瀏覽器模擬操作,也就是我們自己先 ...


selenium+phantomjs爬取bilibili

首先我們要下載phantomjs 你可以到 http://phantomjs.org/download.html 這裡去下載 下載完之後解壓到你想要放的位置 你需要配置一下環境變數哦

如下圖:
enter description here


首先,我們怎麼讓瀏覽器模擬操作,也就是我們自己先分析好整個操作過程,哪個地方有什麼問題,把這些問題都提前測試好,沒問題了再進行寫代碼。

打開bilibili網站 https://www.bilibili.com/ 發現下圖登陸彈窗
enter description here

那麼這裡我們就得先把這個彈窗去除,怎麼去呢?你刷新一下或者點一下 首頁 就不會出現了,所以這裡我們可以模擬再刷新一次或者點擊首頁。

接下來搜索關鍵詞 蔡徐坤 打球 這時就涉及到搜索輸入框和搜索按鈕
enter description here

點擊搜索後我們看到了下列內容,其中圈起來的就是要爬的信息啦 這時就涉及到頁面源碼獲取,數據元素定位
enter description here

那麼上面這個過程走完了的話 我們也可以選擇寫入xls格式,同時這裡還少了一個事,那就是我現在才爬了一頁,那難道不寫個自動化爬取全部嗎?
enter description here

那此時就得解決迴圈獲取和寫入xls 更重要的事怎麼去操作頁數和下一頁按鈕

大致的思路就是這樣子了!!!

先導入這些模塊

from selenium import webdriver
from selenium.common.exceptions import TimeoutException #一條命令在足夠的時間內沒有完成則會拋出異常
from selenium.webdriver.common.by import By #支持的定位器分類
from selenium.webdriver.support.ui import WebDriverWait  #等待頁面載入完成,找到某個條件發生後再繼續執行後續代碼,如果超過設置時間檢測不到則拋出異常
from selenium.webdriver.support import expected_conditions as EC #判斷元素是否載入
from bs4 import BeautifulSoup
import xlwt

定義一個瀏覽器對象並設置其他功能

browser = webdriver.Chrome() #初始化瀏覽器對象
WAIT = WebDriverWait(browser,10)  #顯式等待,等待的時間是固定的,這裡為10秒 元素在指定時間內不可見就引發異常TimeoutException
browser.set_window_size(1400,900) #設置瀏覽器視窗大小

創建excel文件,再創建一張工作表,名為 蔡徐坤籃球,並且設置支持覆蓋原數據!

book=xlwt.Workbook(encoding='utf-8',style_compression=0) #創建excel文件,設置utf-8編碼,這樣就可以在excel中輸出中文了
sheet=book.add_sheet('蔡徐坤籃球',cell_overwrite_ok=True) #添加一張工作表 cell_overwrite_ok=True 時可以覆蓋原單元格中數據。
sheet.write(0,0,'名稱')
sheet.write(0,1,'地址')
sheet.write(0,2,'描述')
sheet.write(0,3,'觀看次數')
sheet.write(0,4,'彈幕數')
sheet.write(0,5,'發佈時間')

打開網站

browser.get('https://www.bilibili.com/')

尋找 “首頁” 元素

index = WAIT.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#primary_menu > ul > li.home > a')))
        # 配合WebDriverWait類的until()方法進行靈活判斷 進行下一步操作
        # 通過EC進行判斷某個元素中是否可見並且是enable的 這樣的話叫clickable(可點擊)
        # 使用CSS選擇器選中頁面中的 首頁 進行點擊 目的為了第一次有個登錄彈窗 刷新就沒有 那就點擊下首頁來實現刷新
        index.click() #點擊!

先判斷是否載入 輸入框 再判斷搜索按鈕是否能點擊 達到條件後輸入內容進行搜索

input = WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#banner_link > div > div > form > input'))) #判斷某個元素是否被加到DOM樹里,並不代表該元素一定可見(元素可以是隱藏的)
        submit = WAIT.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="banner_link"]/div/div/form/button'))) #判斷搜索按鈕是否能點擊,這裡使用Xpath來尋找元素
        input.send_keys('蔡徐坤 籃球') #用send_keys()方法進行搜索輸入框中輸入內容
        submit.click() #點擊搜索!

這時搜索完 是彈出新的視窗 這時就得獲取視窗句柄 實現標簽頁跳轉

all_h = browser.window_handles #獲取所有視窗句柄
browser.switch_to.window(all_h[1]) #switch_to.window 標簽頁跳轉

接下來就是獲取頁面源碼了(此處非全部源碼)

WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#server-search-app > div.contain > div.body-contain > div > div.result-wrap.clearfix'))) #堅持是否載入完所有搜索結果
    html = browser.page_source #page_source方法可以獲取到頁面源碼

然後搜索元素並提取內容進行保存

    #遍歷所有搜索信息 並保存
    list = soup.find(class_='all-contain').find_all(class_='info')
    for item in list:
        item_title = item.find('a').get('title')
        item_link = item.find('a').get('href')
        item_dec = item.find(class_='des hide').text
        item_view = item.find(class_='so-icon watch-num').text
        item_biubiu = item.find(class_='so-icon hide').text
        item_date = item.find(class_='so-icon time').text

        print('爬取:' + item_title)

再最後就是迴圈獲取每一頁提取數據最後寫入xls文件!!!

下麵就直接貼出代碼了

from selenium import webdriver
from selenium.common.exceptions import TimeoutException #一條命令在足夠的時間內沒有完成則會拋出異常
from selenium.webdriver.common.by import By #支持的定位器分類
from selenium.webdriver.support.ui import WebDriverWait  #等待頁面載入完成,找到某個條件發生後再繼續執行後續代碼,如果超過設置時間檢測不到則拋出異常
from selenium.webdriver.support import expected_conditions as EC #判斷元素是否載入
from bs4 import BeautifulSoup
import xlwt


browser = webdriver.Chrome() #初始化瀏覽器對象
WAIT = WebDriverWait(browser,10)  #顯式等待,等待的時間是固定的,這裡為10秒 元素在指定時間內不可見就引發異常TimeoutException
browser.set_window_size(1400,900) #設置瀏覽器視窗大小


book=xlwt.Workbook(encoding='utf-8',style_compression=0) #創建excel文件,設置utf-8編碼,這樣就可以在excel中輸出中文了
sheet=book.add_sheet('蔡徐坤籃球',cell_overwrite_ok=True) #添加一張工作表 cell_overwrite_ok=True 時可以覆蓋原單元格中數據。
sheet.write(0,0,'名稱')
sheet.write(0,1,'地址')
sheet.write(0,2,'描述')
sheet.write(0,3,'觀看次數')
sheet.write(0,4,'彈幕數')
sheet.write(0,5,'發佈時間')
n = 1

def seach():
    try:
        print('開始訪問b站....')
        browser.get('https://www.bilibili.com/')

        index = WAIT.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#primary_menu > ul > li.home > a')))
        # 配合WebDriverWait類的until()方法進行靈活判斷 進行下一步操作
        # 通過EC進行判斷某個元素中是否可見並且是enable的 這樣的話叫clickable(可點擊)
        # 使用CSS選擇器選中頁面中的 首頁 進行點擊 目的為了第一次有個登錄彈窗 刷新就沒有 那就點擊下首頁來實現刷新
        index.click() #點擊!

        input = WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#banner_link > div > div > form > input'))) #判斷某個元素是否被加到DOM樹里,並不代表該元素一定可見(元素可以是隱藏的)
        submit = WAIT.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="banner_link"]/div/div/form/button'))) #判斷搜索按鈕是否能點擊,這裡使用Xpath來尋找元素
        input.send_keys('蔡徐坤 籃球') #用send_keys()方法進行搜索輸入框中輸入內容
        submit.click() #點擊搜索!

        print('跳轉到新視窗')
        all_h = browser.window_handles #獲取所有視窗句柄
        browser.switch_to.window(all_h[1]) #switch_to.window 標簽頁跳轉

        get_source()
        total = WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR,"#server-search-app > div.contain > div.body-contain > div > div.page-wrap > div > ul > li.page-item.last > button"))) #等待載入後獲取所有頁數按鈕
        return int(total.text) #返回頁碼數量
    except TimeoutException:
        return seach()

def get_source():
    WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#server-search-app > div.contain > div.body-contain > div > div.result-wrap.clearfix'))) #堅持是否載入完所有搜索結果
    html = browser.page_source #page_source方法可以獲取到頁面源碼
    soup = BeautifulSoup(html,'lxml')
    save_to_excel(soup)

def save_to_excel(soup):
    #遍歷所有搜索信息 並保存
    list = soup.find(class_='all-contain').find_all(class_='info')
    for item in list:
        item_title = item.find('a').get('title')
        item_link = item.find('a').get('href')
        item_dec = item.find(class_='des hide').text
        item_view = item.find(class_='so-icon watch-num').text
        item_biubiu = item.find(class_='so-icon hide').text
        item_date = item.find(class_='so-icon time').text

        print('爬取:' + item_title)

        global n

        sheet.write(n, 0, item_title)
        sheet.write(n, 1, item_link)
        sheet.write(n, 2, item_dec)
        sheet.write(n, 3, item_view)
        sheet.write(n, 4, item_biubiu)
        sheet.write(n, 5, item_date)

        n = n + 1

def next_page(page_num):
    try:
        print('獲取下一頁數據')
        next_btn = WAIT.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#server-search-app > div.contain > div.body-contain > div > div.page-wrap > div > ul > li.page-item.next > button')))
        #等待載入 下一頁 按鈕
        next_btn.click() #點擊下一頁!
        WAIT.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#server-search-app > div.contain > div.body-contain > div > div.page-wrap > div > ul > li.page-item.active > button'),str(page_num)))
        #判斷某個元素中的text是否包含了預期的字元串
        get_source()

    except TimeoutException:
        browser.refresh() #刷新頁面
        return next_page(page_num)

def main():
    try:
        total = seach()

        for i in range(2,int(total+1)):
            next_page(i)

    finally:
        browser.close()
        browser.quit()

if __name__ == '__main__':
    main()
    book.save(u'蔡徐坤籃球.xls')  #在字元串前加r,聲明為raw字元串,這樣就不會處理其中的轉義了。否則,可能會報錯

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我們在這篇通過一個具體CQRS-Reader-Actor的例子來示範akka-persistence的query端編程和應用。在前面的博客里我們設計了一個CQRS模式POS機程式的操作動作錄入過程,並示範瞭如何實現CQRS的寫端編程。現在我們可以根據這個例子來示範如何通過CQRS的讀端reader- ...
  • 人生苦短 我選python 全民學python的熱潮已經開啟,然而,對於這種情況,還是有很多小伙伴私信我python到底該怎麼入門?沒接觸過編程能學會嗎? 現在網上學習資料一搜一大把,正因為資料多了導致我們不知道如何是好! 一個朋友問我:有個朋友要學習 python,她屬於那種特別能啃書的,讓我推薦 ...
  • 第1題: Python如何爬取 HTTPS 網站? 這類問題屬於簡單類問題 在使用 requests 前加入:requests.packages.urllib3.disable_warnings()。 為 requests 添加 verify=False 參數 導入ssl模塊 第2題: 函數參數傳遞 ...
  • 1 Object類的特點2 日期類:如何輸出當前的日期 日期的相關方法3 如何用System類獲取當前的毫秒值 1 Object toString方法 equals(); ***​ 1.1 概述 java.lang.Object java語言中的根類 所有類的父類 ​ 假如一個類沒有特別指定的父類 ...
  • synchronized的特性? synchronized的實現原理? synchronized是否可重入? synchronized是否是公平鎖? synchronized的優化? synchronized的五種使用方式? ...
  • 所屬網站分類: python基礎 > 語句 作者:goodbody 鏈接: http://www.pythonheidong.com/blog/article/10/ 來源:python黑洞網 www.pythonheidong.com 要瞭解yield它的作用,您必須瞭解生成器是什麼 迭代器 創建 ...
  • 前言 用戶定義的數據類型(data type)或類(class),是C++區別於傳統過程型語言的地方。 通常將創建好的類庫存放在庫(library)中。 本篇會使用幾個C++類庫(class libraries),如:一個很重要的標準庫是輸入/輸出流庫,可以用它從文件或鍵盤讀取數據,並且將數據寫入文 ...
  • Object類的toString方法 類Object是類層次結構的根類 每個都使用Object作為超類 所有對象都實現這個類的方法 Object類的equals方法 日期時間類 Date類 Date類的構造方法和成員方法 DateFormat類的format方法和parse方法 Calendar類的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...