1. 程式人生 > >用BeautifulSoup + selenium 寫簡單的爬蟲程式設計

用BeautifulSoup + selenium 寫簡單的爬蟲程式設計

我們以抓取選股寶網頁裡面的利好以及利空對應的股票名稱為例子

1、建立專案

        開啟PyCharm



2、新建py檔案



3、程式設計

    3.1 建立檔案函式

# 建立檔案函式 (檔案路徑,檔名)
def establish_file(file_path, file_name):
    # 檔案路徑
    path = file_path + file_name
    # 判斷檔案是否存在
    if os.path.exists(path):
        print(file_name + "檔案已存在,正在刪除...")
        # 刪除原有檔案
        os.remove(path)
        print("原有檔案已經刪除,正在重新建立檔案...")
    # 建立檔案(檔案路徑,開啟方式'w'只寫,編碼格式)
    f = io.open(path, 'w', encoding='utf-8')
    # 關閉檔案
    f.close()
    print("檔案建立成功!")

    3.2 資料寫入檔案

# 將獲取資料寫入檔案中(檔案路徑,檔名,資料)
def write_data(file_path, file_name, data):
    # 檔案路徑
    path = file_path + file_name
    # 開啟建立檔案(檔案路徑,開啟方式'a'追加,編碼格式)
    f = io.open(path, 'a', encoding='utf-8')
    print("正在寫入" + file_name + "...")
    # 資料寫入檔案
    f.write(data)
    print("寫入成功")
    # 關閉檔案
    f.close()

    3.3 爬蟲函式

        3.3.1 爬蟲自動開啟Chrome瀏覽器,並多次點選載入更多

話不多說,程式碼伺候

    Chrome_driver = webdriver.Chrome()     # 開啟瀏覽器
    Chrome_driver.maximize_window()        # 最大化瀏覽器
    Chrome_driver.get(url)                 # 開啟選股寶網站
    for i in range(0, n):                  # n次點選載入更多
        Chrome_driver.find_element_by_class_name("home-news-footer").click()  # 點選載入更多
        time.sleep(2)                      # 延時兩秒
    html = Chrome_driver.page_source       # 獲取網頁原始碼
    bsoup = BeautifulSoup(html, "lxml")    # 使用BeautifulSoup建立html程式碼的BeautifulSoup例項
    Chrome_driver.close()                  # 關閉瀏覽器

為什麼要點選載入更多呢?因為如果沒點選的話,網頁顯示的資料太少,如果只是獲取這麼少量的資料,那爬蟲就失去它存在的意義了,爬蟲就是為了代替人,去獲取海量資料而存在的一個工具。

為什麼要延時兩秒呢?因為如果你沒延時兩秒的話,你點選載入更多的速度就很快了喔,因為是以計算機的運算速度以及你當前網速的綜合速度去點選載入更多的,而選股寶這個網站檢測到你點選速度過快,它會停止你的訪問,因為它已經檢測到異常了。因此我們加上延時就能解決這個問題。

當你寫的爬蟲越來越複雜的時候,它也就越來越牛逼了,等你境界到了,甚至可以爬到你意想不到的東西喲~

        3.3.2 開啟Chrome瀏覽器,進行所需內容在網頁程式碼中的分析

            效果如下:


        3.3.3 獲取所需內容的例項

           滑鼠移至網頁程式碼中的<ul class="home-news-container" data-v-6e961e75="">,可以觀察到左邊視窗藍色區域是包含了我們要的內容的最小區域,它是由每一個標題及其內容組成的,而我們要的只是標題後面的標籤,以及下方股票的名字而已,看圖:


    # 獲取每一個標題物件
    informations = bsoup.find("ul", class_="home-news-container").findAll("li")

這句程式碼,就將ul中class叫"home-news-container"中的每一個“li”例項取出,並返回一個存放例項的列表。

            3.3.4 獲取利好、利空對應的股票名稱,並寫入檔案中

