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 相关文章推荐
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
Jan 22 Python
利用Python实现颜色色值转换的小工具
Oct 27 Python
python 捕获 shell/bash 脚本的输出结果实例
Jan 04 Python
Python使用time模块实现指定时间触发器示例
May 18 Python
numpy.delete删除一列或多列的方法
Apr 03 Python
python使用python-pptx删除ppt某页实例
Feb 14 Python
python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例
Feb 28 Python
通过python调用adb命令对App进行性能测试方式
Apr 23 Python
Python进行统计建模
Aug 10 Python
如何用Django处理gzip数据流
Jan 29 Python
七个非常实用的Python工具包总结
Jun 15 Python
Python基于百度AI实现抓取表情包
Jun 27 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
SONY SRF-22W(33W)的电路分析和维修案例
2021/03/02 无线电
什么是OneThink oneThink后台添加插件步骤
2016/04/13 PHP
php操作路径的经典方法(必看篇)
2016/10/04 PHP
JS将光标聚焦在文本最后的实现代码
2014/03/28 Javascript
Javascript中String的常用方法实例分析
2015/06/13 Javascript
BootStrap下jQuery自动完成的样式调整
2016/05/30 Javascript
原生JS实现圆环拖拽效果
2017/04/07 Javascript
利用node.js爬取指定排名网站的JS引用库详解
2017/07/25 Javascript
Vue中mintui的field实现blur和focus事件的方法
2018/08/25 Javascript
JS中的算法与数据结构之常见排序(Sort)算法详解
2019/08/16 Javascript
微信小程序实现上传图片裁剪图片过程解析
2019/08/22 Javascript
通过扫小程序码实现网站登陆功能
2019/08/22 Javascript
在Vue mounted方法中使用data变量详解
2019/11/05 Javascript
uni-app 支持多端第三方地图定位的方法
2020/01/03 Javascript
[02:27]DOTA2英雄基础教程 莱恩
2014/01/17 DOTA
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
Python两个整数相除得到浮点数值的方法
2015/03/18 Python
python获取命令行输入参数列表的实例代码
2018/06/23 Python
使用Django简单编写一个XSS平台的方法步骤
2019/03/25 Python
Python实现字典按key或者value进行排序操作示例【sorted】
2019/05/03 Python
python selenium 查找隐藏元素 自动播放视频功能
2019/07/24 Python
python写程序统计词频的方法
2019/07/29 Python
利用Python计算KS的实例详解
2020/03/03 Python
Python3爬虫中关于Ajax分析方法的总结
2020/07/10 Python
python获取整个网页源码的方法
2020/08/03 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
2020/10/18 Python
如何基于Python和Flask编写Prometheus监控
2020/11/25 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
什么是事务?事务有哪些性质?
2012/03/11 面试题
房产销售经理职责
2013/12/20 职场文书
快递业务员岗位职责
2014/01/06 职场文书
辩论赛主持词
2014/03/18 职场文书
学习方法演讲稿
2014/05/10 职场文书
公司食堂管理制度
2015/08/05 职场文书
电力企业职工培训心得体会
2016/01/11 职场文书
怎么禁用Win11输入法 最新Win11输入法关闭教程
2022/08/05 数码科技