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程序中使用SQLAlchemy时出现乱码的解决方案
Apr 24 Python
Python中遍历字典过程中更改元素导致异常的解决方法
May 12 Python
Python实现重建二叉树的三种方法详解
Jun 23 Python
Python如何使用函数做字典的值
Nov 30 Python
Python figure参数及subplot子图绘制代码
Apr 18 Python
Pytorch 高效使用GPU的操作
Jun 27 Python
浅谈django框架集成swagger以及自定义参数问题
Jul 07 Python
python 解决selenium 中的 .clear()方法失效问题
Sep 01 Python
Python读写csv文件流程及异常解决
Oct 20 Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
Nov 24 Python
python模拟点击在ios中实现的实例讲解
Nov 26 Python
Python OpenCV快速入门教程
Apr 17 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导出oracle库的php代码
2009/04/20 PHP
如何使用Linux的Crontab定时执行PHP脚本的方法
2011/12/19 PHP
php替换超长文本中的特殊字符的函数代码
2012/05/22 PHP
Yii2 队列 shmilyzxt/yii2-queue 简单概述
2017/08/02 PHP
Use Word to Search for Files
2007/06/15 Javascript
window.name代替cookie的实现代码
2010/11/28 Javascript
JavaScript判断DOM何时加载完毕的技巧
2012/11/11 Javascript
兼容Firefox的Javascript XSLT 处理XML文件
2014/12/31 Javascript
JS解析XML文件和XML字符串详解
2015/04/17 Javascript
详解JavaScript中的客户端消息框架设计原理
2015/06/24 Javascript
javascript 闭包详解及简单实例应用
2016/12/31 Javascript
BootStrap注意事项小结(五)表单
2017/03/10 Javascript
利用nginx + node在阿里云部署https的步骤详解
2017/12/19 Javascript
微信小程序外卖选购页实现切换分类与数量加减功能案例
2019/01/15 Javascript
jQuery实现为table表格动态添加或删除tr功能示例
2019/02/19 jQuery
Vue触发隐藏input file的方法实例详解
2019/08/14 Javascript
[05:13]2018DOTA2亚洲邀请赛主赛事第二日战况回顾 LGD、VG双雄携手晋级
2018/04/05 DOTA
[10:42]Team Liquid Vs Newbee
2018/06/07 DOTA
简单介绍Python中的floor()方法
2015/05/15 Python
django接入新浪微博OAuth的方法
2015/06/29 Python
Flask框架模板继承实现方法分析
2019/07/31 Python
Python根据服务获取端口号的方法
2019/09/25 Python
python命令 -u参数用法解析
2019/10/24 Python
基于keras 模型、结构、权重保存的实现
2020/01/24 Python
Python读取表格类型文件代码实例
2020/02/17 Python
Python astype(np.float)函数使用方法解析
2020/06/08 Python
Python 开发工具通过 agent 代理使用的方法
2020/09/27 Python
Python安装第三方库攻略(pip和Anaconda)
2020/10/15 Python
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
NYX Professional Makeup俄罗斯官网:世界知名的化妆品品牌
2019/12/26 全球购物
平面设计自荐信
2013/10/07 职场文书
装潢设计专业推荐信模板
2013/11/26 职场文书
办公室人员先进事迹
2014/01/27 职场文书
党性观念心得体会
2014/09/03 职场文书
tensorboard 可视化之localhost:6006不显示的解决方案
2021/05/22 Python
Spring Boot 实现敏感词及特殊字符过滤处理
2021/06/29 Java/Android