使用selenium抓取淘宝的商品信息实例


Posted in Javascript onFebruary 06, 2018

淘宝的页面大量使用了js加载数据,所以采用selenium来进行爬取更为简单,selenum作为一个测试工具,主要配合无窗口浏览器phantomjs来使用。

import re
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from pyquery import PyQuery as pq
'''
wait.until()语句是selenum里面的显示等待,wait是一个WebDriverWait对象,它设置了等待时间,如果页面在等待时间内
没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常,也可以说程序每隔xx秒看一眼,如果条件
成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException
1.presence_of_element_located 元素加载出,传入定位元组,如(By.ID, 'p')
2.element_to_be_clickable 元素可点击
3.text_to_be_present_in_element 某个元素文本包含某文字
'''
# 定义一个无界面的浏览器
browser = webdriver.PhantomJS(
 service_args=[
  '--load-images=false',
  '--disk-cache=true'])
# 10s无响应就down掉
wait = WebDriverWait(browser, 10)
#虽然无界面但是必须要定义窗口
browser.set_window_size(1400, 900)

def search():
 '''
 此函数的作用为完成首页点击搜索的功能,替换标签可用于其他网页使用
 :return:
 '''
 print('正在搜索')
 try:
  #访问页面
  browser.get('https://www.taobao.com')
  # 选择到淘宝首页的输入框
  input = wait.until(
   EC.presence_of_element_located((By.CSS_SELECTOR, '#q'))
  )
  #搜索的那个按钮
  submit = wait.until(EC.element_to_be_clickable(
   (By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button')))
  #send_key作为写到input的内容
  input.send_keys('面条')
  #执行点击搜索的操作
  submit.click()
  #查看到当前的页码一共是多少页
  total = wait.until(EC.presence_of_element_located(
   (By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.total')))
  #获取所有的商品
  get_products()
  #返回总页数
  return total.text
 except TimeoutException:
  return search()

def next_page(page_number):
 '''
 翻页函数,
 :param page_number:
 :return:
 '''
 print('正在翻页', page_number)
 try:
  #这个是我们跳转页的输入框
  input = wait.until(EC.presence_of_element_located(
   (By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input')))
  #跳转时的确定按钮
  submit = wait.until(
   EC.element_to_be_clickable(
    (By.CSS_SELECTOR,
     '#mainsrp-pager > div > div > div > div.form > span.J_Submit')))
  #清除里面的数字
  input.clear()
  #重新输入数字
  input.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 > span'),
    str(page_number)))
  #调用函数获取商品信息
  get_products()
 #捕捉超时,重新进入翻页的函数
 except TimeoutException:
  next_page(page_number)

def get_products():
 '''
 搜到页面信息在此函数在爬取我们需要的信息
 :return:
 '''
 #每一个商品标签,这里是加载出来以后才会拿网页源代码
 wait.until(EC.presence_of_element_located(
  (By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')))
 #这里拿到的是整个网页源代码
 html = browser.page_source
 #pq解析网页源代码
 doc = pq(html)
 items = doc('#mainsrp-itemlist .items .item').items()
 for item in items:
  # print(item)
  product = {
   '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(product)

def main():
 try:
  #第一步搜索
  total = search()
  #int类型刚才找到的总页数标签,作为跳出循环的条件
  total = int(re.compile('(\d+)').search(total).group(1))
  #只要后面还有就继续爬,继续翻页
  for i in range(2, total + 1):
   next_page(i)
 except Exception:
  print('出错啦')
 finally:
  #关闭浏览器
  browser.close()

if __name__ == '__main__':
 main()

以上这篇使用selenium抓取淘宝的商品信息实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
各种效果的jquery ui(接口)介绍
Sep 17 Javascript
jquery tools之tooltip
Jul 25 Javascript
jQuery 对Select的操作备忘记录
Jul 04 Javascript
js新闻滚动 js如何实现新闻滚动效果
Jan 07 Javascript
JQuery each()嵌套使用小结
Apr 18 Javascript
使用JavaScript 实现的人脸检测
Mar 24 Javascript
JavaScript实现基于Cookie的存储类实例
Apr 10 Javascript
JavaScript点击按钮后弹出透明浮动层的方法
May 11 Javascript
JS图片轮播与索引变色功能实例详解
Jul 06 Javascript
JavaScript面试出现频繁的一些易错点整理
Mar 29 Javascript
js实现指定时间倒计时效果
Aug 26 Javascript
Vue项目中使用jsonp抓取跨域数据的方法
Nov 10 Javascript
vue一个页面实现音乐播放器的示例
Feb 06 #Javascript
使用百度地图实现地图网格的示例
Feb 06 #Javascript
js中的闭包学习心得
Feb 06 #Javascript
JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
Feb 06 #Javascript
Vue仿今日头条实例详解
Feb 06 #Javascript
electron demo项目npm install安装失败的解决方法
Feb 06 #Javascript
详解React开发必不可少的eslint配置
Feb 05 #Javascript
You might like
PHP+Tidy-完美的XHTML纠错+过滤
2007/04/10 PHP
PHP实现中文圆形印章特效
2015/06/19 PHP
25个好玩的JavaScript小游戏分享
2011/04/22 Javascript
javascript温习的一些笔记 基础常用知识小结
2011/06/22 Javascript
Webkit的跨域安全问题说明
2011/09/13 Javascript
分享Javascript中最常用的55个经典小技巧
2013/11/29 Javascript
JS判断客服QQ号在线还是离线状态的方法
2015/01/13 Javascript
纯Javascript实现ping功能的方法
2015/03/20 Javascript
JavaScript中的Math.LN2属性用法详解
2015/06/12 Javascript
javascript实现手机震动API代码
2015/08/05 Javascript
原生JS实现平滑回到顶部组件
2016/03/16 Javascript
浅析jQuery 3.0中的Data
2016/06/14 Javascript
JavaScript 继承详解(六)
2016/10/11 Javascript
最常见的左侧分类菜单栏jQuery实现代码
2016/11/28 Javascript
jQuery Checkbox 全选 反选的简单实例
2016/11/29 Javascript
JavaScript实现HTML5游戏断线自动重连的方法
2017/09/18 Javascript
详解vue-cli官方脚手架配置
2018/07/20 Javascript
[07:59]2014DOTA2叨叨刀塔 林熊猫称被邀请赛现场盛况震撼
2014/07/21 DOTA
在Linux系统上安装Python的Scrapy框架的教程
2015/06/11 Python
Python中import机制详解
2017/11/14 Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
2018/06/07 Python
django 多对多表的创建和插入代码实现
2019/09/09 Python
Scrapy框架介绍之Puppeteer渲染的使用
2020/06/19 Python
python 根据列表批量下载网易云音乐的免费音乐
2020/12/03 Python
英国珠宝钟表和家居礼品精品店:David Shuttle
2018/02/24 全球购物
Book Depository澳大利亚:世界领先的专业在线书店之一
2018/12/27 全球购物
北京天润融通.net面试题笔试题
2012/02/20 面试题
外语学院毕业生的自我鉴定
2013/11/28 职场文书
医学专业本科毕业生自我鉴定
2013/12/28 职场文书
装修五一活动策划案
2014/01/23 职场文书
婚纱摄影师求职信
2014/03/07 职场文书
公司租房协议书范本
2014/10/08 职场文书
第28个世界无烟日活动总结
2015/02/10 职场文书
2015年房地产个人工作总结
2015/05/26 职场文书
主持人大赛开场白
2015/05/29 职场文书
品牌形象定位,全面分析
2019/07/23 职场文书