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中pygame模块的Linux下安装过程(详解)
Nov 09 Python
详解Django rest_framework实现RESTful API
May 24 Python
python如何实现一个刷网页小程序
Nov 27 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
Jul 03 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
Aug 13 Python
django实现web接口 python3模拟Post请求方式
Nov 19 Python
tensorflow中tf.slice和tf.gather切片函数的使用
Jan 19 Python
Keras之fit_generator与train_on_batch用法
Jun 17 Python
什么是python的必选参数
Jun 21 Python
python安装读取grib库总结(推荐)
Jun 24 Python
五分钟学会怎么用python做一个简单的贪吃蛇
Jan 12 Python
正确的理解和使用Django信号(Signals)
Apr 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数组操作
2011/12/30 PHP
PHP实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)
2014/05/10 PHP
PHP不用递归遍历目录下所有文件的代码
2014/07/04 PHP
yii2缓存Caching基本用法示例
2016/07/18 PHP
PHP的PDO事务与自动提交
2019/01/24 PHP
PHP var关键字相关原理及使用实例解析
2020/07/11 PHP
jQuery-onload让第一次页面加载时图片是淡入方式显示
2012/05/23 Javascript
javascript强大的日期函数代码分享
2013/09/04 Javascript
JavaScript中Math.SQRT2属性的使用详解
2015/06/14 Javascript
详解JavaScript中的4种类型识别方法
2015/09/14 Javascript
JS中frameset框架弹出层实例代码
2016/04/01 Javascript
JS从一组数据中找到指定的单条数据的方法
2016/06/02 Javascript
关于定制FileField中的上传文件名称问题
2017/08/22 Javascript
完美解决axios在ie下的兼容性问题
2018/03/05 Javascript
Vue实现内部组件轮播切换效果的示例代码
2018/04/07 Javascript
解决Vue大括号字符换行踩的坑
2020/11/09 Javascript
[45:16]完美世界DOTA2联赛循环赛 IO vs FTD BO2第二场 11.05
2020/11/06 DOTA
在Python中使用pngquant压缩png图片的教程
2015/04/09 Python
Python如何生成树形图案
2018/01/03 Python
Python3.6安装及引入Requests库的实现方法
2018/01/24 Python
利用Python如何批量修改数据库执行Sql文件
2018/07/29 Python
对python的bytes类型数据split分割切片方法
2018/12/04 Python
python实现一行输入多个值和一行输出多个值的例子
2019/07/16 Python
python梯度下降算法的实现
2020/02/24 Python
HTML5 Blob 实现文件下载功能的示例代码
2019/11/29 HTML / CSS
廉价航班、机票和酒店:JustFly
2018/02/07 全球购物
美国婴儿用品及配件购买网站:Munchkin
2019/04/03 全球购物
英国顶级足球鞋的领先零售商:Lovell Soccer
2019/08/27 全球购物
营销与策划个人求职信
2013/09/22 职场文书
工程造价与管理专业应届生求职信
2013/11/23 职场文书
护理实习自我鉴定
2013/12/14 职场文书
小学生2014国庆节演讲稿:祖国在我心中
2014/09/21 职场文书
鲁迅故里导游词
2015/02/05 职场文书
尊师重教主题班会
2015/08/14 职场文书
tensorflow中的梯度求解及梯度裁剪操作
2021/05/26 Python
python数据分析之单因素分析线性拟合及地理编码
2022/06/25 Python