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 除法小技巧
Sep 06 Python
使用Python制作获取网站目录的图形化程序
May 04 Python
python递归计算N!的方法
May 05 Python
python psutil库安装教程
Mar 19 Python
Python datetime包函数简单介绍
Aug 28 Python
python 并发下载器实现方法示例
Nov 22 Python
Python爬虫解析网页的4种方式实例及原理解析
Dec 30 Python
pytorch 中的重要模块化接口nn.Module的使用
Apr 02 Python
python线程里哪种模块比较适合
Aug 02 Python
python Timer 类使用介绍
Dec 28 Python
Python的Tqdm模块实现进度条配置
Feb 24 Python
Python字典的基础操作
Nov 01 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编码规范之注释和文件结构说明
2010/07/09 PHP
php设计模式之委托模式
2016/02/13 PHP
PHP中TP5 上传文件的实例详解
2017/07/31 PHP
PHP PDOStatement::closeCursor讲解
2019/01/30 PHP
Yii框架小部件(Widgets)用法实例详解
2020/05/15 PHP
用JavaScript脚本实现Web页面信息交互
2006/10/11 Javascript
js 巧妙去除数组中的重复项
2010/01/25 Javascript
Javascript中的Callback方法浅析
2015/03/15 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
2017/02/20 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
如何构建 vue-ssr 项目的方法步骤
2020/08/04 Javascript
javascript this指向相关问题及改变方法
2020/11/19 Javascript
原生js实现下拉框选择组件
2021/01/20 Javascript
js实现简单图片拖拽效果
2021/02/22 Javascript
Python备份目录及目录下的全部内容的实现方法
2016/06/12 Python
python实现rsa加密实例详解
2017/07/19 Python
pandas中的DataFrame按指定顺序输出所有列的方法
2018/04/10 Python
Python RabbitMQ消息队列实现rpc
2018/05/30 Python
Django中间件拦截未登录url实例详解
2019/09/03 Python
Python约瑟夫生者死者小游戏实例讲解
2021/01/04 Python
详解python使用金山词霸的翻译功能(调试工具断点的使用)
2021/01/07 Python
Ryderwear澳洲官网:澳大利亚高端健身训练装备品牌
2018/09/18 全球购物
英国亚马逊官方网站:Amazon.co.uk
2019/08/09 全球购物
外贸采购员求职的自我评价
2013/11/26 职场文书
员工评语大全
2014/01/19 职场文书
医药个人求职信范文
2014/01/29 职场文书
保证书范文大全
2014/04/28 职场文书
经理任命书模板
2014/06/06 职场文书
单位授权委托书范文
2014/08/02 职场文书
诉讼授权委托书范本
2014/10/05 职场文书
大学生党员个人总结
2015/02/13 职场文书
校园歌手大赛主持词
2015/07/03 职场文书
青年志愿者活动感想
2015/08/07 职场文书
2019年12月24日平安夜祝福语集锦
2019/12/24 职场文书
Vue.Draggable实现交换位置
2022/04/07 Vue.js
Python多线程实用方法以及共享变量资源竞争问题
2022/04/12 Python