国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

爬蟲 — 自動化爬蟲 Selenium

這篇具有很好參考價值的文章主要介紹了爬蟲 — 自動化爬蟲 Selenium。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、介紹

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)

  • 先確定瀏覽器版本號

爬蟲自動化,爬蟲,爬蟲,python,selenium,自動化

爬蟲自動化,爬蟲,爬蟲,python,selenium,自動化

  • 打開谷歌驅(qū)動下載地址

爬蟲自動化,爬蟲,爬蟲,python,selenium,自動化

  • 版本號前面三位對應(yīng)上就可以,最后一位建議選擇版本小的

爬蟲自動化,爬蟲,爬蟲,python,selenium,自動化

  • 按照電腦的系統(tǒng)來選擇下載(如果電腦是 windows-64 位,選 win32 就行)

爬蟲自動化,爬蟲,爬蟲,python,selenium,自動化

  • 驅(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 元素,進行點擊操作

# 內(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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Python爬蟲技術(shù)系列-06selenium完成自動化測試V01

    Python爬蟲技術(shù)系列-06selenium完成自動化測試V01

    使用selenium庫完成動點擊下一頁,點擊視頻操作等過程, 如果你非要說這是XX,那我也不過多辯解,畢竟 批評不自由,贊美無意義 。 本案例僅是技術(shù)演示,所以會隱去相關(guān)網(wǎng)址等,讀者可以重點查看這里使用的selenium技術(shù)點即可。另外本版本為V01版本,所以僅僅是可用,很多

    2024年02月05日
    瀏覽(25)
  • 爬蟲實戰(zhàn)(一)Python+selenium自動化獲取數(shù)據(jù)存儲到Mysql中

    爬蟲實戰(zhàn)(一)Python+selenium自動化獲取數(shù)據(jù)存儲到Mysql中

    ??行話說得好,“爬蟲學(xué)得好,牢飯吃到飽!”哈哈博主是因這句話入的坑,不為別的就為邀大家一起鐵窗淚(bushi),本人雖小牛一只,但是喜愛搗鼓技術(shù),有興趣的小伙伴們可以共同探討,也歡迎各位大佬們的指點,愿共同進步! ??這次計劃是翻墻爬取外網(wǎng)某網(wǎng)站

    2024年01月17日
    瀏覽(34)
  • Python爬蟲框架之Selenium庫入門:用Python實現(xiàn)網(wǎng)頁自動化測試詳解

    Python爬蟲框架之Selenium庫入門:用Python實現(xiàn)網(wǎng)頁自動化測試詳解

    是否還在為網(wǎng)頁測試而煩惱?是否還在為重復(fù)的點擊、等待而勞累?試試強大的 Selenium !讓你的網(wǎng)頁自動化測試變得輕松有趣! Selenium 是一個強大的自動化測試工具,它可以讓你直接操控瀏覽器,完成各種與網(wǎng)頁交互的任務(wù)。通過使用 Python 的 Selenium 庫,你可以高效地實現(xiàn)

    2024年02月10日
    瀏覽(24)
  • 從零開始學(xué)習(xí)Python控制開源Selenium庫自動化瀏覽器操作,實現(xiàn)爬蟲,自動化測試等功能(一)

    從零開始學(xué)習(xí)Python控制開源Selenium庫自動化瀏覽器操作,實現(xiàn)爬蟲,自動化測試等功能(一)

    介紹Selenium : Selenium是一個用于自動化瀏覽器操作的開源工具和庫。它最初是為Web應(yīng)用測試而創(chuàng)建的,但隨著時間的推移,它被廣泛用于Web數(shù)據(jù)抓取和網(wǎng)頁自動化操作。Selenium 支持多種編程語言,包括Python,Java,C#等。 這里我們主要實現(xiàn)采用Python的方式 Selenium 的主要特點和

    2024年01月22日
    瀏覽(92)
  • 爬蟲 — 自動化爬蟲 Selenium

    爬蟲 — 自動化爬蟲 Selenium

    用 Selenium 爬取網(wǎng)頁時,當(dāng)前訪問的 url 就是爬蟲當(dāng)中的目標(biāo) url,獲取內(nèi)容只要是頁面上可見的,都可以爬?。?可見即可爬 )。 步驟 Selenium + 瀏覽器 + 瀏覽器驅(qū)動 1、導(dǎo)入 2、url(找動態(tài) url,抓取到的數(shù)據(jù)是加密的) 3、獲取內(nèi)容,做解析 Selenium 是一個用于 Web 應(yīng)用 程序測試

    2024年02月07日
    瀏覽(23)
  • 爬蟲-9-selenium自動化

    爬蟲-9-selenium自動化

    #所謂自動化,就是模擬人。去操作... #自動化需要瀏覽器驅(qū)動器,那么這個瀏覽器需要停止一下自動更新(減少麻煩)。 #以下都以谷歌瀏覽器為例。 #谷歌瀏覽器禁止更新詳見: https://blog.csdn.net/weixin_48337566/article/details/123242827 ? ? ?

    2024年01月19日
    瀏覽(23)
  • 自動化測試介紹、selenium用法(自動化測試框架+爬蟲可用)

    自動化測試介紹、selenium用法(自動化測試框架+爬蟲可用)

    1、什么是自動化測試? 程序測試程序、代碼代替思維、腳本代替人工 核心:質(zhì)量和效率 作用:降低成本、節(jié)省人力時間、推動CI和DevOps、準(zhǔn)確性和可靠性、模擬人工難以實現(xiàn)的手段、快速持續(xù)迭代發(fā)布能力、衡量產(chǎn)品的質(zhì)量、提升測試效率、提高測試覆蓋率 2、手工測試

    2024年03月08日
    瀏覽(39)
  • 爬蟲-selenium自動化(3)-驗證碼

    爬蟲-selenium自動化(3)-驗證碼

    #驗證碼分很多種,奇葩也無處不在:哪個是真茅臺,紅綠燈,摩托車......(我是個人都看不出來) (?ó﹏ò?) #本節(jié)內(nèi)容為selenium自動化實現(xiàn)驗證碼通過-------字符驗證碼,點觸驗證碼。 ? ? ? ? ? ?

    2024年01月21日
    瀏覽(23)
  • 網(wǎng)絡(luò)請求爬蟲【requests】和自動化爬蟲【selenium】

    在Python開發(fā)的爬蟲項目中, requests 和 selenium 是兩個常用的庫,它們各有特點和應(yīng)用場景。 相同點 數(shù)據(jù)抓?。?無論是 selenium 還是 requests ,兩者的基本目的都是為了從網(wǎng)絡(luò)上抓取數(shù)據(jù)。 自動化: 它們都能夠自動化地訪問網(wǎng)頁,獲取需要的信息。 不同點 工作原理: requests 直

    2024年02月20日
    瀏覽(27)
  • 使用Selenium模塊編寫自動化爬蟲程序

    使用Selenium模塊編寫自動化爬蟲程序可以實現(xiàn)更復(fù)雜的爬取操作,模擬瀏覽器的行為。以下是關(guān)于使用Selenium模塊編寫自動化爬蟲程序的總結(jié): 模擬瀏覽器行為:Selenium模塊可以模擬瀏覽器的行為,如點擊按鈕、填寫表單、滾動頁面等。這使得爬蟲可以處理需要交互操作或動態(tài)

    2024年02月07日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包