*嚴(yán)正聲明:本文僅限于技術(shù)討論與分享,嚴(yán)禁用于非法途徑。
目錄
準(zhǔn)備工具:
思路:
具體操作:
調(diào)用需要的庫(kù):
啟動(dòng)瀏覽器驅(qū)動(dòng):
代碼主體:
?完整代碼(解析注釋?zhuān)?/p>
準(zhǔn)備工具:
Python環(huán)境;
安裝selenium庫(kù);
Python編輯器;
待爬取的網(wǎng)站;
安裝好的瀏覽器;
與瀏覽器版本相對(duì)應(yīng)的瀏覽器驅(qū)動(dòng)。
思路:
使用Python打開(kāi)瀏覽器~~>>進(jìn)入待爬取的網(wǎng)站~~>>模擬用戶(hù)點(diǎn)擊文章~~>>跳轉(zhuǎn)至文章界面~~>>將文章界面數(shù)據(jù)保存下來(lái)~~>>關(guān)閉文章界面~~>>回到原網(wǎng)頁(yè)~~>>模擬用戶(hù)點(diǎn)擊下一個(gè)文章~~>>將第一頁(yè)全部爬取完畢~~>>模擬用戶(hù)點(diǎn)擊下一頁(yè)~~>>將所有爬取完畢關(guān)閉瀏覽器.
具體操作:
調(diào)用需要的庫(kù):
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
# 調(diào)用selenium庫(kù)通過(guò)驅(qū)動(dòng)瀏覽器,完全模擬瀏覽器的操作,像真正的用戶(hù)在操作一樣。
# webdriver調(diào)用驅(qū)動(dòng)
# By是selenium中內(nèi)置的一個(gè)class,在這個(gè)class中定位元素
啟動(dòng)瀏覽器驅(qū)動(dòng):
下載瀏覽器驅(qū)動(dòng):
chrome驅(qū)動(dòng)下載chromedriver.storage.googleapis.com/index.html
瀏覽器驅(qū)動(dòng)需要放在Python環(huán)境變量中
查看Python存放路徑
在命令行中輸入Python,進(jìn)入Python中
>>>?import?sys >>>?sys.path
或者命令行輸入where python
driver = webdriver.Chrome() # 選擇自己需要的瀏覽器驅(qū)動(dòng)進(jìn)行調(diào)用,這里使用的是Chrome驅(qū)動(dòng)
url = '' # 定義自己需要爬取的網(wǎng)站url
# headers = {"User-Agent":" Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"}
driver.get(url) # 使用Python打開(kāi)的瀏覽器訪問(wèn)網(wǎng)站
代碼主體:
range(1,5)設(shè)置循環(huán)次數(shù)為四次
使用selenium隱式等待:
當(dāng)查找元素或元素并沒(méi)有立即出現(xiàn)的時(shí)候,隱式等待將等待一段時(shí)間再查找
find_elements屬于selenium中復(fù)數(shù)的定位元素內(nèi)容。find_elements主要定位定位頁(yè)面上多個(gè)相同的元素坐標(biāo)。
By.CSS_SELECTOR? 可以通過(guò)多個(gè)屬性(比如有多個(gè)class的)進(jìn)行定位
'.listContent'? 包括所有需要爬取的文章
for page in range(1,5): time.sleep(1) driver.implicitly_wait(8) lis = driver.find_elements(By.CSS_SELECTOR,'.listContent')
try做異常處理
try: **** except Exception as e: print(e)
find_element定位方法和find_elements其實(shí)一樣的,只不過(guò)多了一個(gè)s相當(dāng)于定位多組
c = li.find_element(By.CLASS_NAME,'article_title') driver.execute_script('arguments[0].click();',c) # 模擬用戶(hù)進(jìn)行點(diǎn)擊,具體查找 # 如果直接使用 # li.find_element(By.CLASS_NAME,'article_title').click() # 可能會(huì)出現(xiàn)查找不到點(diǎn)擊對(duì)象
由于每次點(diǎn)擊都會(huì)打開(kāi)新的標(biāo)簽頁(yè),所以需要定義一個(gè)初始頁(yè)
original_window = driver.current_window_handle
切換到新打開(kāi)的標(biāo)簽頁(yè)
driver.switch_to.window(driver.window_handles[-1])
保存完畢后切換到初始頁(yè)
driver.switch_to.window(original_window)
打開(kāi)文件文件路徑;
打開(kāi)文件,并設(shè)置讀寫(xiě)權(quán)限(w覆蓋并寫(xiě)入,b二進(jìn)制數(shù)據(jù));文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-423402.html
write將數(shù)據(jù)寫(xiě)入文件,encode將數(shù)據(jù)進(jìn)行編碼文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-423402.html
get_html = "D:\Python文件\html\{}.html".format(b) f = open(get_html,'w+b') f.write(driver.page_source.encode())
for li in lis:
try:
b = li.find_element(By.CLASS_NAME,'article_title span').text
c = li.find_element(By.CLASS_NAME,'article_title')
driver.execute_script('arguments[0].click();',c)
original_window = driver.current_window_handle
driver.switch_to.window(driver.window_handles[-1])
time.sleep(1)
get_html = "D:\Python文件\html\{}.html".format(b)
f = open(get_html,'w+b')
f.write(driver.page_source.encode())
f.close()
driver.close()
driver.switch_to.window(original_window)
time.sleep(1)
except Exception as e:
print(e)
?完整代碼(解析注釋?zhuān)?/h2>
# 調(diào)用selenium庫(kù)通過(guò)驅(qū)動(dòng)瀏覽器,完全模擬瀏覽器的操作,像真正的用戶(hù)在操作一樣。
# webdriver調(diào)用驅(qū)動(dòng)
from selenium import webdriver
import time
# By是selenium中內(nèi)置的一個(gè)class,在這個(gè)class中有各種方法來(lái)定位元素
from selenium.webdriver.common.by import By
# 將Chrome驅(qū)動(dòng)調(diào)用,也可以換成其他瀏覽器驅(qū)動(dòng)
driver = webdriver.Chrome()
# 將要爬取的網(wǎng)站url
url = ''
# 有些需要headers,有些則不用
# headers = {"User-Agent":" Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"}
# 使用Chrome驅(qū)動(dòng)訪問(wèn)URL
driver.get(url)
# 這里進(jìn)入循環(huán),因?yàn)榫W(wǎng)站只有五頁(yè),所以循環(huán)五次;range()中填寫(xiě)想要循環(huán)的次數(shù),從一次到n次
for page in range(1,5):
# 剛進(jìn)入瀏覽器頁(yè)面需要睡一秒,網(wǎng)絡(luò)不穩(wěn)定可以多等幾秒
time.sleep(1)
# 進(jìn)入瀏覽器緩沖
driver.implicitly_wait(8)
# 定義一個(gè)函數(shù),查找全部需要爬取的內(nèi)容
lis = driver.find_elements(By.CSS_SELECTOR,'.listContent')
# 進(jìn)入循環(huán),循環(huán)爬取lis中的數(shù)據(jù)
for li in lis:
# 有時(shí)候會(huì)報(bào)錯(cuò),這里做了一個(gè)異常處理
try:
# 要將文件保存,定義name為爬取文章的名字,.text獲取文章鏈接中的文字
name = li.find_element(By.CLASS_NAME,'article_title span').text
# 模擬用戶(hù)點(diǎn)擊進(jìn)入文章
c = li.find_element(By.CLASS_NAME,'article_title')
# 有時(shí)候直接.click()會(huì)出現(xiàn)找不到數(shù)據(jù)的情況,這里具體指定一下
driver.execute_script('arguments[0].click();',c)
# 因?yàn)槊看吸c(diǎn)擊都會(huì)打開(kāi)新的標(biāo)簽頁(yè),這里定義首頁(yè)為原標(biāo)簽頁(yè)
original_window = driver.current_window_handle
# 爬取文章數(shù)據(jù)需要切換進(jìn)入新標(biāo)簽頁(yè)
driver.switch_to.window(driver.window_handles[-1])
# 等待一秒
time.sleep(1)
# 定義.html文件路徑,文件名為函數(shù)name
get_html = "D:\Python文件\html\{}.html".format(name)
# 打開(kāi)文件
f = open(get_html,'w+b')
# 將切換后的標(biāo)簽頁(yè)的數(shù)據(jù)寫(xiě)入文件
f.write(driver.page_source.encode())
# 關(guān)閉文件
f.close()
# 關(guān)閉切換的新標(biāo)簽頁(yè)
driver.close()
# 切換至原標(biāo)簽頁(yè)
driver.switch_to.window(original_window)
time.sleep(1)
# 異常處理
except Exception as e:
print(e)
# 模擬用戶(hù)點(diǎn)擊下一頁(yè),與上一個(gè)點(diǎn)擊事件原理一樣
r = driver.find_element(By.CLASS_NAME,'btn-next')
driver.execute_script('arguments[0].click();',r)
# 關(guān)閉瀏覽器
driver.quit()
# 調(diào)用selenium庫(kù)通過(guò)驅(qū)動(dòng)瀏覽器,完全模擬瀏覽器的操作,像真正的用戶(hù)在操作一樣。
# webdriver調(diào)用驅(qū)動(dòng)
from selenium import webdriver
import time
# By是selenium中內(nèi)置的一個(gè)class,在這個(gè)class中有各種方法來(lái)定位元素
from selenium.webdriver.common.by import By
# 將Chrome驅(qū)動(dòng)調(diào)用,也可以換成其他瀏覽器驅(qū)動(dòng)
driver = webdriver.Chrome()
# 將要爬取的網(wǎng)站url
url = ''
# 有些需要headers,有些則不用
# headers = {"User-Agent":" Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"}
# 使用Chrome驅(qū)動(dòng)訪問(wèn)URL
driver.get(url)
# 這里進(jìn)入循環(huán),因?yàn)榫W(wǎng)站只有五頁(yè),所以循環(huán)五次;range()中填寫(xiě)想要循環(huán)的次數(shù),從一次到n次
for page in range(1,5):
# 剛進(jìn)入瀏覽器頁(yè)面需要睡一秒,網(wǎng)絡(luò)不穩(wěn)定可以多等幾秒
time.sleep(1)
# 進(jìn)入瀏覽器緩沖
driver.implicitly_wait(8)
# 定義一個(gè)函數(shù),查找全部需要爬取的內(nèi)容
lis = driver.find_elements(By.CSS_SELECTOR,'.listContent')
# 進(jìn)入循環(huán),循環(huán)爬取lis中的數(shù)據(jù)
for li in lis:
# 有時(shí)候會(huì)報(bào)錯(cuò),這里做了一個(gè)異常處理
try:
# 要將文件保存,定義name為爬取文章的名字,.text獲取文章鏈接中的文字
name = li.find_element(By.CLASS_NAME,'article_title span').text
# 模擬用戶(hù)點(diǎn)擊進(jìn)入文章
c = li.find_element(By.CLASS_NAME,'article_title')
# 有時(shí)候直接.click()會(huì)出現(xiàn)找不到數(shù)據(jù)的情況,這里具體指定一下
driver.execute_script('arguments[0].click();',c)
# 因?yàn)槊看吸c(diǎn)擊都會(huì)打開(kāi)新的標(biāo)簽頁(yè),這里定義首頁(yè)為原標(biāo)簽頁(yè)
original_window = driver.current_window_handle
# 爬取文章數(shù)據(jù)需要切換進(jìn)入新標(biāo)簽頁(yè)
driver.switch_to.window(driver.window_handles[-1])
# 等待一秒
time.sleep(1)
# 定義.html文件路徑,文件名為函數(shù)name
get_html = "D:\Python文件\html\{}.html".format(name)
# 打開(kāi)文件
f = open(get_html,'w+b')
# 將切換后的標(biāo)簽頁(yè)的數(shù)據(jù)寫(xiě)入文件
f.write(driver.page_source.encode())
# 關(guān)閉文件
f.close()
# 關(guān)閉切換的新標(biāo)簽頁(yè)
driver.close()
# 切換至原標(biāo)簽頁(yè)
driver.switch_to.window(original_window)
time.sleep(1)
# 異常處理
except Exception as e:
print(e)
# 模擬用戶(hù)點(diǎn)擊下一頁(yè),與上一個(gè)點(diǎn)擊事件原理一樣
r = driver.find_element(By.CLASS_NAME,'btn-next')
driver.execute_script('arguments[0].click();',r)
# 關(guān)閉瀏覽器
driver.quit()
到了這里,關(guān)于Python爬蟲(chóng)入門(mén):使用selenium庫(kù),webdriver庫(kù)模擬瀏覽器爬蟲(chóng),模擬用戶(hù)爬蟲(chóng),爬取網(wǎng)站內(nèi)文章數(shù)據(jù),循環(huán)爬取網(wǎng)站全部數(shù)據(jù)。的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!