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用10行代码实现对黄色图片的检测功能
Aug 10 Python
Python可变参数用法实例分析
Apr 02 Python
python中类和实例如何绑定属性与方法示例详解
Aug 18 Python
Python实现读取Properties配置文件的方法
Mar 29 Python
Python3基于sax解析xml操作示例
May 22 Python
TensorFlow Session使用的两种方法小结
Jul 30 Python
PYQT5设置textEdit自动滚屏的方法
Jun 14 Python
python实现一行输入多个值和一行输出多个值的例子
Jul 16 Python
pytorch实现mnist数据集的图像可视化及保存
Jan 14 Python
Django 解决新建表删除后无法重新创建等问题
May 21 Python
Python 实现微信自动回复的方法
Sep 11 Python
BeautifulSoup中find和find_all的使用详解
Dec 07 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
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
第四节--构造函数和析构函数
2006/11/16 PHP
关于php连接mssql:pdo odbc sql server
2011/07/20 PHP
php实现统计目录文件大小的函数
2015/12/25 PHP
php中namespace use用法实例分析
2016/01/22 PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
2016/11/09 PHP
php实现水印文字和缩略图的方法示例
2016/12/29 PHP
Laravel 5.4.36中session没有保存成功问题的解决
2018/02/19 PHP
国外的为初学者写的JavaScript教程
2008/06/09 Javascript
Javascript 汉字字节判断
2009/08/01 Javascript
网页前端优化之滚动延时加载图片示例
2013/07/13 Javascript
jquery中push()的用法(数组添加元素)
2014/11/25 Javascript
js+CSS实现弹出居中背景半透明div层的方法
2015/02/26 Javascript
jquery获取select选中值的方法分析
2015/12/22 Javascript
避免jQuery名字冲突 noConflict()方法
2016/07/30 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
2018/09/20 Javascript
vant时间控件使用方法详解
2020/12/24 Javascript
React服务端渲染原理解析与实践
2021/03/04 Javascript
python利用标准库如何获取本地IP示例详解
2017/11/01 Python
浅谈tensorflow1.0 池化层(pooling)和全连接层(dense)
2018/04/27 Python
浅谈Tensorflow由于版本问题出现的几种错误及解决方法
2018/06/13 Python
python3使用flask编写注册post接口的方法
2018/12/28 Python
Python 可变类型和不可变类型及引用过程解析
2019/09/27 Python
matplotlib实现显示伪彩色图像及色度条
2019/12/07 Python
python爬取豆瓣电影排行榜(requests)的示例代码
2021/02/18 Python
北卡罗来纳州豪华家具和家居装饰店:Carolina Rustica
2018/10/30 全球购物
大学生工作推荐信范文
2013/12/02 职场文书
学生自我鉴定
2013/12/18 职场文书
办公室前台岗位职责
2014/01/04 职场文书
三年级语文教学反思
2014/02/01 职场文书
历史专业学生的自我评价
2014/02/28 职场文书
聘任书模板
2014/03/29 职场文书
三好学生演讲稿范文
2014/04/26 职场文书
小学一年级学生评语大全
2014/12/25 职场文书
商场营业员岗位职责
2015/04/14 职场文书