selenium抓取京東商品信息

導入必要的包

# 瀏覽器驅動
from selenium import webdriver
# 模擬鍵盤按鍵操作
from selenium.webdriver.common.keys import Keys
# 用於設置休眠和獲取時間
import time
# 數據庫相關
from sqlalchemy import create_engine, Integer,String,Float
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column

自動打開火狐瀏覽器

用火狐瀏覽器需將驅動設置爲webdriver.Firefox(),火狐瀏覽器驅動還需在GitHub下載geckodriver,並解壓到Anaconda3\Scripts目錄下(也可單獨添加到環境變量中),用於啓動瀏覽器

用谷歌瀏覽器同理,將驅動設置爲webdriver.Chrome()需下載,可以從chromium站點下載,同時添加到環境變量中

驅動版本一定要和瀏覽器版本相匹配

keyword='電腦'
driver=webdriver.Firefox()
# driver=webdriver.Chrome()
driver.get('https://www.jd.com')
key=driver.find_element_by_id('key')
key.send_keys(keyword)
key.send_keys(Keys.RETURN)

設置排序方式

可以設置按銷量排序,也可以不設置,直接綜合排序,按銷量排序時,應該等到出現限量按鈕纔可以點擊,可通過設置休眠時間解決。

# 按銷量排序
# 設置休眠時間
time.sleep(3)
sort_btn=driver.find_element_by_xpath('.//div[@class="f-sort"]/a[2]')
sort_btn.click()

獲取商品列表的長度

滑動到翻頁位置,用於模擬點擊下一頁

goods_list=driver.find_element_by_id('J_goodsList')
h=(goods_list.rect['y']+goods_list.rect['height'])
time.sleep(1)
driver.execute_script('window.scrollTo(0,%s)'%h)

獲取所有的商品標籤

products=driver.find_elements_by_class_name('gl-item')
len(products)
30

爬取第一件商品

可通過id,標籤,CSS,類選擇器獲取相關信息

time.sleep(3)
# 獲取商品sku
p=products[0]
sku=p.get_attribute('data-sku')
sku
'100012950122'

京東商品的連接可通過sku獲取,例如sku爲’100008348538’,該商品的鏈接爲https://item.jd.com/100008348538.html

格式爲https://item.jd.com/+sku+.html

# 爬取價格
price=p.find_element_by_class_name('p-price').text
price
'¥4489.00'
# 爬取名稱
name=p.find_element_by_css_selector('div.p-name').text
name
'聯想(Lenovo)天逸510S 英特爾酷睿i5 個人商務臺式機電腦主機(i5-9400 16G 1T+256G SSD WiFi Win10)23英寸'
# 爬取評價數量
commentcount=p.find_element_by_id('J_comment_%s'%sku).text
commentcount
'2700+'
# 爬取店鋪
shop=p.find_element_by_class_name('p-shop').text
shop
'聯想京東自營旗艦店'
# 爬取封面圖片
u=p.find_element_by_tag_name('img').get_attribute('src')
u
'https://img12.360buyimg.com/n7/jfs/t1/128291/24/552/56550/5eb65126E0f5ebeb1/fc0e83834d771cf8.jpg'
# 保存圖片
import urllib
urllib.request.urlretrieve(u,'img/'+sku+'.jpg')
('img/100012950122.jpg', <http.client.HTTPMessage at 0x188aa79f5c8>)

將數據存儲到數據庫

# 創建數據庫的連接
engine = create_engine("mysql+pymysql://root:[email protected]:3308/xymall?charset=utf8")
# 操作數據庫,創建一個session
Session = sessionmaker(bind=engine)
# 聲明一個基類
Base = declarative_base()
# 定義表結構
class jdPCTest(Base):
    __tablename__='jdPCTest'
    id = Column(Integer,primary_key=True,autoincrement=True)
    sku = Column(String(length=50),nullable=True)
    name = Column(String(length=500),nullable=False)
    price = Column(String(length=20),nullable=False)
    comment=Column(String(length=20),nullable=False)
    shop=Column(String(length=20),nullable=False)
    date=Column(String(length=20),nullable=False)
# 創建數據表
jdPCTest.metadata.create_all(engine)
mysqlSession=Session()
# 日期
date = time.strftime("%Y-%m-%d",time.localtime())
# 存儲的數據結構
data = jdPCTest(
    sku=sku,
    name=name,
    price=price,
    comment=commentcount,
    shop=shop,
    date=date
)
mysqlSession.add(data)
mysqlSession.commit()

本文件爲 jupyter Notebook導出文件,源文件可從碼雲下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章