經過之前的介紹,學會了requests,BeautifulSoup庫的簡單使用,現在將介紹selenium+chromedriver的方式來實現爬蟲
1.首先準備庫
pycharm的話在File->Settings->
然後
對了,在國內,可以設置鏡像,不然會很不方便,有時候安裝不上,有時候搜索不出來
鏡像:
https://mirrors.aliyun.com/pypi/simple/
https://pypi.tuna.tsinghua.edu.cn/simple/
設置鏡像如下
迴歸正題,如上方法安裝下面這幾個庫
2.準備chromedriver
對於chromedriver,百度chromedriver,下載對應你chrome瀏覽器版本的版本
比如我的瀏覽器版本
在淘寶鏡像下載,我選擇了81.4044.69相對接近我的版本,測試可用
下載之後,直接copy到你的python安裝路徑
方法不止這一種
還可以直接copy到你pycharm的project文件裏面
還可以設置環境變量
還可以在創建chromedriver對象的時候添加路徑參數
還可以…
作者推薦正使用的方法,一勞永逸
3.分析鬥魚的HTML框架
可以看到,每一個li就是一個主播
每個li裏面找到相應信息的位置
簡單分析完畢
4.終於可以擼代碼了
from selenium import webdriver # 用於創建瀏覽器對象
from selenium.webdriver.chrome.options import Options # 用於創建參數設置對象
from selenium.webdriver.common.by import By # 用於查找元素時的簡單
from selenium.webdriver.support.ui import WebDriverWait # 用於設置瀏覽器等待DOM對象創建完成之後再進行獲取
from selenium.webdriver.support import expected_conditions as EC # 同上
from bs4 import BeautifulSoup
import pandas
import time
import random
URL = 'https://www.douyu.com/directory/all'
driver = {}
op = {}
soup = {}
slogans = []
hotValues = []
names = []
zones = []
singleInfor = []
# 獲取網頁信息
def getInfor():
global op, driver, URL
# 打開網頁
op = Options()
# 爲設置對象添加屬性
op.add_argument('--window-size=1600,600')
# 這個參數爲了防止服務器在console查詢window.navigator.webdriver這個參數來識別是否使用selenium訪問
# 在正常情況下,該參數位undefined,但在使用了selenium之後會變爲true,對op設置以下參數會避免這個問題發生
# 同時,在chromeVer>=79版本,google修復非headless下window.navigator.webdriver爲undefined的問題
# 如果要爬的網站不行,可以試試回滾瀏覽器,然後再設置下面這句話
# 鬥魚沒有該反爬機制,故不用設置該參數
# op.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = webdriver.Chrome(options=op)
driver.get(URL)
# 每頁信息處理
def inforHandle():
global soup, zones, names, hotValues, slogans, singleInfor, driver
# 煲湯
soup = BeautifulSoup(driver.page_source, 'lxml')
# 找到每個主播的li標籤,這裏鬥魚是將每個主播所有信息放在一個li標籤裏面
soup = soup.find_all(class_='layout-Module-container layout-Cover ListContent')
for i in soup:
temp = i.find_all(class_='layout-Cover-item')
for j in temp:
zones.append(j.find(class_='DyListCover-zone').text)
slogans.append(j.find(class_='DyListCover-intro').text)
hotValues.append(j.find(class_='DyListCover-hot').text)
names.append(j.find(class_='DyListCover-user').text)
singleInfor.append(names)
singleInfor.append(hotValues)
singleInfor.append(zones)
singleInfor.append(slogans)
# 換頁
def nextPages():
for i in range(150):
inforHandle()
# 每次等待的時間用隨機數
sleepTime = round(random.random(), 1) + 2
print('已處理第', i, '頁...', '用時', sleepTime)
time.sleep(sleepTime)
# 這裏是等待下一頁按鈕加載完成時菜點擊
nextPage = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, '.dy-Pagination-next>.dy-Pagination-item-custom')))
nextPage.click()
# 存文件
def saveInCsv():
# 用pandas很方便,儲存也用方便的csv文件,到時候要再excel文件使用,可以在excel直接導入就行
df = pandas.DataFrame({'主播名': names, '分區': zones, '口號': slogans, '熱度': hotValues})
df.to_csv('text.csv', index=False, sep=',')
def main():
getInfor()
nextPages()
try:
main()
finally:
saveInCsv()
# 最開始寫第一頁時的測試函數
def test():
for i in range(len(names)):
for j in range(4):
print(singleInfor[j][i], end=' ')
print('\n', end='')
#關閉瀏覽器驅動
# driver.close()
代碼比較簡單,同時註釋比較詳細,特別說明一些代碼API
1.對於等待元素加載完畢的API
2.對於數據儲存
這裏使用了
pandas官方文檔
selenium官方文檔
最後,附上
爬取結果