Selenium結(jié)合BeautifulSoup4編寫簡單的python爬蟲
在學(xué)會了抓包,接口請求(如requests庫)和Selenium的一些操作方法后,基本上就可以編寫爬蟲,爬取絕大多數(shù)網(wǎng)站的內(nèi)容。
在爬蟲領(lǐng)域,Selenium永遠(yuǎn)是最后一道防線。從本質(zhì)上來說,訪問網(wǎng)頁實(shí)際上就是一個(gè)接口請求。請求url后,返回的是網(wǎng)頁的源代碼。
我們只需要解析html或者通過正則匹配提取出我們需要的數(shù)據(jù)即可。
有些網(wǎng)站我們可以使用requests.get(url),得到的響應(yīng)文本中獲取到所有的數(shù)據(jù)。而有些網(wǎng)頁數(shù)據(jù)是通過JS動態(tài)加載到頁面中的。使用requests獲取不到或者只能獲取到一部分?jǐn)?shù)據(jù)。此時(shí)我們就可以使用selenium打開頁面來,使用driver.page_source來獲取JS執(zhí)行完后的完整源代碼。
例如,我們要爬取,diro官網(wǎng)女包的名稱,價(jià)格,url,圖片等數(shù)據(jù),可以使用requests先獲取到網(wǎng)頁源代碼:訪問網(wǎng)頁,打開開發(fā)者工具,我們可以看到所有的商品都在一個(gè)
標(biāo)簽里,展開這個(gè)li標(biāo)簽,我們可找到商品名稱,價(jià)格,url,圖片鏈接等信息從html格式的源碼中提取數(shù)據(jù),有多種選擇,可以使用xml.etree等等方式,bs4是一個(gè)比較方便易用的html解析庫,配合lxml解析速度比較快。
bs4的使用方法為
from bs4 import BeautifulSoupsoup = BeautifulSoup(網(wǎng)頁源代碼字符串,’lxml’)soup.find(...).find(...)soup.findall()soup.select(’css selector語法’)
soup.find()可以通過節(jié)點(diǎn)屬性進(jìn)行查找,如,soup.find(’div’, id=’節(jié)點(diǎn)id’)或soup.find(’li’, class_=’某個(gè)類名’)或soup.find(’標(biāo)簽名’, 屬性=屬性值),當(dāng)找到一個(gè)節(jié)點(diǎn)后,還可以使用這個(gè)節(jié)點(diǎn)繼續(xù)在其子節(jié)點(diǎn)中查找。soup.find_all()是查找多個(gè),同樣屬性的節(jié)點(diǎn),返回一個(gè)列表。soup.select()是使用css selector語法查找,返回一個(gè)列表。
以下為示例代碼:
from selenium import webdriverfrom bs4 import BeautifulSoupdriver = webdriver.Chrome()driver.get(’https://www.dior.cn/zh_cn/女士精品/皮具系列/所有手提包’)soup = BeautifulSoup(driver.page_source, ’lxml’)products = soup.select(’li.is-product’)for product in products: name = product.find(’span’, class_=’product-title’).text.strip() price = product.find(’span’, class_=’price-line’).text.replace(’¥’, ’’).replace(’,’,’’) url = ’https://www.dior.cn’ + product.find(’a’, class_=’product-link’).attrs[’href’] img = product.find(’img’).attrs[’src’] sku = img.split(’/’)[-1] print(name, sku, price)driver.quit()
運(yùn)行結(jié)果,如下圖:
注:本例中,也可以使用requests.get()獲取網(wǎng)頁源代碼,格式和使用selenium加載的稍有不同。
一般簡單爬蟲編寫的步驟為:
進(jìn)入列表頁,打開開發(fā)者工具,刷新頁面及向下滾動,查看新產(chǎn)品加載,是否能抓到XHR數(shù)據(jù)接口(直接返回JSON格式所有產(chǎn)品數(shù)據(jù)的接口) 如果有這種接口,嘗試修改參數(shù)中的分頁值,和請求總數(shù)值,看看是否能從一個(gè)接口返回所有的商品數(shù)據(jù) 如果只有Doc類型的接口返回頁面,嘗試使用requests.get()請求頁面,分析響應(yīng)文本,是否包含所有商品數(shù)據(jù) 如果requests獲取不到商品數(shù)據(jù)或數(shù)據(jù)不全可以使用selenium加載頁面,然后使用bs4解析提取,如果有多個(gè)頁面,循環(huán)逐個(gè)操作即可。以上就是Selenium結(jié)合BeautifulSoup4編寫簡單的python爬蟲的詳細(xì)內(nèi)容,更多關(guān)于python 爬蟲的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. CSS3實(shí)例分享之多重背景的實(shí)現(xiàn)(Multiple backgrounds)2. JavaScript多級判定代碼優(yōu)化淺析3. vue實(shí)現(xiàn)復(fù)制文字復(fù)制圖片實(shí)例詳解4. 不要在HTML中濫用div5. XML入門的常見問題(三)6. CSS Hack大全-教你如何區(qū)分出IE6-IE10、FireFox、Chrome、Opera7. XML入門的常見問題(四)8. chatGPT教我寫compose函數(shù)的詳細(xì)過程9. el-input無法輸入的問題和表單驗(yàn)證失敗問題解決10. 前端html+css實(shí)現(xiàn)動態(tài)生日快樂代碼