依然從Chrome瀏覽器來分析,定位你想要的內容在網頁程式碼中的位置的方法如下圖:


                定位我們要爬取的資料,以及獲得需要的引數


                    爬取過程的程式碼如下:

    # 迴圈判斷獲取每一個標題物件中的利好、利空標題物件
    for information in informations:
        # 獲取利好標籤
        label = information.find("span", class_="bullish-and-bear bullish")
        # 判斷標籤是否為空
        if label is not None:
            # 獲取當前標題物件中每一個利好股票物件
            shares = information.findAll("li", class_="stock-group-item")
            # 迴圈獲取每一個股票物件的資訊
            for share in shares:
                # 獲取當前股票物件中的股票名稱
                share_name = share.find("span", "stock-group-item-name").get_text()
                # 獲取當前股票物件中的股票漲幅
                share_number = share.find("span", "stock-group-item-rate").get_text()
                # 將股票名稱和股票漲幅整合為一條股票資料
                share_data = share_name + " " + share_number + "\n"
                # 將這一條股票資料寫入利好股票名單中
                write_data(file_path, file_name_bullish, share_data)
        else:
            # 獲取利空標籤
            label = information.find("span", class_="bullish-and-bear bear")
            # 判斷標籤是否為空
            if label is not None:
                # 獲取當前標題物件中每一個利空股票物件
                shares = information.findAll("li", class_="stock-group-item")
                # 迴圈獲取每一個股票物件的資訊
                for share in shares:
                    # 獲取當前股票物件中的股票名稱
                    share_name = share.find("span", "stock-group-item-name").get_text()
                    # 獲取當前股票物件中的股票跌幅
                    share_number = share.find("span", "stock-group-item-rate").get_text()
                    # 將股票名稱和股票跌幅整合為一條股票資料
                    share_data = share_name + " " + share_number + "\n"
                    # 將這一條股票資料寫入利好股票名單中
                    write_data(file_path, file_name_bear, share_data)
以上程式碼中的方法如果不清楚是如何使用,可以自己重新寫一個測試程式碼,或者網上一搜,也是很多人在解釋的。

    3.4 主函式

        主函式就是呼叫以上那些函式,也就是程式入口。

# 主函式
if __name__ == "__main__":
    # 設定將要爬取的網站的網址
    url = "https://xuangubao.cn/"
    # 設定檔案存放路徑
    file_path = "C:\\Users\\XXW\\Desktop\\Python工程\\"
    # 建立存放利好股票以及利空股票的兩個檔案
    establish_file(file_path, "利好股票名單.txt")
    establish_file(file_path, "利空股票名單.txt")
    # 執行爬蟲
    reptilian(url, 100, file_path,"利好股票名單.txt","利空股票名單.txt")

以上是程式碼分析,我們的爬蟲也就此寫出來,以下是整個爬蟲的程式碼:

from selenium import webdriver
from bs4 import BeautifulSoup
import os
import io
import time


# 建立檔案函式 (檔案存放路徑,檔名)
def establish_file(file_path, file_name):
    # 檔案路徑
    path = file_path + file_name
    # 判斷檔案是否存在
    if os.path.exists(path):
        print(file_name + "檔案已存在,正在刪除...")
        # 刪除原有檔案
        os.remove(path)
        print("原有檔案已經刪除,正在重新建立檔案...")
    # 開啟建立檔案(檔案路徑,開啟方式'w'只寫,編碼格式)
    f = io.open(path, 'w', encoding='utf-8')
    # 關閉檔案
    f.close()
    print("檔案建立成功!")


# 將獲取資料寫入檔案中(檔案存放路徑,檔名,資料)
def write_data(file_path, file_name, data):
    # 檔案路徑
    path = file_path + file_name
    # 開啟建立檔案(檔案路徑,開啟方式'a'追加,編碼格式)
    f = io.open(path, 'a', encoding='utf-8')
    print("正在寫入" + file_name + "...")
    # 資料寫入檔案
    f.write(data)
    print("寫入成功")
    # 關閉檔案
    f.close()


