iT邦幫忙

0

selenium爬蟲使用xpath擷取dcard,fb,yt資料遇到的問題

這是我使用selenium來進行爬蟲的程式,query存放我想要存取的資料的xpath,利用迴圈一次抓取許多資料,而且我的程式碼也預設單一個xpath能夠找到多個元素。


from selenium import webdriver
import pyautogui
import time

options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
options.add_experimental_option("prefs", {"profile.password_manager_enabled": False, "credentials_enable_service": False})

PATH= "C:/Users/user/Desktop/chromedriver_win32/chromedriver.exe"
driver=webdriver.Chrome(PATH,chrome_options=options)
driver.get('https://www.google.com/')
driver.maximize_window()

class Web:
    #建構式
    def __init__(self,url):
       self.url=url
       driver.get(url)
    #走訪(遍歷)網頁的元素,並對其進行操作(爬取資料/填入資料/點擊/下載圖片)   
    def travel(self,q_list,operation):#q_list={'Xpath':[' '],...}
        for k,v in q_list.items():
            elements=driver.find_elements_by_xpath(k)
            if(operation=='get_data'):
                for elem in elements:                   
                    v.append(elem)

def dcard_article_operation(url):
    query={
        '//div[@class="eisivb-4 ggahOj"]':[],#發文者
        '//div[@class="sc-1eorkjw-4 boQZzA"]':[],#發文看板
        #'//div[@class="sc-1eorkjw-4 boQZzA"]':[],#發文時間
        '//div[@class="sc-93mv8i-1 gLjQTF"]':[],#影片
        '//div[@class="phqjxq-0 gFINpq"]/span':[],#文字
        '//div[@class="fiw2dr-2 dlNVms"]':[],#按讚留言數        
    }
    dcard=Web(url)
    dcard.travel(query,'get_data')
    number=1
    for k,v in query.items():
        print(number,':',k)
        for elm in v:
            print('*',elm.text)
        number+=1

def fb_article_operation(url):
    query={
        '//a[@role="link"]/strong/span':[],#發文者
        '//span[@class="pcp91wgn"]':[],#按讚數
        '//div[@tabindex="0"]/span[@dir="auto"]':[],#留言數
        '//div[@dir="auto"]':[],#留言-1(試試看兩種方法)
        '//div[@style="text-align: start;"]':[],#留言-2
        '//div[@dir="auto"]/span':[],#文章內文(段落) 
            }
    fb=Web(url)
    time.sleep(5)
    btn=driver.find_element_by_xpath('//a[@data-nocookies="1"]')#選取 "稍後觀看"
    btn.click()
    time.sleep(5)
    fb.travel(query,'get_data')
    number=1
    for k,v in query.items():
        print(number,':',k)
        for elm in v:
            print('*',elm.text)
        number+=1

def yt_videos_info(url):
    query={
        '//yt-formatted-string':[],#嘗試
        #'//yt-formatted-string[@class="style-scope ytd-video-primary-info-renderer"]':[],#影片名稱
        '//*[@class="style-scope ytd-video-primary-info-renderer"]':[],#
        '//yt-formatted-string[contains(text(),"info")]':[],#
        '//yt-formatted-string[@class="style-scope.ytd-video-primary-info-renderer"]':[],
        '//yt-formatted-string[@class="style-scope ytd-toggle-button-renderer style-text"]':[],#按讚數
        '//yt-formatted-string[@id="text"]':[],#
        '//yt-formatted-string[@aria-label]':[],#
        '//span[@class="view-count style-scope ytd-video-view-count-renderer"]':[],#觀看次數
        '//yt-formatted-string[@class="style-scope ytd-video-primary-info-renderer"]':[],#日期
        '//span[@class="style-scope yt-formatted-string"]':[],#留言數
        '//yt-formatted-string[@class="style-scope ytd-comment-renderer"]':[],#留言
    }
    yt=Web(url)
    yt.travel(query,'get_data')
    number=1
    for k,v in query.items():
        print(number,':',k)
        for elm in v:
            print('*',elm.text)
        number+=1

query={'':''}
dcard_article_operation('https://www.dcard.tw/f/youtuber/p/236946349')
fb_article_operation('https://www.facebook.com/gv.monthly/posts/10159881411168799')
yt_videos_info('https://www.youtube.com/watch?v=-GsSZi6S3KE&ab_channel=%E6%A3%AE%E7%BA%B3%E6%98%A0%E7%94%BB')

