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 26 Python
Python单链表简单实现代码
Apr 27 Python
python+opencv实现摄像头调用的方法
Jun 22 Python
django自带serializers序列化返回指定字段的方法
Aug 21 Python
python实现单张图像拼接与批量图片拼接
Mar 23 Python
Python matplotlib实时画图案例
Apr 23 Python
python中setuptools的作用是什么
Jun 19 Python
keras中epoch,batch,loss,val_loss用法说明
Jul 02 Python
Pycharm常用快捷键总结及配置方法
Nov 14 Python
Python使用tkinter制作在线翻译软件
Feb 22 Python
python利用xpath爬取网上数据并存储到django模型中
Feb 26 Python
python实现图片九宫格分割的示例
Apr 25 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
PHP5.2中PDO的简单使用方法
2016/03/25 PHP
JQUERY设置IFRAME的SRC值的代码
2010/11/30 Javascript
jquery 按钮状态效果 正常、移上、按下
2013/08/12 Javascript
jQuery获取动态生成的元素示例
2014/06/15 Javascript
Javascript 字符串模板的简单实现
2016/02/13 Javascript
jQuery调用WebMethod(PageMethod) NET2.0的方法
2016/04/15 Javascript
动态加载css方法实现和深入解析
2017/01/18 Javascript
jQuery实现列表的增加和删除功能
2018/06/14 jQuery
webpack 代码分离优化快速指北
2019/05/18 Javascript
Async/Await替代Promise的6个理由
2019/06/15 Javascript
js实现带有动画的返回顶部
2020/08/09 Javascript
python strip()函数 介绍
2013/05/24 Python
Python的迭代器和生成器使用实例
2015/01/14 Python
利用Python的装饰器解决Bottle框架中用户验证问题
2015/04/24 Python
Python创建二维数组实例(关于list的一个小坑)
2017/11/07 Python
Python实现pdf文档转txt的方法示例
2018/01/19 Python
python实时监控cpu小工具
2018/06/21 Python
python数据挖掘需要学的内容
2019/06/23 Python
django的ORM操作 增加和查询
2019/07/26 Python
Python检查 云备份进程是否正常运行代码实例
2019/08/22 Python
Python中Flask-RESTful编写API接口(小白入门)
2019/12/11 Python
pytorch 指定gpu训练与多gpu并行训练示例
2019/12/31 Python
TensorFlow实现checkpoint文件转换为pb文件
2020/02/10 Python
创业计划书中要认真思考的问题
2013/12/28 职场文书
法人代表委托书
2014/04/04 职场文书
优秀团队申报材料
2014/12/26 职场文书
英语邀请函范文
2015/02/02 职场文书
2015年七夕爱情寄语
2015/03/24 职场文书
关于幸福的感言
2015/08/03 职场文书
男方家长婚礼答谢词
2015/09/29 职场文书
求职信:会计求职的写作技巧
2019/04/24 职场文书
假期读书倡议书3篇
2019/08/19 职场文书
利用Nginx代理如何解决前端跨域问题详析
2021/04/02 Servers
python - timeit 时间模块
2021/04/06 Python
Redis 哨兵集群的实现
2021/06/18 Redis
什么是Python装饰器?如何定义和使用?
2022/04/11 Python