Py / 透過selenium-webdriver爬youtube的介紹資訊(2021/10/28修改)

原本是透過Python 跟 selenium-webdriver抓取Html

但是後來網頁原始檔都變成JavaScript程式碼

影片資訊是寫在< meta name=’description’ content=’影片資訊’>

於是改變搜尋的方式

利用 find_element_by_xpath 定位搜尋頁面元素

tagX = browser.find_element_by_xpath("//meta[@name='description']") # meta標籤 name屬性值為'description'的元素
#tag = browser.find_element_by_id('description') #資訊所在的DIV id 現在不能直接抓Html
#print(tagX.get_attribute("content")) #取出其中的content屬性值
tag = tagX.get_attribute("content")
tag2 = tag.replace('\n','').replace('\r','') #用空字串取代所有換行符號 ,不能用strip刪除
#tag2=tag.text.replace('\n','').replace('\r','') #用空字串取代所有換行符號 ,不能用strip刪除

 

這次是要抓之前計畫放在youtube示例影片的介紹資訊

其實也是透過Python來爬資料

 

由於youtube很多內容是寫在JavaScript裡

 

用內容-檢查的方式找到的html標籤是 id名稱為 description的DIV

 

如果是用requests 跟 BeautifulSoup會爬不到這個DIV

嘗試抓取script

只能抓到整個script,之後的資料清理就會卡住

應該也有抓取、清理JavaScript資料內容的方式

因為其實內容是 json的格式

但是我還沒找到看得懂的教學,之後再嘗試看看

於是改用selenium-webdriver的方式

先讓瀏覽器載完html資料之後,這樣就能順利抓到內容資訊所在的DIV

完成之後的程式碼如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
from selenium import webdriver
import time
#chromedriver.exe執行檔所存在的路徑  須配合電腦上的chrome版本
# chrome_path =r"C:\Users\trico\Desktop\chromedriver\chromedriver.exe"
chrome_path =r"D:\chromedriver_win32\chromedriver.exe"  
options = webdriver.ChromeOptions() #透過options紀錄webdriver.ChromeOptions()的設定
options.add_argument("--headless") #增加啟動參數,瀏覽器頁面不可視化(背景執行)
browser = webdriver.Chrome(chrome_path,options=options) #webdriver.Chrome的設定選項
# browser = webdriver.Chrome(chrome_path)
#讀取資料
f = open("url.csv","r") #如果檔案編碼是utf-8 要再加上 ,encoding="utf-8"
s = f.readlines()
c = "科目,示例名稱,網址,介紹\n" #設定寫出檔案的第一行
for i in range(1,len(s)):
    url=s[i]
    list=url.split(",") #分割串列
#     print(list[2].replace('\n','')) #第3筆是最後1筆資料會有換行符號,須去掉
    browser.get(list[2].replace('\n','')) #載入網址
    time.sleep(3) #等待3秒載入網頁
    tag = browser.find_element_by_id('description') #資訊所在的DIV id
    tag2=tag.text.replace('\n','').replace('\r','') #用空字串取代所有換行符號 ,不能用strip刪除
#     print(tag2)
#     print(len(tag2))  
#     因為沒有資訊也同樣能抓到空字串,不會出現錯誤
#     try: 
#         tag = browser.find_element_by_id('description')
#         tag2=tag.text.replace('\n', '').replace('\r', '') 
#         c +="{},{},{},{}".format(list[0],list[1],list[2],tag2)
#         print(c)
#     except:
#         c +="{},{},{},{}".format(list[0],list[1],list[2],"無說明")
#         continue
#         print(c)
#      改用 if判斷 len(tag2)是否>0
    if i < len(s)-1: #如果不是最後一筆才加分行符號
        if len(tag2) > 0 :
            #print(tag2)
            c +="{},{},{},{}\n".format(list[0],list[1],list[2].replace('\n',''),tag2)
        else:
            tag2="無內容資訊"
            c +="{},{},{},{}\n".format(list[0],list[1],list[2].replace('\n',''),tag2)
            #print(tag2)
    else:
        if len(tag2) > 0 :
            #print(tag2)
            c +="{},{},{},{}".format(list[0],list[1],list[2].replace('\n',''),tag2)
        else:
            tag2="無內容資訊"
            c +="{},{},{},{}".format(list[0],list[1],list[2].replace('\n',''),tag2)
            #print(tag2)
#寫出資料
fw=open("c.txt","w",encoding="utf8")
fw.write(c)
fw.close()
#print(c)
browser.close() #關閉 瀏覽器
print("完成")

 

除了 selenium-webdriver之外,也用到time外掛程式來設定間隔時間,讓網頁有時間可以載入

selenium本身也是可以設定等待時間,但是我看不懂說明

於是還是土法煉鋼讓程式直接停止3秒再繼續

細節都寫在程式碼註解了,整體流程大致有四個部分

1.透過 selenium-webdriver 載入網頁並下載頁面原始檔

url.csv的資料結構,網址是第3欄 ( list[2] )

2.利用browser.find_element_by_id取得內容資訊所在的DIV

3.取出資料內容與資料清理

取出的字串有很多換行符號,一開始使用strip的方式來刪除,但都是失敗

後來谷狗大神說字串內只能取代,於是用replace的方式將所有換行符號取代為空字串

4.寫出資料

python在windows系統寫出檔案時,是透過cmd(命令提示字元)執行,而cmd預設的編碼是ANSI

所以當寫出的字串之中有無法在ANSI編碼時,寫出就會出現錯誤

比較好的方式是以UTF-8編碼寫出資料

但是,如果寫出檔案採用CSV,並且用excel開啟時就會出現亂碼

同樣是因為excel預設ANSI編碼

解決方式有3種

4-1用記事本另存成ANSI,再用excel開啟

4-2不要直接用excel開啟,而是先開新的excel空白活頁簿,再到資料分頁→取得外部資料-從文字檔,再依據匯入字串精靈的引導步驟匯入

4-3直接寫出純文字檔(*.txt)再用記事本開啟,或者用記事本開啟csv檔

 

參考資料

selenium啓動Chrome的進階配置參數

【Selenium學習筆記】測試中如何設定等待時間

Python中字符串String去除出换行符和空格的问题(\n,\r)

[EXCEL] Excel打開是亂碼?快速找回資料的最好方法!