哈嘍大家好,我是咸魚
好久沒更新 python 爬蟲相關的文章了,今天我們使用 selenium 模塊來簡單寫個爬蟲程式——爬取某東網商品資訊
網址鏈接:https://www.jd.com/
完整原始碼在文章最后
元素定位
我們需要找到網頁上元素的位置資訊(xpth 路徑)

我們首先需要知道搜索框和搜索按鈕的位置,然后才能把商品名字輸入到搜索框中并點擊收縮按鈕
打開 F12,通過開發者除錯工具檢查相應的的位置,可得如下 Xpath 運算式:
# 輸入框位置:
//*[@id="key"]
# 搜索按鈕位置:
//*[@class='form']/button
以 python 書籍為例

我們需要獲取商品的名字、價格、評價數量以及店鋪名


然后通過發者除錯工具檢查相應的的位置,可得如下 Xpath 運算式:
# 當前頁面商品串列
//*[@id="J_goodsList"]/ul/li
# 商品名字
.//div[@]/a/em | .//div[@]/a/em
# 商品價格
.//div[@]/strong
# 商品評價數量
.//div[@]/strong
#店鋪名字
.//div[@] | .//div[@]
請注意,我在定位商品名字 xpath 的時候用了或(|),這是因為我在爬取其他商品資訊的時候發現商品名字的 xpath 路徑有多個
.//div[@]/a/em 或 .//div[@]/a/em


商品店鋪名字同理
.//div[@] 或 .//div[@]
且多個 Xpath 路徑運算式可以同時使用,其語法如下:
xpath運算式1 | xpath運算式2 | xpath運算式3
實作了自動搜索后,接下來就是要抓取頁面中的商品資訊
需要注意的是你會發現只有將滑動條滾動至底部,商品才會全部加載完畢
我們還需要做個判斷,當爬取到最后一頁時,下一頁這個按鈕是點擊不了的,這時候就退出爬蟲程式

代碼實作
首先我們定義一個類 JdSpider,然后給它初始化物件
class JdSpider(object):
def __init__(self):
self.url = 'http://www.jd.com/'
self.options = webdriver.ChromeOptions()
self.options.add_argument('--headless') # 設定不顯示視窗
self.browser = webdriver.Chrome(options=self.options) # 創建瀏覽器物件
self.i = 0 # 計數,一共有多少件商品
然后是輸入商品名字點擊搜索按鈕的代碼實作
def get_html(self):
self.browser.get(self.url)
self.browser.find_element(By.XPATH, '//*[@id="key"]').send_keys('python書籍')
self.browser.find_element(By.XPATH, "//*[@class='form']/button").click()
獲取資訊
def get_data(self):
# 執行js陳述句,拉動進度條
self.browser.execute_script(
'window.scrollTo(0,document.body.scrollHeight)'
)
# 給頁面元素加載時預留時間
time.sleep(2)
# 用xpath提取每頁中所有商品,最終形成一個大串列 \
li_list = self.browser.find_elements(By.XPATH, '//*[@id="J_goodsList"]/ul/li')
for li in li_list:
# 構建空字典
item = {}
item['name']=li.find_element(By.XPATH, './/div[@]/a/em | .//div[@]/a/em').text.strip()
item['price']=li.find_element(By.XPATH, './/div[@]/strong').text.strip()
item['count']=li.find_element(By.XPATH, './/div[@]/strong').text.strip()
item['shop']=li.find_element(By.XPATH, './/div[@] | .//div[@]').text.strip()
print(item)
self.i += 1
入口函式
def run(self):
# 搜索出想要抓取商品的頁面
self.get_html()
# 回圈執行點擊“下一頁”操作
while True:
# 獲取每一頁要抓取的資料
self.get_data()
# 判斷是否是最一頁,-1說明沒找到,不是最后一頁,執行點擊 “下一頁” 操作
print(self.browser.page_source.find('pn-next disabled'))
if self.browser.page_source.find('pn-next disabled') == -1:
self.browser.find_element(By.CLASS_NAME, 'pn-next').click()
# 預留元素加載時間
time.sleep(1)
else:
print('數量', self.i)
break
跑一下看看


小伙伴們可以對爬取到的資料進行一下資料清洗處理等操作,就能夠進行資料分析了
原始碼如下:
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
class JdSpider(object):
def __init__(self):
self.url = 'http://www.jd.com/'
self.options = webdriver.ChromeOptions()
self.options.add_argument('--headless') # 無頭模式
self.browser = webdriver.Chrome(options=self.options) # 創建無界面引數的瀏覽器物件
self.i = 0 # 計數,一共有多少件商品
# 輸入地址+輸入商品+點擊按鈕,切記這里元素節點是京東首頁的輸入欄、搜索按鈕
def get_html(self):
self.browser.get(self.url)
self.browser.find_element(By.XPATH, '//*[@id="key"]').send_keys('python書籍')
self.browser.find_element(By.XPATH, "//*[@class='form']/button").click()
# 把進度條件拉倒最底部+提取商品資訊
def get_data(self):
# 執行js陳述句,拉動進度條件
self.browser.execute_script(
'window.scrollTo(0,document.body.scrollHeight)'
)
# 給頁面元素加載時預留時間
time.sleep(2)
# 用xpath提取每頁中所有商品,最終形成一個大串列 \
li_list = self.browser.find_elements(By.XPATH, '//*[@id="J_goodsList"]/ul/li')
for li in li_list:
# 構建空字典
item = {}
item['name']=li.find_element(By.XPATH, './/div[@]/a/em | .//div[@]/a/em').text.strip()
item['price']=li.find_element(By.XPATH, './/div[@]/strong').text.strip()
item['count']=li.find_element(By.XPATH, './/div[@]/strong').text.strip()
item['shop']=li.find_element(By.XPATH, './/div[@] | .//div[@]').text.strip()
print(item)
self.i += 1
def run(self):
# 搜索出想要抓取商品的頁面
self.get_html()
# 回圈執行點擊“下一頁”操作
while True:
# 獲取每一頁要抓取的資料
self.get_data()
# 判斷是否是最一頁,-1說明沒找到,不是最后一頁,執行點擊 “下一頁” 操作
print(self.browser.page_source.find('pn-next disabled'))
if self.browser.page_source.find('pn-next disabled') == -1:
self.browser.find_element(By.CLASS_NAME, 'pn-next').click()
# 預留元素加載時間
time.sleep(1)
else:
print('數量', self.i)
break
if __name__ == '__main__':
spider = JdSpider()
spider.run()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/554677.html
標籤:其他
下一篇:返回列表
