一、介紹
用 Selenium 爬取網(wǎng)頁時,當(dāng)前訪問的 url 就是爬蟲當(dāng)中的目標(biāo) url,獲取內(nèi)容只要是頁面上可見的,都可以爬?。?mark>可見即可爬)。
步驟
Selenium + 瀏覽器 + 瀏覽器驅(qū)動
1、導(dǎo)入
2、url(找動態(tài) url,抓取到的數(shù)據(jù)是加密的)
3、獲取內(nèi)容,做解析
Selenium 是一個用于 Web 應(yīng)用程序測試的工具,最初是為網(wǎng)站自動化測試而開發(fā)的,Selenium 可以直接運行在瀏覽器上,它支持所有主流的瀏覽器,可以接收指令,讓瀏覽器自動加載頁面,獲取需要的數(shù)據(jù),甚至頁面截屏。
chromedriver 是一個驅(qū)動 Chrome 瀏覽器的驅(qū)動程序,使用它才可以驅(qū)動瀏覽器。
針對不同的瀏覽器有不同的 driver,但 Chrome 的兼容性最好。
二、對比
Ajax:可以使用網(wǎng)頁實現(xiàn)異步更新,可以在不重新加載整個網(wǎng)頁的情況下,對網(wǎng)頁的某部分進行更新。
1、獲取 Ajax 數(shù)據(jù)的方式
-
直接分析 Ajax 調(diào)用的接口,然后通過代碼請求這個接口。
-
使用 Selenium + chromedriver 模擬瀏覽器行為獲取數(shù)據(jù)。
2、獲取 Ajax 數(shù)據(jù)方式對比
方式 | 優(yōu)點 | 缺點 |
---|---|---|
找數(shù)據(jù)接口 | 直接可以請求到數(shù)據(jù),代碼量少,性能高 | 分析接口比較復(fù)雜,尤其通過 js 混淆的接口,容易被發(fā)現(xiàn)是爬蟲 |
Selenium | 直接模擬瀏覽器行為,瀏覽器能請求到的,使用 Selenium 也能請求到 | 代碼量多,性能低 |
三、安裝
1、驅(qū)動下載地址
下載 Chrome 驅(qū)動
下載 Firefox 驅(qū)動
2、安裝 Selenium 第三方庫(建議指定版本安裝)
pip install selenium==4.0.0a1
3、安裝驅(qū)動(Chrome 的兼容性最好,建議安裝 chromedriver)
- 先確定瀏覽器版本號
- 打開谷歌驅(qū)動下載地址
- 版本號前面三位對應(yīng)上就可以,最后一位建議選擇版本小的
- 按照電腦的系統(tǒng)來選擇下載(如果電腦是 windows-64 位,選 win32 就行)
- 驅(qū)動下載完成之后,將文件進行解壓,復(fù)制到 chromedriver.exe 到 Python 解釋器目錄下
終端輸入命令:where python 可以查看 Python 的安裝目錄
四、簡單使用
# 導(dǎo)入模塊,加載驅(qū)動
from selenium import webdriver
# 內(nèi)置庫
import time
# 加載驅(qū)動
drive = webdriver.Chrome()
# 窗口最大化
drive.maximize_window()
# 加載網(wǎng)站
drive.get('https://www.baidu.com')
# 代碼停3秒再運行
time.sleep(3)
# 關(guān)閉當(dāng)前的窗口
# drive.close() # 要打開多個窗口,關(guān)閉的是當(dāng)前的窗口
# 退出驅(qū)動
drive.quit() # 關(guān)閉所有窗口,退出瀏覽器
五、定位元素
# 導(dǎo)入模塊,加載驅(qū)動
from selenium import webdriver
# 定位元素
from selenium.webdriver.common.by import By
# 加載驅(qū)動
driver = webdriver.Chrome()
# 窗口最大化
driver.maximize_window()
# 加載網(wǎng)站
driver.get('https://www.baidu.com')
1、By.ID
根據(jù) id 來查找定位元素。
# find_element 找一個元素,find_elements 找多個
el = driver.find_element(By.ID, 'kw')
# 返回的是一個元素對象
print(el)
2、By.CLASS_NAME
通過 class 屬性值定位某個元素。
el = driver.find_element(By.CLASS_NAME, 's_ipt')
# 返回的是一個元素對象
print(el)
3、By.NAME
通過 name 屬性查找定位某個元素。
el = driver.find_element(By.NAME, 'wd')
# 返回的是一個元素對象
print(el)
4、By.TAG_NAM
通過標(biāo)簽定位元素。
input_tag = driver.find_elements(By.TAG_NAME, 'input')
# find_elements 定位元素,返回的數(shù)據(jù)類型是 list
print(input_tag)
5、By.XPATH
通過 xpath 語法定位元素。
el = driver.find_element(By.XPATH, '//input[@id="kw"]')
# 返回的是一個元素對象
print(el)
六、操作元素
1、在輸入框輸入內(nèi)容并搜索
# 內(nèi)置庫
import time
# 導(dǎo)入模塊,加載驅(qū)動
from selenium import webdriver
# 定位元素
from selenium.webdriver.common.by import By
# 加載驅(qū)動
driver = webdriver.Chrome()
# 窗口最大化
driver.maximize_window()
# 加載網(wǎng)站
driver.get('https://www.baidu.com')
# 定位到元素
el = driver.find_element(By.ID, 'kw')
# 元素輸入框里面輸入值
el.send_keys('唐僧')
# 等待2秒
time.sleep(2)
# 點擊元素
driver.find_element(By.ID, 'su').click()
# 清空內(nèi)容
el.clear()
2、打開網(wǎng)站搜索音樂并播放
# 內(nèi)置庫
import time
# 導(dǎo)入模塊,加載驅(qū)動
from selenium import webdriver
# 定位元素
from selenium.webdriver.common.by import By
# 操作鍵盤
from selenium.webdriver.common.keys import Keys
# 加載驅(qū)動
driver = webdriver.Chrome()
# 窗口最大化
driver.maximize_window()
# 加載網(wǎng)站
driver.get('https://music.163.com/')
# 搜索內(nèi)容
driver.find_element(By.ID, 'srch').send_keys('愿')
# 按回車鍵
driver.find_element(By.ID, 'srch').send_keys(Keys.ENTER)
# 等待2秒
time.sleep(2)
# 網(wǎng)頁里面嵌套了一個網(wǎng)頁,要進入該網(wǎng)頁才會獲取對應(yīng)的數(shù)據(jù)
driver.switch_to.frame('g_iframe')
# 播放按鈕
driver.find_element(By.ID, 'song_2010214999').click()
七、Cookie 操作
1、獲取所有的 Cookie
cookies = driver.get_cookies()
2、根據(jù) Cookie 的 name 獲取 Cookie
value = driver.get_cookie(name)
3、刪除某個 Cookie
driver.delete_cookie('key')
4、處理 Cookie
# 導(dǎo)入模塊,加載驅(qū)動
from selenium import webdriver
# 加載驅(qū)動
driver = webdriver.Chrome()
# 窗口最大化
driver.maximize_window()
# 加載網(wǎng)站
driver.get('https://www.baidu.com')
# 獲取百度的 cookie
cookies = driver.get_cookies()
# 返回的 list,列表里面嵌套的字典
print(cookies)
'''
通過程序拿到的 cookie 與頁面的是不一致,還需要做處理
只需要里面的兩個字段值,name 和 value
BAIDUID_BFESS=F875E52E04E65B3748D8FDDE2E25399E; ZFY=idY6KuND2T0e6ROY1txjofI8Nvn4lb6hXiw:BN2mgeaA:C
'''
for cookie in cookies:
print(cookie['name']+'='+ cookie['value'])
5、案例
模擬登錄 qq 空間
# 內(nèi)置庫
import time
# 導(dǎo)入模塊,加載驅(qū)動
from selenium import webdriver
# 定位元素
from selenium.webdriver.common.by import By
# 加載驅(qū)動
driver = webdriver.Chrome()
# 最大化窗口
driver.maximize_window()
# 加載網(wǎng)站
driver.get('https://i.qq.com/')
# 切換 iframe
driver.switch_to.frame('login_frame')
# 等待2秒
time.sleep(2)
# 點擊頭像進行登錄,獲取登錄之后的 cookie
driver.find_element(By.ID, 'img_out_1234567890').click()
# 等待2秒
time.sleep(2)
# 獲取 cookie
cookies = driver.get_cookies()
# 打印出的數(shù)據(jù)為列表
# print(cookies)
# 獲取的 cookie 需要處理
li = []
for cookie in cookies:
# 只需要每一組字典里面的 name value
li.append(cookie['name']+'='+cookie['value'])
# print(cookie)
# 處理好的 cookie
cookie = '; '.join(li)
print(cookie)
# 導(dǎo)入庫
import requests
# 確定 url, 靜態(tài)加載的
url = 'https://user.qzone.qq.com/1234567890'
# 設(shè)置請求頭參數(shù)
head = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36',
'cookie': cookie
}
# 發(fā)請求,獲取響應(yīng)
res = requests.get(url, headers=head)
# 獲取響應(yīng)內(nèi)容
# print(res.text)
# 寫入文件
with open('qq.html', 'w', encoding='utf-8') as f:
f.write(res.text)
八、Selenium 操作下拉菜單
select 元素不能直接點擊,因為點擊后還需要選中元素,這時候 selenium 就專門為 select 標(biāo)簽提供了一個類。
from selenium.webdriver.support.ui import Select
將獲取到的元素當(dāng)成參數(shù)傳到這個類中,創(chuàng)建這個對象后,就可以使用這個對象進行選擇了。
案例
目標(biāo)網(wǎng)站:https://news.sina.com.cn/
需求:選擇娛樂版塊,日期8號相關(guān)新聞
分析:
1、打開對應(yīng)網(wǎng)站
2、點擊下拉菜單,選擇對應(yīng)的版塊內(nèi)容
3、點擊日期圖標(biāo),選擇的日期是8號
# 內(nèi)置庫
import time
# 導(dǎo)入模塊,加載驅(qū)動
from selenium import webdriver
# 專門針對 Select 標(biāo)簽使用
from selenium.webdriver.support.ui import Select
# 定位元素
from selenium.webdriver.common.by import By
# 加載驅(qū)動
driver = webdriver.Chrome()
# 最大化窗口
driver.maximize_window()
# 加載網(wǎng)站
driver.get('https://news.sina.com.cn/')
# 解析,直接定位到 select 標(biāo)簽
el = driver.find_element(By.NAME, 'channel')
# print(el)
# 定位到娛樂的板塊,實例化 select 對象
select_tag = Select(el)
# 定位下拉框
# 方法一
# select_tag.select_by_index(4) # 下標(biāo)從0開始的
# 方法二
# select_tag.select_by_value('ent') # 根據(jù) option 里面 value 屬性定位的
# 方法三
select_tag.select_by_visible_text('娛樂') # text 指的是文本
# 等待1秒
time.sleep(1)
# 定位日期
driver.find_element(By.NAME, 'date').click()
# 選擇8號
driver.find_element(By.XPATH, '//div[@id="dataView"]/div/table/tbody/tr[2]/td[2]').click()
九、Selenium 鼠標(biāo)行為鏈
頁面中需要借助鼠標(biāo)操作元素,那么這時候可以使用鼠標(biāo)行為鏈類 ActionChains 來完成,比如現(xiàn)在要將鼠標(biāo)移動到某個元素上并執(zhí)行點擊事件。
學(xué)習(xí)文檔
1、常用方法
actions = ActionChains(driver) # 實例化?個?標(biāo)?為鏈的對象
actions.move_to_element(inputTag) # 將?標(biāo)移動到元素的中間
actions.send_keys_to_element(inputTag,'python') # 將鍵發(fā)送到元素
actions.move_to_element(submitTag) # 將?標(biāo)移動到元素的中間
actions.context_click() # 對元素執(zhí)?上下?單擊(右鍵單擊)
actions.click(submitTag) # 單擊?個元素
actions.perform() # 執(zhí)?所有存儲的操作
actions.lick_and_hold(element) # 點擊但不松開?標(biāo)
actions.double_click(element) # 雙擊
更多方法可參考
2、案例
目標(biāo)網(wǎng)站:https://passport.vip.com/login?src=https%3A%2F%2Fwww.vip.com%2F
需求:
1、加載網(wǎng)站
2、切換登錄方式
3、輸入賬號密碼,勾選協(xié)議,點擊登錄案例
4、鼠標(biāo)移動到對應(yīng)的驗證碼元素上面
# 內(nèi)置庫
import time
# 導(dǎo)入模塊,加載驅(qū)動
from selenium import webdriver
# 定位元素
from selenium.webdriver.common.by import By
# 導(dǎo)入鼠標(biāo)行為鏈
from selenium.webdriver import ActionChains
# 加載驅(qū)動
driver = webdriver.Chrome()
# 最大化窗口
driver.maximize_window()
# 加載網(wǎng)站
driver.get('https://passport.vip.com/login?src=https%3A%2F%2Fwww.vip.com%2F')
# 等待2秒
time.sleep(2)
# 切換登錄方式 —— 1、定位元素 2、點擊
driver.find_element(By.XPATH, '//div[@class="c-tab-nav "]/div[2]').click()
# 等待0.5秒
time.sleep(0.5)
# 輸入用戶名
driver.find_element(By.ID, 'J_login_name').send_keys('3424234234')
# 輸入密碼
driver.find_element(By.ID, 'J_login_pwd').send_keys('34234242')
# 等待0.5秒
time.sleep(0.5)
# 勾選協(xié)議
inputs = driver.find_element(By.ID, 'J_login_agree') # 定位到這個元素
# 通過 click 無法點擊成功,可以采用 js 點擊
driver.execute_script('arguments[0].click();', inputs)
# 登錄
driver.find_element(By.ID, 'J_login_submit').click()
# 等待1秒
time.sleep(1)
# 定位圖片
img = driver.find_element(By.CLASS_NAME, 'vipsc_qimg')
# 鼠標(biāo)移動
actions = ActionChains(driver)
actions.move_to_element(img) # 移動到目標(biāo)位置
# 提交行為鏈
actions.perform()
十、Selenium 切換頁面與操作多窗口
1、切換頁面
# 內(nèi)置庫
import time
# 導(dǎo)入模塊,加載驅(qū)動
from selenium import webdriver
# 加載驅(qū)動
driver = webdriver.Chrome()
# 最大化窗口
driver.maximize_window()
# 先模擬打開多個網(wǎng)站
driver.get('https://www.baidu.com') # 百度
time.sleep(3)
driver.execute_script('window.open("https://www.douban.com/")') # 豆瓣
time.sleep(3)
driver.execute_script('window.open("https://juejin.cn/")') # 掘金
time.sleep(3)
driver.execute_script('window.open("https://cloud.tencent.com/developer/ask/sof/1237007")') # 騰訊
time.sleep(3)
# 打印鼠標(biāo)聚焦的 url
# print(driver.current_url)
# 切換窗口
driver.switch_to.window(driver.window_handles[-3])
'''
0:https://www.baidu.com
1:https://cloud.tencent.com/developer/ask/sof/1237007
2:https://juejin.cn/
3:https://www.douban.com/
-1:https://www.douban.com/
-2:https://juejin.cn/
-3:https://cloud.tencent.com/developer/ask/sof/1237007
'''
# 打印鼠標(biāo)聚焦的 url
print(driver.current_url)
2、多窗口操作
# 內(nèi)置庫
import time
# 導(dǎo)入模塊,加載驅(qū)動
from selenium import webdriver
# 定位元素
from selenium.webdriver.common.by import By
# 加載驅(qū)動
driver = webdriver.Chrome()
# 最大化窗口
driver.maximize_window()
# 加載網(wǎng)站
driver.get('https://juejin.cn/')
# 等待2秒
time.sleep(2)
# 定位第二篇文章
driver.find_element(By.XPATH, '//div[@class="entry-list list"]/li[2]').click()
# 等待1秒
time.sleep(1)
# 切換窗口
driver.switch_to.window(driver.window_handles[1])
# 獲取 elements 內(nèi)容
te = driver.page_source
print(te)
十一、Selenium 高級操作
1、page_source:返回結(jié)構(gòu)的源碼
# 內(nèi)置庫
import time
# 導(dǎo)入模塊,加載驅(qū)動
from selenium import webdriver
# 加載驅(qū)動
driver = webdriver.Chrome()
# 最大化窗口
driver.maximize_window()
# 加載網(wǎng)站
driver.get('https://music.163.com/#/discover/toplist')
# 等待2秒
time.sleep(2)
# 切換到 iframe
driver.switch_to.frame('g_iframe')
# 等待2秒
time.sleep(2)
# 拿到的是 elements 里面的內(nèi)容,xpath 直接做解析就可以了
print(driver.page_source)
2、find():在源碼當(dāng)中查找某個字符的存在
# 內(nèi)置庫
import time
# 導(dǎo)入模塊,加載驅(qū)動
from selenium import webdriver
# 定位元素
from selenium.webdriver.common.by import By
# 加載驅(qū)動
driver = webdriver.Chrome()
# 最大化窗口
driver.maximize_window()
# 加載網(wǎng)站
driver.get('https://tieba.baidu.com/f?kw=%E8%8F%9C%E8%B0%B1&ie=utf-8&pn=11400')
# 等待2秒
time.sleep(2)
# # 獲取網(wǎng)頁源碼
# html = driver.page_source
# # 打印源碼
# print(html)
# # 看網(wǎng)頁源碼里是否存在下一頁
# print(driver.page_source.find('下一頁>'))
'''
如果沒有查找到對應(yīng)的字符,返回的是-1
如果查找到了,返回的是數(shù)字
'''
while True:
# 判斷源碼里存在下一頁時
if driver.page_source.find('下一頁>') != -1:
# 點擊下一頁的按鈕
driver.find_element(By.CLASS_NAME, 'next').click()
# 等待1秒
time.sleep(1)
# 源碼里不存在下一頁時,跳出循環(huán)
else:
print('已經(jīng)是最后一頁了')
break
3、By.LINK_TEXT:根據(jù)鏈接文本定位
# 內(nèi)置庫
import time
# 導(dǎo)入模塊,加載驅(qū)動
from selenium import webdriver
# 定位元素
from selenium.webdriver.common.by import By
# 加載驅(qū)動
driver = webdriver.Chrome()
# 最大化窗口
driver.maximize_window()
# 加載網(wǎng)站
driver.get('https://movie.douban.com/top250')
# 等待2秒
time.sleep(2)
# 獲取網(wǎng)頁源碼
html = driver.page_source
# 等待1秒
time.sleep(1)
# 根據(jù)鏈接文本定位,點擊‘后頁>’
driver.find_element(By.LINK_TEXT, '后頁>').click()
# 打印點擊‘后頁>’后的文本
print(driver.page_source)
4、get_attribute():獲取屬性值
# 內(nèi)置庫
import time
# 導(dǎo)入模塊,加載驅(qū)動
from selenium import webdriver
# 定位元素
from selenium.webdriver.common.by import By
# 加載驅(qū)動
driver = webdriver.Chrome()
# 最大化窗口
driver.maximize_window()
# 加載網(wǎng)站
driver.get('https://movie.douban.com/top250')
# 等待2秒
time.sleep(2)
# 獲取圖片標(biāo)簽
img_tag = driver.find_element(By.XPATH, '//div[@class="pic"]/a/img')
# 獲取屬性值 —— 通過方法
print(img_tag.get_attribute('src'))
5、.text:獲取節(jié)點內(nèi)容
# 內(nèi)置庫
import time
# 導(dǎo)入模塊,加載驅(qū)動
from selenium import webdriver
# 定位元素
from selenium.webdriver.common.by import By
# 加載驅(qū)動
driver = webdriver.Chrome()
# 最大化窗口
driver.maximize_window()
# 加載網(wǎng)站
driver.get('https://movie.douban.com/top250')
# 等待2秒
time.sleep(2)
# 獲取文本內(nèi)容
div_tag = driver.find_element(By.XPATH, '//div[@class="hd"]').text
# 打印文本內(nèi)容
print(div_tag)
十二、設(shè)置無界面
# 內(nèi)置庫
import time
# 導(dǎo)入模塊,加載驅(qū)動
from selenium import webdriver
# 定位元素
from selenium.webdriver.common.by import By
# 設(shè)置參數(shù)
options = webdriver.ChromeOptions()
# 設(shè)置無界面模式
options.add_argument('--headless')
# 傳遞參數(shù)
driver = webdriver.Chrome(options=options)
# 加載網(wǎng)站
driver.get('https://movie.douban.com/top250')
# 等待3秒
time.sleep(3)
# 獲取圖片標(biāo)簽
img_tag = driver.find_element(By.XPATH, '//div[@class="pic"]/a/img')
# 打印屬性值
print(img_tag.get_attribute('src'))
十三、頁面等待
1、強制等待
time.sleep(時間)
2、隱式等待
調(diào)用 driver.implicitly_wait ,針對所有元素,設(shè)置等待時間,如果等待時間內(nèi)加載出來,代碼繼續(xù)往下走,等待時間以內(nèi)不斷刷新看元素是否加載出來,超出則報出異常。
# 導(dǎo)入模塊,加載驅(qū)動
from selenium import webdriver
# 定位元素
from selenium.webdriver.common.by import By
# 加載驅(qū)動
driver = webdriver.Chrome()
# 加載網(wǎng)站
driver.get('https://www.baidu.com')
# 顯示等待,針對的全局元素
driver.implicitly_wait(10)
# 10秒內(nèi)出現(xiàn)代碼繼續(xù)往下走
driver.find_element(By.ID, 'kw').send_keys('python')
# 等待10秒不出現(xiàn)就會報錯
driver.find_element(By.ID, 'kw1').send_keys('python')
3、顯示等待
表明某個條件成立后才執(zhí)行獲取元素的操作,也可以在等待的時候指定一個最大的時間,如果超過這個時間那么就拋出一個異常。
# 顯示等待,需要導(dǎo)入模塊
# 導(dǎo)入 WebDriverWait 類
from selenium.webdriver.support.wait import WebDriverWait
# 導(dǎo)入 expected_conditions 模塊并使用別名 EC
from selenium.webdriver.support import expected_conditions as EC
# 導(dǎo)入模塊,加載驅(qū)動
from selenium import webdriver
# 定位元素
from selenium.webdriver.common.by import By
# 顯示等待,需要導(dǎo)入模塊
# 導(dǎo)入 WebDriverWait 類
from selenium.webdriver.support.wait import WebDriverWait
# 導(dǎo)入 expected_conditions 模塊并使用別名 EC
from selenium.webdriver.support import expected_conditions as EC
# 加載驅(qū)動
driver = webdriver.Chrome()
# 加載網(wǎng)站
driver.get('https://www.baidu.com')
# 默認是0.5秒刷新一次
# 等待時間總共是10秒,每隔1秒刷新一次
# until 具體的條件內(nèi)容
element = WebDriverWait(driver, 10, 1).until(
# 判斷元素是否加載出來
EC.presence_of_element_located((By.ID, 'kw'))
)
element.send_keys('hello')
隱式等待針對的是全局元素,全局生效,代碼簡單,只用于查找元素。
顯示等待有很多的判斷條件,適用范圍更廣,只針對某一個元素。
十四、案例
目標(biāo)網(wǎng)站: https://juejin.cn/
需求:爬取文章內(nèi)容,保存為 txt 格式,文件名以文章標(biāo)題命名
分析:
翻頁方式:滑動滾動條進行加載內(nèi)容
1、設(shè)置先滾動5次,先把下面的內(nèi)容加載出來,獲取元素
2、先獲取所有 li 元素,遍歷 li 元素,進行點擊操作文章來源:http://www.zghlxwxcb.cn/news/detail-726378.html
# 內(nèi)置庫
import time
# 加載驅(qū)動
from selenium import webdriver
# 定位元素
from selenium.webdriver.common.by import By
# 正則
import re
class JuJin(object):
# 定義初始化方法
def __init__(self):
# 實例屬性
# 加載驅(qū)動
self.driver = webdriver.Chrome()
# 窗口最大化
self.driver.maximize_window()
# 加載網(wǎng)站
self.driver.get('https://juejin.cn/')
# 解析數(shù)據(jù)
def parse_html(self):
# 等待2秒
time.sleep(2)
# 獲取 li 里的所有數(shù)據(jù)
lis = self.driver.find_elements(By.XPATH, '//div[@class="entry-list list"]/li')
# 循環(huán)處理數(shù)據(jù)
for li in lis:
# 捕獲異常
try:
# 等待2秒
time.sleep(2)
# 獲取文章標(biāo)題標(biāo)簽
a = li.find_element(By.CLASS_NAME, 'title')
# 點擊標(biāo)題標(biāo)簽進入詳情頁
self.driver.execute_script('arguments[0].click();', a)
# 切換窗口到內(nèi)容頁
self.driver.switch_to.window(self.driver.window_handles[1])
# 等待2秒
time.sleep(2)
# 獲取標(biāo)題標(biāo)簽
title = self.driver.find_elements(By.CLASS_NAME, 'article-title')
# 獲取文章內(nèi)容標(biāo)簽
contents = self.driver.find_elements(By.XPATH, '//div[@class="markdown-body cache"]/p')
# 判斷標(biāo)題是否是空列表,如果是空列表,說明文章是廣告文章
if not title:
# 獲取標(biāo)題標(biāo)簽
title = self.driver.find_elements(By.XPATH, '//a[@class="title"]/span')
# 獲取文章內(nèi)容標(biāo)簽
contents = self.driver.find_elements(By.XPATH, '//div[@class="markdown-body"]/p')
# 獲取標(biāo)題文本
titles = title[0].text
# 正則表達式替換標(biāo)題特殊字符
titles = re.sub(r'[,?/<>!: ()|"]', '', titles)
# 定義組裝數(shù)據(jù)的變量
s = ''
# 獲取數(shù)據(jù)為列表,需循環(huán)取出
for i in contents:
# 組裝數(shù)據(jù)
s += i.text + '\n'
# 打印文章標(biāo)題,內(nèi)容
# print(titles)
# 保存數(shù)據(jù)
self.save_data(titles, s)
# 關(guān)閉當(dāng)前窗口
self.driver.close()
# 切換窗口到列表頁
self.driver.switch_to.window(self.driver.window_handles[0])
# 等待1秒
time.sleep(1)
except Exception as e:
# 打印異常
print(e)
print("沒有文章內(nèi)容")
# 關(guān)閉當(dāng)前窗口
self.driver.close()
# 切換窗口到列表頁
self.driver.switch_to.window(self.driver.window_handles[0])
# 保存數(shù)據(jù)
def save_data(self, title, contents):
# 創(chuàng)建 txt 文本文檔
with open(f'掘金/{title}.txt', 'w', encoding='utf-8') as f:
# 文件寫入
f.write(contents)
# 滾動方法
def slide(self, height):
# 滑動滾動條
self.driver.execute_script(
f'window.scrollTo(0,{height})'
)
# 處理主邏輯
def main(self):
# 獲取窗口的高度
heights = self.driver.get_window_size()['height']
# 滑動次數(shù)
page = 1
# 滑動
while page <= 5:
self.slide(heights)
# 加高度
heights = heights + heights
# 滑動次數(shù)+1
page += 1
# 等待1秒
time.sleep(1)
# 解析數(shù)據(jù)
self.parse_html()
# 創(chuàng)建對象
data = JuJin()
# 調(diào)用 main 方法,開始執(zhí)行主程序
data.main()
記錄學(xué)習(xí)過程,歡迎討論交流,尊重原創(chuàng),轉(zhuǎn)載請注明出處~文章來源地址http://www.zghlxwxcb.cn/news/detail-726378.html
到了這里,關(guān)于爬蟲 — 自動化爬蟲 Selenium的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!