selenium+sqlalchemy 爬取京东商品信息并存入MySQL

  • Post author:
  • Post category:mysql




导入必要的包

# 浏览器驱动
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:123456@127.0.0.1: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导出文件,源文件可从

码云

下载



版权声明:本文为qq_42907802原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。