# 爬蟲函式(選股寶網址,點選n次載入更多,檔案存放路徑,利好檔名,利空檔名)
def reptilian(url,n,file_path,file_name_bullish,file_name_bear):
    Chrome_driver = webdriver.Chrome()     # 開啟瀏覽器
    Chrome_driver.maximize_window()        # 最大化瀏覽器
    Chrome_driver.get(url)                 # 開啟選股寶網站
    for i in range(0, n):                  # n次點選載入更多
        Chrome_driver.find_element_by_class_name("home-news-footer").click()  # 點選載入更多
        time.sleep(2)                      # 延時兩秒
    html = Chrome_driver.page_source       # 獲取網頁原始碼
    bsoup = BeautifulSoup(html, "lxml")    # 使用BeautifulSoup建立html程式碼的BeautifulSoup例項
    Chrome_driver.close()                  # 關閉瀏覽器
    # 獲取每一個標題物件
    informations = bsoup.find("ul", class_="home-news-container").findAll("li")
    # 迴圈判斷獲取每一個標題物件中的利好、利空標題物件
    for information in informations:
        # 獲取利好標籤
        label = information.find("span", class_="bullish-and-bear bullish")
        # 判斷標籤是否為空
        if label is not None:
            # 獲取當前標題物件中每一個利好股票物件
            shares = information.findAll("li", class_="stock-group-item")
            # 迴圈獲取每一個股票物件的資訊
            for share in shares:
                # 獲取當前股票物件中的股票名稱
                share_name = share.find("span", "stock-group-item-name").get_text()
                # 獲取當前股票物件中的股票漲幅
                share_number = share.find("span", "stock-group-item-rate").get_text()
                # 將股票名稱和股票漲幅整合為一條股票資料
                share_data = share_name + " " + share_number + "\n"
                # 將這一條股票資料寫入利好股票名單中
                write_data(file_path, file_name_bullish, share_data)
        else:
            # 獲取利空標籤
            label = information.find("span", class_="bullish-and-bear bear")
            # 判斷標籤是否為空
            if label is not None:
                # 獲取當前標題物件中每一個利空股票物件
                shares = information.findAll("li", class_="stock-group-item")
                # 迴圈獲取每一個股票物件的資訊
                for share in shares:
                    # 獲取當前股票物件中的股票名稱
                    share_name = share.find("span", "stock-group-item-name").get_text()
                    # 獲取當前股票物件中的股票跌幅
                    share_number = share.find("span", "stock-group-item-rate").get_text()
                    # 將股票名稱和股票跌幅整合為一條股票資料
                    share_data = share_name + " " + share_number + "\n"
                    # 將這一條股票資料寫入利好股票名單中
                    write_data(file_path, file_name_bear, share_data)


# 主函式
if __name__ == "__main__":
    # 設定將要爬取的網站的網址
    url = "https://xuangubao.cn/"
    # 設定檔案存放路徑
    file_path = "C:\\Users\\XXW\\Desktop\\Python工程\\"
    # 建立存放利好股票以及利空股票的兩個檔案
    establish_file(file_path, "利好股票名單.txt")
    establish_file(file_path, "利空股票名單.txt")
    # 執行爬蟲
    reptilian(url, 100, file_path,"利好股票名單.txt","利空股票名單.txt")

為什麼不寫成一個函式就好呢?弄這麼花裡胡哨的幹嘛?

        相信敲過一定量程式碼的人都知道,封裝成函式能提高你的程式碼的移植性(簡單來說就是複製到別的專案裡運用,還有更牛逼的封裝手段做成標頭檔案,這裡不就不介紹了),而且後期對工程專案的修改也是很有好處的,一個敲程式碼很優秀的人,他一定掌握了很牛逼的封裝技術,其實也是基本功。話有點多了,來吧,執行我們的爬蟲試試!!!

4、執行爬蟲

執行效果如下:


看利好股票名單:


看利空股票名單:


完美!!!這就是我們要的效果。至此,你會不會覺得爬蟲很好玩?這只是最簡單的,還有爬取圖片、爬取視訊這些騷操作呢!

由於小編也是初學者,若以上講解有誤的地方,歡迎大家指正,謝謝~