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 相关文章推荐
pyv8学习python和javascript变量进行交互
Dec 04 Python
python多线程编程方式分析示例详解
Dec 06 Python
盘点提高 Python 代码效率的方法
Jul 03 Python
初步介绍Python中的pydoc模块和distutils模块
Apr 13 Python
Python读写txt文本文件的操作方法全解析
Jun 26 Python
python基础教程之匿名函数lambda
Jan 17 Python
pandas全表查询定位某个值所在行列的方法
Apr 12 Python
PyQt5每天必学之组合框
Apr 20 Python
解决python 无法加载downsample模型的问题
Oct 25 Python
Python实现多属性排序的方法
Dec 05 Python
对django xadmin自定义菜单的实例详解
Jan 03 Python
简单了解python filter、map、reduce的区别
Jan 14 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中的mongodb select常用操作代码示例
2014/09/06 PHP
php中Redis的应用--消息传递
2017/03/28 PHP
浅谈thinkphp5 instance 的简单实现
2017/07/30 PHP
详解PHP的抽象类和抽象方法以及接口总结
2019/03/15 PHP
js检测客户端不是firefox则提示下载
2007/04/07 Javascript
javascript事件模型代码
2007/07/01 Javascript
Jquery中删除元素的实现代码
2011/12/29 Javascript
JavaScript中遍历对象的property的3种方法介绍
2014/12/30 Javascript
详解JavaScript中的every()方法
2015/06/08 Javascript
Three.js学习之几何形状
2016/08/01 Javascript
微信小程序 倒计时组件实现代码
2016/10/24 Javascript
在网页中插入百度地图的步骤详解
2016/12/02 Javascript
JS实现获取图片大小和预览的方法完整实例【兼容IE和其它浏览器】
2017/04/24 Javascript
jQuery Tree Multiselect使用详解
2017/05/02 jQuery
浅谈Angular HttpClient简单入门
2018/05/04 Javascript
微信小程序 scroll-view 实现锚点跳转功能
2019/12/12 Javascript
Python中用Spark模块的使用教程
2015/04/13 Python
Python实现登录接口的示例代码
2017/07/21 Python
Python打印输出数组中全部元素
2018/03/13 Python
Python基于pycrypto实现的AES加密和解密算法示例
2018/04/10 Python
python使用turtle库与random库绘制雪花
2018/06/22 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
2019/02/26 Python
Django中使用极验Geetest滑动验证码过程解析
2019/07/31 Python
解析python的局部变量和全局变量
2019/08/15 Python
pandas创建DataFrame的7种方法小结
2020/06/14 Python
用Python制作mini翻译器的实现示例
2020/08/17 Python
python中xlrd模块的使用详解
2021/02/01 Python
美国林业供应商:Forestry Suppliers
2019/05/01 全球购物
澳大利亚在线消费电子产品商店:TobyDeals
2020/01/05 全球购物
Parfumdreams芬兰:购买香水和化妆品
2021/02/13 全球购物
extern是什么意思
2016/03/10 面试题
学生党员的自我评价范文
2014/03/01 职场文书
模特大赛策划方案
2014/05/28 职场文书
就业协议书怎么填
2014/09/15 职场文书
增值税发票丢失证明
2015/06/19 职场文书
导游词之清晏园
2019/11/22 职场文书