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功能键的读取方法
May 28 Python
详解Python的Lambda函数与排序
Oct 25 Python
python Crypto模块的安装与使用方法
Dec 21 Python
python获取当前目录路径和上级路径的实例
Apr 26 Python
python requests 库请求带有文件参数的接口实例
Jan 03 Python
使用Python检测文章抄袭及去重算法原理解析
Jun 14 Python
浅谈python3中input输入的使用
Aug 02 Python
关于Flask项目无法使用公网IP访问的解决方式
Nov 19 Python
用python的turtle模块实现给女票画个小心心
Nov 23 Python
Python使用psutil获取进程信息的例子
Dec 17 Python
python多线程semaphore实现线程数控制的示例
Aug 10 Python
python实现经纬度采样的示例代码
Dec 10 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获取和操作配置文件php.ini的几个函数介绍
2013/06/24 PHP
php5.3 不支持 session_register() 此函数已启用的解决方法
2013/11/12 PHP
PHP查看SSL证书信息的方法
2016/09/22 PHP
PHP简单读取xml文件的方法示例
2017/04/20 PHP
PHP微信H5支付开发实例
2018/07/25 PHP
javascript实现的动态文字变换
2007/07/28 Javascript
JavaScript 数组循环引起的思考
2010/01/01 Javascript
很棒的学习jQuery的12个网站推荐
2011/04/28 Javascript
使用js的replace()方法查找字符示例代码
2013/10/28 Javascript
jQuery中animate的几种用法与注意事项
2016/12/12 Javascript
用jQuery旋转插件jqueryrotate制作转盘抽奖
2017/02/10 Javascript
微信小程序引用公共js里的方法的实例详解
2017/08/17 Javascript
详解AngularJS1.x学习directive 中‘& ’‘=’ ‘@’符号的区别使用
2017/08/23 Javascript
第一个Vue插件从封装到发布
2017/11/22 Javascript
详解vue-cli项目中的proxyTable跨域问题小结
2018/02/09 Javascript
Vue render函数实战之实现tabs选项卡组件
2019/04/22 Javascript
Vue 3.0 前瞻Vue Function API新特性体验
2019/08/12 Javascript
浅析vue中的provide / inject 有什么用处
2019/11/10 Javascript
vue项目配置使用flow类型检查的步骤
2020/03/18 Javascript
[09:22]2014DOTA2西雅图国际邀请赛 主赛事第二日TOPPLAY
2014/07/21 DOTA
python BeautifulSoup设置页面编码的方法
2015/04/03 Python
python使用xlrd与xlwt对excel的读写和格式设定
2017/01/21 Python
Python获取指定字符前面的所有字符方法
2018/05/02 Python
Python中的单继承与多继承实例分析
2018/05/10 Python
对python中执行DOS命令的3种方法总结
2018/05/12 Python
python把转列表为集合的方法
2019/06/28 Python
在python plt图表中文字大小调节的方法
2019/07/08 Python
Python模拟登入的N种方式(建议收藏)
2020/05/31 Python
造型师求职自荐信
2013/09/27 职场文书
小学教师个人先进事迹材料
2014/05/17 职场文书
初二学生评语大全
2014/12/26 职场文书
就业推荐表导师评语
2014/12/31 职场文书
平遥古城导游词
2015/02/03 职场文书
2015高考寄语集锦
2015/02/27 职场文书
一般纳税人申请报告
2015/05/18 职场文书
火锅店的开业营销方案范本!
2019/07/05 职场文书