哈嘍大家好,我是鹹魚 好久沒更新 python 爬蟲相關的文章了,今天我們使用 selenium 模塊來簡單寫個爬蟲程式——爬取某東網商品信息 網址鏈接:https://www.jd.com/ 完整源碼在文章最後 ## 元素定位 我們需要找到網頁上元素的位置信息(xpth 路徑) ![image]( ...
哈嘍大家好,我是鹹魚
好久沒更新 python 爬蟲相關的文章了,今天我們使用 selenium 模塊來簡單寫個爬蟲程式——爬取某東網商品信息
網址鏈接:https://www.jd.com/
完整源碼在文章最後
元素定位
我們需要找到網頁上元素的位置信息(xpth 路徑)
我們首先需要知道搜索框和搜索按鈕的位置,然後才能把商品名字輸入到搜索框中並點擊收縮按鈕
打開 F12,通過開發者調試工具檢查相應的的位置,可得如下 Xpath 表達式:
# 輸入框位置:
//*[@id="key"]
# 搜索按鈕位置:
//*[@class='form']/button
以 python 書籍為例
我們需要獲取商品的名字、價格、評價數量以及店鋪名
然後通過發者調試工具檢查相應的的位置,可得如下 Xpath 表達式:
# 當前頁面商品列表
//*[@id="J_goodsList"]/ul/li
# 商品名字
.//div[@class="p-name"]/a/em | .//div[@class="p-name p-name-type-2"]/a/em
# 商品價格
.//div[@class="p-price"]/strong
# 商品評價數量
.//div[@class="p-commit"]/strong
#店鋪名字
.//div[@class="p-shopnum"] | .//div[@class="p-shop"]
請註意,我在定位商品名字 xpath 的時候用了或(|),這是因為我在爬取其他商品信息的時候發現商品名字的 xpath 路徑有多個
.//div[@class="p-name"]/a/em 或 .//div[@class="p-name p-name-type-2"]/a/em
商品店鋪名字同理
.//div[@class="p-shopnum"] 或 .//div[@class="p-shop"]
且多個 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[@class="p-name"]/a/em | .//div[@class="p-name p-name-type-2"]/a/em').text.strip()
item['price']=li.find_element(By.XPATH, './/div[@class="p-price"]/strong').text.strip()
item['count']=li.find_element(By.XPATH, './/div[@class="p-commit"]/strong').text.strip()
item['shop']=li.find_element(By.XPATH, './/div[@class="p-shopnum"] | .//div[@class="p-shop"]').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[@class="p-name"]/a/em | .//div[@class="p-name p-name-type-2"]/a/em').text.strip()
item['price']=li.find_element(By.XPATH, './/div[@class="p-price"]/strong').text.strip()
item['count']=li.find_element(By.XPATH, './/div[@class="p-commit"]/strong').text.strip()
item['shop']=li.find_element(By.XPATH, './/div[@class="p-shopnum"] | .//div[@class="p-shop"]').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()