利用selenium和PhantomJS爬取優酷視頻動態最新評論數據

目前正在學python爬蟲,在網易上了很多課程,靜態網頁爬了許多,現在在極客學院學爬取動態網頁數據,第一次用selenium,折騰好好幾天,這里分享一下第一次獨立實戰(當然過程中百度以及看簡友的心德無數次了),讓各位同志以后別走我踩過的坑,以下是代碼,我都做了清晰的注釋

from selenium import webdriver
import re

from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import  time


import os


all_comments=[]先建一個空列表,用于接受爬取的文字


driver = webdriver.PhantomJS()這里我之前用的是chrome,調試好了換成了PhantomJs,速度快了一點
如果用chrome,要把下載的chromedriver.exe放在python的文件路徑下,
如圖,放好就可以直接用,我的chrome是最新版本的,沒問題,沒用網上說的舊版本,



YIJMB7X~{D8G~JA2_ZS32{O.png

driver.get('http://v.youku.com/v_show/id_XMTgxODg5NzM0MA==.htm')調用get方法,
進入網頁
driver.execute_script("window.scrollBy(0,3000)")這是下拉操作,進入網頁后會自己滾動到頁面下面,
這樣評論才能加載出來
time.sleep(3)python也挺累,還是讓他休息一下吧
driver.execute_script("window.scrollBy(0,5000)")具體下拉多少,要看自己的屏幕吧這個
time.sleep(3)

data= driver.find_element_by_class_name('comments')
這里搞了我很久,一直找不到評論的所在,查了很久文檔,對先抓大后抓先深感為然,
不然你直接匹配評論內容是找不到的,這個是先匹配到最新評論的div,
找到所有評論的框架先,這樣動態數據才能加載出來,如圖,所有最新評論都在一個class=commens的div中,
為了剔除第一頁的最熱評論,又折騰了好久...
Paste_Image.png

time.sleep(3)
we_data=driver.page_source這句話一定要有,不然第一頁的評論就抓不出來,因為要抓多頁,
所以要給第一頁抓到的頁面賦一個變量

tr1 = r'<div class="comments".*</div>'此正則找到最新評論所在的區域,別問為啥還要再找一次,
剛剛不是用find_element找了一次嗎,其實我也希望大神告訴我,上面那句為何那么關鍵......

tr2 = r'<p id="content_\d\d\d\d\d\d\d\d\d\d">(.*?)<br'此正則匹配最新評論的文字內容
comments1 = str(re.findall(tr1,we_data,re.S))#先轉化為字符串,不然下面的正則用不了,
,這樣就找到最新的評論所在的div,再用正則一條一條匹配就好了

comments2 = re.findall(tr2,comments1, re.S)匹配div里面評論的文字內容

print(comments2)
all_comments.extend(comments2)把找到的內容添加進去
# print(len(chinese2))
#
# for each in chinese2:
#     print(each)

接下來就簡單了,重復這個步驟就好了,不然要添加一句click(),
就是讓selenium模擬人工點擊第二頁,然后復制以上步驟抓取第二頁評論就好了


time.sleep(2)
driver.find_element_by_xpath('//*[@id="qPager_2"]/ul[2]/li[2]/a').click()
這個xpath我是直接在瀏覽器復制的,親測可用
time.sleep(2)
driver.execute_script("window.scrollBy(0,2000)")
time.sleep(3)
driver.execute_script("window.scrollBy(0,4000)")
time.sleep(3)
data2= driver.find_element_by_class_name('comments')
#print(driver.page_source)
we_data=driver.page_source

tr1 = r'<div class="comments".*</div>'

tr2 = r'<p id="content_\d\d\d\d\d\d\d\d\d\d">(.*?)<br'
comments1 = str(re.findall(tr1,we_data,re.S))

comments2 = re.findall(tr2,comments1, re.S)

print(comments2)#這樣就抓到第二頁評論了,第三第四同理,這里不做研究了

all_comments.extend(comments2)
print(all_comments)
with open('優酷網錦繡未央評論.txt', 'w', encoding='utf-8') as f:
    for content in all_comments:
        f.write(str(content).replace('\\n',''))#里面很多換行符,要做數據清理
        f.write('\n')#每寫入一條評論間隔一行

如圖是各個comments的輸出
driver.quit()
Paste_Image.png

爬取的結果如圖所示

Paste_Image.png

里面一些評論有鏈接的,應該是某某回復誰誰的,這個坑以后再填吧,現在的功力不行啊,哪位大神會的也可以指點一下我,有點累,那個字符串后面的\xa0還沒清理,不過應該也不難,最后感謝一下
簡友韓大熊寶要姓張,最后又什么問題可以聯系我啊,QQ810833835,目前正在努力學pyhthon爬蟲,打算轉行,路漫漫其修遠兮啊

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容