Python进阶之使用selenium爬取淘宝商品信息功能示例


Posted in Python onSeptember 16, 2019

本文实例讲述了Python进阶之使用selenium爬取淘宝商品信息功能。分享给大家供大家参考,具体如下:

# encoding=utf-8
__author__ = 'Jonny'
__location__ = '西安'
__date__ = '2018-05-14'
'''
需要的基本开发库文件:
requests,pymongo,pyquery,selenium
开发流程:
  搜索关键字:利用selenium驱动浏览器搜索关键字,得到查询后的商品列表
  分析页码并翻页:得到商品页码数,模拟翻页,得到后续页面的商品列表
  分析提取商品内容:利用PyQuery分析页面源代码,解析获得商品列表信息
  存储到MongDB中:将商品的信息列表存储到数据库MongoDB。
'''
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from pyquery import PyQuery as pq
import pymongo
import re
import time
browser = webdriver.Chrome()
wait = WebDriverWait(browser,10)
client = pymongo.MongoClient('localhost',27017)
mongo = client['taobao']
def searcher():
  url = 'https://www.taobao.com/'
  browser.get(url=url)
  try:
    #判断页面加载是够成功,设置等待时间
    #判断位置1:搜索输入框是否加载完成
    input_kw = wait.until(
      EC.presence_of_element_located((By.CSS_SELECTOR, '#q'))
    )
    #判断位置2:搜索输入框对应的搜索按键是否加载完成
    submit = wait.until(EC.element_to_be_clickable(
      (By.CSS_SELECTOR,'#J_TSearchForm > div.search-button > button'))
    )
    input_kw.send_keys('男装')
    submit.click()
    #等待页面加载完成,便于准确判断网页的总页数
    page_counts = wait.until(
      EC.presence_of_element_located(
        (By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.total'))
    )
    parse_page()
    return page_counts.text
  except TimeoutException as e:
    print(e.args)
    return searcher()
#实现翻页
def next_page(page_number):
  try:
    # 判断页面加载是够成功,设置等待时间
    # 判断位置1:页面跳转输入页是否加载完成
    input_page = wait.until(
      EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input'))
    )
    # 判断位置2:确认按键是否加载完成
    submit = wait.until(EC.element_to_be_clickable(
      (By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit'))
    )
    input_page.send_keys(page_number)
    submit.click()
    #判断翻页是否成功
    wait.until(EC.text_to_be_present_in_element(
      (By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > ul > li.item.active'),str(page_number))
    )
    parse_page()
  except TimeoutException as e:
    print(e.args)
    next_page(page_number)
#对页面进行数据处理
def parse_page():
  # wait.until(EC.presence_of_element_located(By.CSS_SELECTOR,'#mainsrp-itemlist > div > div'))
  wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')))
  html = browser.page_source
  doc = pq(html)
  items = doc('#mainsrp-itemlist .items .item').items()
  for item in items:
    goods = {
      'image':item.find('.pic .img').attr('src'),
      'price':item.find('.price').text(),
      'deal':item.find('.deal-cnt').text()[:-3],
      'title':item.find('.title').text(),
      'shop':item.find('.shop').text(),
      'location':item.find('.location').text()
    }
    print(goods)
    data_storage(goods)
#将数据存入数据库
def data_storage(goods):
  try:
    if mongo['mongo_sheet'].insert(goods):
      print('Successfully storage!')
  except Exception as e:
    print('failedly storage!',goods)
def main():
  text = searcher()
  print(text)
  #获取总页数
  pages = int(re.compile('(\d+)').search(text).group(0))
  print(pages)
  for i in range(2,pages+1):
    next_page(i)
  browser.close()
if __name__ == '__main__':
  main()

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python处理cookie详解
Feb 07 Python
通过python+selenium3实现浏览器刷简书文章阅读量
Dec 26 Python
python使用pil库实现图片合成实例代码
Jan 20 Python
Python学习笔记之open()函数打开文件路径报错问题
Apr 28 Python
对Python 窗体(tkinter)文本编辑器(Text)详解
Oct 11 Python
OpenCV搞定腾讯滑块验证码的实现代码
May 18 Python
Django缓存系统实现过程解析
Aug 02 Python
python3.7环境下安装Anaconda的教程图解
Sep 10 Python
Numpy之将矩阵拉成向量的实例
Nov 30 Python
Anaconda的安装及其环境变量的配置详解
Apr 22 Python
opencv 实现特定颜色线条提取与定位操作
Jun 02 Python
如何Python使用re模块实现okenizer
Apr 30 Python
python tkinter组件使用详解
Sep 16 #Python
python tkinter组件摆放方式详解
Sep 16 #Python
python动态视频下载器的实现方法
Sep 16 #Python
python tkinter基本属性详解
Sep 16 #Python
Django之使用内置函数和celery发邮件的方法示例
Sep 16 #Python
django中使用事务及接入支付宝支付功能
Sep 15 #Python
Django中的FBV和CBV用法详解
Sep 15 #Python
You might like
php&java(三)
2006/10/09 PHP
php字符编码转换之gb2312转为utf8
2013/10/28 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
2016/04/07 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
php中static 静态变量和普通变量的区别
2016/12/01 PHP
yii gridview实现时间段筛选功能
2017/08/15 PHP
php实例化一个类的具体方法
2019/09/19 PHP
JS 分号引起的一段调试问题
2009/06/18 Javascript
将CKfinder整合进CKEditor3.0的新方法
2010/01/10 Javascript
jquery 插件学习(一)
2012/08/06 Javascript
jQuery学习笔记 更改jQuery对象
2012/09/19 Javascript
如何使用jQuery Draggable和Droppable实现拖拽功能
2013/07/05 Javascript
js编写trim()函数及正则表达式的运用
2013/10/24 Javascript
javascript常用函数(1)
2015/11/04 Javascript
javascript手风琴下拉菜单实现代码
2015/11/12 Javascript
Bootstrap每天必学之弹出框(Popover)插件
2016/04/25 Javascript
Vue实现双向绑定的方法
2016/12/22 Javascript
nodejs中使用archive压缩文件的实现代码
2019/11/26 NodeJs
JS模拟实现京东快递单号查询
2020/11/30 Javascript
Python:Scrapy框架中Item Pipeline组件使用详解
2017/12/27 Python
python 用opencv调用训练好的模型进行识别的方法
2018/12/07 Python
python 批量解压压缩文件的实例代码
2019/06/27 Python
django一对多模型以及如何在前端实现详解
2019/07/24 Python
Python编程中类与类的关系详解
2019/08/08 Python
Python TCPServer 多线程多客户端通信的实现
2019/12/31 Python
Keras预训练的ImageNet模型实现分类操作
2020/07/07 Python
Python爬虫UA伪装爬取的实例讲解
2021/02/19 Python
利用CSS3的transition属性实现滑动效果
2015/08/05 HTML / CSS
智能家居、吸尘器、滑板车、电动自行车网上购物:Geekmaxi
2021/01/18 全球购物
土木工程毕业生推荐信
2013/10/28 职场文书
马智宇婚礼主持词
2014/03/22 职场文书
2015年公司中秋节致辞
2015/07/31 职场文书
css display table 自适应高度、宽度问题的解决
2021/05/07 HTML / CSS
webpack的移动端适配方案小结
2021/07/25 Javascript
简述Java中throw-throws异常抛出
2021/08/07 Java/Android
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/07 PostgreSQL