下面是程式碼執行測試出來的結果,我想問的是為什麼有一些xpath會找不到東西?以及有沒有更好的定位方式?另外,有時候測試,dcard的都沒問題,但yt fb的有時候跑不出東西(好像不是因為fb登入的問題)
ps:這是我第一次發問,如果我問的方式有不清楚的,歡迎指正。

c:/Users/user/hello-world/web-scrapy/class2.py
c:\Users\user\hello-world\web-scrapy\class2.py:13: DeprecationWarning: use options instead of chrome_options
  driver=webdriver.Chrome(PATH,chrome_options=options)

DevTools listening on ws://127.0.0.1:52770/devtools/browser/2c2df8dd-bfb4-4bdd-a33b-eac44b7af1fa
1 : //div[@class="eisivb-4 ggahOj"]
* 卡提斯
2 : //div[@class="sc-1eorkjw-4 boQZzA"]
* YouTuber
* 9月12日 00:44
3 : //div[@class="sc-93mv8i-1 gLjQTF"]
* 
4 : //div[@class="phqjxq-0 gFINpq"]/span
* 
* 看完勾惡幫主的最新影片
我對黑社會的印象整個大改觀了
感覺政府媒體有刻意把黑社會幫派給汙名化

裡面的黑幫大老經歷一個比一個還屌
每個人都有情有義有理
言論邏輯清晰
...(此項太長,故省略)

5 : //div[@class="fiw2dr-2 dlNVms"]
* 65
・回應 125
[9320:10904:0914/191138.940:ERROR:device_event_log_impl.cc(214)] [19:11:38.940] USB: usb_device_handle_win.cc:1048 Failed to read descriptor from node connection: 連結到系統的某個裝置失去作用。 (0x1F)
1 : //a[@role="link"]/strong/span
2 : //span[@class="pcp91wgn"]
3 : //div[@tabindex="0"]/span[@dir="auto"]
4 : //div[@dir="auto"]
5 : //div[@style="text-align: start;"]
6 : //div[@dir="auto"]/span
1 : //yt-formatted-string
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
2 : //*[@class="style-scope ytd-video-primary-info-renderer"]
3 : //yt-formatted-string[contains(text(),"info")]
4 : //yt-formatted-string[@class="style-scope.ytd-video-primary-info-renderer"]
5 : //yt-formatted-string[@class="style-scope ytd-toggle-button-renderer style-text"]
* 
* 
* 6805
* 215
6 : //yt-formatted-string[@id="text"]
* 
* 登入
* 
*
* 
* 
* 
* 
* 6805
* 215
* 分享
* 儲存
* 森纳映画
* 訂閱
* 森纳映画
* 老高與小茉 Mr & Mrs Gao
* 森纳映画
* 自说自话的总裁
* 森纳映画
* 森纳映画
* 森纳映画
* 森纳映画
* 森纳映画
7 : //yt-formatted-string[@aria-label]
* 
*
* 
* 6805
* 215
* 48.4萬 位訂閱者
8 : //span[@class="view-count style-scope ytd-video-view-count-renderer"]
* 觀看次數:524,784次
9 : //yt-formatted-string[@class="style-scope ytd-video-primary-info-renderer"]
* 【不止遊戲】第22期未解之謎?蘇聯迪亞特洛夫事件
* 2017年11月28日
*
*
* 本期承載KHOLAT烏拉爾山遊戲,講述來自真實的前蘇聯烏拉爾山迪亞特洛夫事件。

森納映畫官方頻道
本影片為《不止遊戲》節目海外版。
B站主頁:
*
11 : //yt-formatted-string[@class="style-scope ytd-comment-renderer"]
PS C:\Users\user\hello-world\web-scrapy> [16672:12544:0914/191326.587:ERROR:gpu_init.cc(441)] Passthrough is not supported, GL is disabled
請整理你的原始碼,不然,飄過的人應該不會只有我

1 個回答

0
海綿寶寶
iT邦大神 1 級 ‧ 2021-09-15 08:37:42
最佳解答

https://ithelp.ithome.com.tw/upload/images/20210915/200017878cN2byUMLP.png

另外
dcard,yt,fb 是三個不同的網站
而你碰到的可能是三個不同的原因
一次問一個網站
問題會比較收斂一點

我要發表回答

立即登入回答