selenium+sqlalchemy 爬取京东商品信息并存入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:[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导出文件,源文件可从码云下载

猜你喜欢

转载自blog.csdn.net/qq_42907802/article/details/106550443