Selenium結合BeautifulSoup4編寫簡單的python爬蟲
在學會了抓包,介面請求(如requests庫)和Selenium的一些操作方法後,基本上就可以編寫爬蟲,爬取絕大多數網站的內容。
在爬蟲領域,Selenium永遠是最後一道防線。從本質上來說,訪問網頁實際上就是一個介面請求。請求url後,返回的是網頁的原始碼。
我們只需要解析html或者通過正則匹配提取出我們需要的資料即可。
有些網站我們可以使用requests.get(url),得到的響應文字中獲取到所有的資料。而有些網頁資料是通過JS動態載入到頁面中的。使用requests獲取不到或者只能獲取到一部分資料。
此時我們就可以使用selenium開啟頁面來,使用driver.page_source來獲取JS執行完後的完整原始碼。
例如,我們要爬取,diro官網女包的名稱,價格,url,圖片等資料,可以使用requests先獲取到網頁原始碼:
訪問網頁,開啟開發者工具,我們可以看到所有的商品都在一個
- 標籤裡,展開這個li標籤,我們可找到商品名稱,價格,url,圖片連結等資訊
從html格式的原始碼中提取資料,有多種選擇,可以使用xml.etree等等方式,bs4是一個比較方便易用的html解析庫,配合lxml解析速度比較快。
bs4的使用方法為
from bs4 import BeautifulSoup soup = BeautifulSoup(網頁原始碼字串,'lxml') soup.find(...).find(...) soup.findall() soup.select('css selector語法')
soup.find()可以通過節點屬性進行查詢,如,soup.find('div',id='節點id')或soup.find('li',class_='某個類名')或soup.find('標籤名',屬性=屬性值),當找到一個節點後,還可以使用這個節點繼續在其子節點中查詢。
soup.find_all()是查詢多個,同樣屬性的節點,返回一個列表。
soup.select()是使用css selector語法查詢,返回一個列表。
以下為示例程式碼:
from selenium import webdriver from bs4 import BeautifulSoup driver = 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()
執行結果,如下圖:
注:本例中,也可以使用requests.get()獲取網頁原始碼,格式和使用selenium載入的稍有不同。
一般簡單爬蟲編寫的步驟為:
- 進入列表頁,開啟開發者工具,重新整理頁面及向下滾動,檢視新產品載入,是否能抓到XHR資料介面(直接返回JSON格式所有產品資料的介面)
- 如果有這種介面,嘗試修改引數中的分頁值,和請求總數值,看看是否能從一個介面返回所有的商品資料
- 如果只有Doc型別的介面返回頁面,嘗試使用requests.get()請求頁面,分析響應文字,是否包含所有商品資料
- 如果requests獲取不到商品資料或資料不全可以使用selenium載入頁面,然後使用bs4解析提取,如果有多個頁面,迴圈逐個操作即可。
以上就是Selenium結合BeautifulSoup4編寫簡單的python爬蟲的詳細內容,更多關於python 爬蟲的資料請關注我們其它相關文章!