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加密自己的密码
Aug 04 Python
使用简单工厂模式来进行Python的设计模式编程
Mar 01 Python
Flask框架的学习指南之用户登录管理
Nov 20 Python
django ajax json的实例代码
May 29 Python
使用python爬取B站千万级数据
Jun 08 Python
详解Django的CSRF认证实现
Oct 09 Python
python re正则匹配网页中图片url地址的方法
Dec 20 Python
python 获取微信好友列表的方法(微信web)
Feb 21 Python
详解pandas.DataFrame中删除包涵特定字符串所在的行
Apr 04 Python
tensorflow常用函数API介绍
Apr 19 Python
Python Django form 组件动态从数据库取choices数据实例
May 19 Python
解决pytorch下出现multi-target not supported at的一种可能原因
Feb 06 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初学者最感迷茫的问题小结
2010/03/27 PHP
linux下为php添加curl扩展的方法
2011/07/29 PHP
PHP下载远程图片并保存到本地方法总结
2016/01/22 PHP
得到文本框选中的文字,动态插入文字的js代码
2007/03/07 Javascript
在javascript中如何得到中英文混合字符串的长度
2014/01/17 Javascript
再分享70+免费的jquery 图片滑块效果插件和教程
2014/12/15 Javascript
JS动态改变表格边框宽度的方法
2015/03/31 Javascript
JavaScript模版引擎的基本实现方法浅析
2016/02/15 Javascript
Node.js的npm包管理器基础使用教程
2016/05/26 Javascript
原生js编写基于面向对象的分页组件
2016/12/05 Javascript
如何使用Bootstrap 按钮实例详解
2017/03/29 Javascript
vue框架搭建之axios使用教程
2018/07/11 Javascript
GOJS+VUE实现流程图效果
2018/12/01 Javascript
JS实现盒子拖拽效果
2020/02/06 Javascript
JavaScript ES6 Class类实现原理详解
2020/05/08 Javascript
JS如何实现手机端输入验证码效果
2020/05/13 Javascript
js实现滑动滑块验证登录
2020/07/24 Javascript
JS的时间格式化和时间戳转换函数示例详解
2020/07/27 Javascript
js实现带有动画的返回顶部
2020/08/09 Javascript
Python3中常用的处理时间和实现定时任务的方法的介绍
2015/04/07 Python
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
pycharm 解除默认unittest模式的方法
2018/11/30 Python
详解用python自制微信机器人,定时发送天气预报
2019/03/25 Python
Python3+Appium安装使用教程
2019/07/05 Python
解决python明明pip安装成功却找不到包的问题
2019/08/28 Python
解决Python3.8运行tornado项目报NotImplementedError错误
2020/09/02 Python
使用css如何制作时间ICON方法实践
2012/11/12 HTML / CSS
学生会宣传部部长竞选演讲稿
2014/04/25 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
行政处罚告知书
2015/07/01 职场文书
2016大学生形势与政策心得体会
2016/01/12 职场文书
儿童诗两首教学反思
2016/02/23 职场文书
MySQL命令行操作时的编码问题详解
2021/04/14 MySQL
go web 预防跨站脚本的实现方式
2021/06/11 Golang
十大最帅动漫男主 碓冰拓海上榜,第一是《灌篮高手》男主角
2022/03/18 日漫
《巫师》是美食游戏?CDPR10月将推出《巫师》官方食谱
2022/04/03 其他游戏