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实现apahce网站日志分析示例
Apr 02 Python
Python Sql数据库增删改查操作简单封装
Apr 18 Python
Python实现压缩与解压gzip大文件的方法
Sep 18 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
Jun 28 Python
pyqt5实现俄罗斯方块游戏
Jan 11 Python
python函数不定长参数使用方法解析
Dec 14 Python
python with语句的原理与用法详解
Mar 30 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
Apr 22 Python
Python爬取12306车次信息代码详解
Aug 12 Python
Docker如何部署Python项目的实现详解
Oct 26 Python
PyCharm常用配置和常用插件(小结)
Feb 06 Python
用python实现监控视频人数统计
May 21 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
用Flash图形化数据(一)
2006/10/09 PHP
Warning: session_destroy() : Trying to destroy uninitialized sessionq错误
2011/06/16 PHP
PHP中使用Imagick操作PSD文件实例
2015/01/26 PHP
PHP基于MySQL数据库实现对象持久层的方法
2015/06/17 PHP
php使用curl通过代理获取数据的实现方法
2016/05/16 PHP
PHP自定义函数实现数组比较功能示例
2017/10/19 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
基于jquery的页面划词搜索JS
2010/09/14 Javascript
JavaScript中的操作符==与===介绍
2014/12/31 Javascript
JS中递归函数
2016/06/17 Javascript
PHP捕捉异常中断的方法
2016/10/24 Javascript
简单理解vue中el、template、replace元素
2016/10/27 Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
2016/11/17 Javascript
js获取浏览器的各种属性
2017/04/27 Javascript
微信小程序网络请求wx.request详解及实例
2017/05/18 Javascript
浅谈JS如何实现真正的对象常量
2017/06/25 Javascript
详述 Sublime Text 打开 GBK 格式中文乱码的解决方法
2017/10/26 Javascript
Vue实例的对象参数options的几个常用选项详解
2019/11/08 Javascript
[48:28]完美世界DOTA2联赛循环赛FTD vs Magma第二场 10月30日
2020/10/31 DOTA
Python函数学习笔记
2008/10/07 Python
python网络编程学习笔记(九):数据库客户端 DB-API
2014/06/09 Python
Python多进程分块读取超大文件的方法
2016/04/13 Python
Python科学计算之Pandas详解
2017/01/15 Python
Python实现简单的多任务mysql转xml的方法
2017/02/08 Python
python2与python3中关于对NaN类型数据的判断和转换方法
2018/10/30 Python
Python英文文本分词(无空格)模块wordninja的使用实例
2019/02/20 Python
详解python statistics模块及函数用法
2019/10/27 Python
TensorFlow:将ckpt文件固化成pb文件教程
2020/02/11 Python
python图形开发GUI库pyqt5的基本使用方法详解
2020/02/14 Python
OpenCV Python实现拼图小游戏
2020/03/23 Python
Python基于jieba, wordcloud库生成中文词云
2020/05/13 Python
用sleep间隔进行python反爬虫的实例讲解
2020/11/30 Python
德国家具购物网站:Möbel Höffner
2019/08/26 全球购物
高考标语大全
2014/06/05 职场文书
2015年精神文明建设工作总结
2015/04/21 职场文书
大学生支教感言
2015/08/01 职场文书