但有時候
我們不想要讓它打開浏覽器去執行
能不能直接在代碼裡面運作呢
也就是說
有沒有一個無形的浏覽器呢
恩
phantomJS 就是
它是一個基于 WebKit 的浏覽器引擎
可以做到無聲無息的操作各種動态網站
比如 js,css選擇器,dom操作的
是以對于市面上大多通過 js 渲染的動态網站
難以解析的網站
想要爬取的話
就會使用到
selenium + phantomjs
那麼怎麼玩呢
在這個頁面可以看到
我們需要的資料有
名稱
視訊位址
描述
觀看次數
彈幕數量
釋出時間
待會我們就把這些資料都爬下來
分析完之後
就開始撸代碼了
首先我們要拿到浏覽器的對象
browser = webdriver.Chrome()
接着開始通路 b 站
browser.get("https://www.bilibili.com/")
擷取到b站首頁的輸入框和搜尋按鈕
input = WAIT.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#banner_link > div > div > form > input")))submit = WAIT.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="banner_link"]/div/div/form/button')))
在這裡的
WAIT.until(EC.presence_of_element_located...
就是等到這個元素可操作的時候才會繼續執行下一步
擷取到輸入框元素後輸入「蔡徐坤 籃球」
接着點選搜尋
input.send_keys('蔡徐坤 籃球')submit.click()
然而
不妙的事情發生了
b站彈出了一個登入框
正好擋住了我們要操作的搜尋
浏覽器自動點選搜尋之後
這個時候會彈出一個新的視窗
這個視窗裡的内容
就是我們要的搜尋結果
是以我們要讓我們目前的浏覽器對象擷取到目前的視窗
接着擷取到第一頁的所有資料
# 跳轉到新的視窗print('跳轉到新視窗')all_h = browser.window_handlesbrowser.switch_to.window(all_h[1])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)
擷取到總頁數之後
我們就開始循環
for i in range(2,int(total+1)):next_page(i)
如何擷取下一頁呢
當然是模拟點選「下一頁按鈕」的操作
我們擷取「下一頁按鈕」的元素
然後點選
點選之後判斷一下是否在我們目前的頁數
然後擷取資料
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)))get_source()
有時候可能網速卡
在刷到某一頁的時候資料加載不出來
可以來個異常捕獲
重新整理一下
再遞歸一下嘿嘿
except TimeoutException:browser.refresh()return next_page(page_num)
擷取資源很簡單
我們已經用 selenium 跳轉到我們要的頁面了
那麼就拿下目前頁面的源碼
然後用
來解析一下
最後把資料放到 excel 中
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_sourcesoup = 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').textitem_view = item.find(class_='so-icon watch-num').textitem_biubiu = item.find(class_='so-icon hide').textitem_date = item.find(class_='so-icon time').textprint('爬取:' + item_title)global nsheet.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
最後别忘了關閉浏覽器哦
finally:browser.close()
來運作一下項目吧
資料到手
哦~ 對了
不是說還有一個叫做 phantomjs 的麼?
簡單簡單
接下來我們就利用它來打造一個無痕的浏覽器
首先我們要下載下傳phantomjs
你可以到
http://phantomjs.org/download.html
這裡去下載下傳
下載下傳完之後你需要配置一下環境變量哦
接着回到我們的代碼
将 Chrome 換成 phantomjs
browser = webdriver.PhantomJS()
這次我們再來運作項目
這次就是真正的不會打開任何有界面的浏覽器了
看下我們抓到的資料
ok~