使用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与Prototype并存的冲突的解决方法
Aug 29 Javascript
JS高级拖动技术 setCapture,releaseCapture
Jul 31 Javascript
JS 实现列表与多选框选择附预览动画
Oct 29 Javascript
zepto.js中tap事件阻止冒泡的实现方法
Feb 12 Javascript
模拟javascript中的sort排序(简单实例)
Aug 17 Javascript
JavaScript如何实现图片懒加载(lazyload) 提高用户体验(增强版)
Nov 30 Javascript
浅谈ajax请求不同页面的微信JSSDK问题
Feb 26 Javascript
JS中使用cavas截图网页并解决跨域及模糊问题
Nov 13 Javascript
es6基础学习之解构赋值
Dec 10 Javascript
Vue调用后端java接口的实例代码
Oct 28 Javascript
ES6的异步操作之promise用法和async函数的具体使用
Dec 06 Javascript
浅谈JavaScript节流和防抖函数
Aug 25 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
自动生成文章摘要的代码[JavaScript 版本]
2007/03/20 Javascript
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
Javascript 面向对象编程(coolshell)
2012/03/18 Javascript
NodeJs中的非阻塞方法介绍
2012/06/05 NodeJs
关于javascript event flow 的一个bug详解
2013/09/17 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
2014/09/03 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
JavaScript中的acos()方法使用详解
2015/06/14 Javascript
javascript解析xml实现省市县三级联动的方法
2015/07/25 Javascript
纯css下拉菜单 无需js
2016/08/15 Javascript
BootStrap CSS全局样式和表格样式源码解析
2017/01/20 Javascript
vue使用ElementUI时导航栏默认展开功能的实现
2018/07/04 Javascript
详解JavaScript函数callee、call、apply的区别
2019/03/08 Javascript
了解javascript中let和var及const关键字的区别
2019/05/24 Javascript
小程序实现短信登录倒计时
2019/07/12 Javascript
vuex管理状态仓库使用详解
2020/07/29 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
2020/09/14 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
py2exe 编译ico图标的代码
2013/03/08 Python
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
2016/12/14 Python
python flask安装和命令详解
2019/04/02 Python
基于python的ini配置文件操作工具类
2019/04/24 Python
Python通用函数实现数组计算的方法
2019/06/13 Python
anaconda如何查看并管理python环境
2019/07/05 Python
Python交互式图形编程的实现
2019/07/25 Python
Python collections中的双向队列deque简单介绍详解
2019/11/04 Python
Django更新models数据库结构步骤
2020/04/01 Python
七年级英语教学反思
2014/01/15 职场文书
自荐书范文范例
2014/02/13 职场文书
一年级班主任感言
2014/03/08 职场文书
绿化工程实施方案
2014/03/17 职场文书
银行竞聘报告范文
2014/11/06 职场文书
学校2015年纠风工作总结
2015/05/15 职场文书
导游词之镇江西津古渡
2019/11/06 职场文书
22句经典语录:送给优柔寡断和胡思乱想的朋友们
2019/12/13 职场文书
python基于tkinter制作m3u8视频下载工具
2021/04/24 Python