使用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 相关文章推荐
使用闭包对setTimeout进行简单封装避免出错
Jul 10 Javascript
探寻Javascript执行效率问题
Nov 12 Javascript
JavaScritp添加url参数并将参数加入到url中及更改url参数的方法
Oct 26 Javascript
浅析JavaScript 箭头函数 generator Date JSON
May 23 Javascript
js 弹出对话框(遮罩)透明,可拖动的简单实例
Jul 11 Javascript
jQuery实现拖拽可编辑模块功能代码
Jan 12 Javascript
Linux使用Node.js建立访问静态网页的服务实例详解
Mar 21 Javascript
详谈jQuery.load()和Jsp的include的区别
Apr 12 jQuery
JS非空验证及邮箱验证的实例
Aug 11 Javascript
灵活使用console让js调试更简单的方法步骤
Apr 23 Javascript
vue子传父关于.sync与$emit的实现
Nov 05 Javascript
小程序api实现promise封装过程解析
Nov 21 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
ThinkPHP处理Ajax返回的方法
2014/11/22 PHP
fckeditor上传文件按日期存放及重命名方法
2015/05/22 PHP
基于命令行执行带参数的php脚本并取得参数的方法
2016/01/25 PHP
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
php版微信公众平台入门教程之开发者认证的方法
2016/09/26 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
2019/10/08 PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
2020/05/15 PHP
用JavaScript和注册表脚本实现右键收藏Web页选中文本
2007/01/28 Javascript
JavaScript 输入框内容格式验证代码
2010/02/11 Javascript
匹配任意字符的正则表达式写法
2010/04/29 Javascript
checkbox选中与未选中判断示例
2014/08/04 Javascript
javascript使用输出语句实现网页特效代码
2015/08/06 Javascript
jquery trigger函数执行两次的解决方法
2016/02/29 Javascript
javascript类型系统——undefined和null全面了解
2016/07/13 Javascript
Vue.js中数据绑定的语法教程
2017/06/02 Javascript
ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
2017/06/14 Javascript
AngularJS 最常用的八种功能(基础知识)
2017/06/26 Javascript
jQuery绑定事件方法及区别(bind,click,on,live,one)
2017/08/14 jQuery
详解操作虚拟dom模拟react视图渲染
2018/07/25 Javascript
vuejs2.0运用原生js实现简单拖拽元素功能
2020/08/21 Javascript
Vue项目引发的「过滤器」使用教程
2019/03/12 Javascript
JS如何生成动态列表
2020/09/22 Javascript
[40:57]TI4 循环赛第二日 iG vs EG
2014/07/11 DOTA
[56:24]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第二局
2016/03/04 DOTA
python实现将excel文件转化成CSV格式
2018/03/22 Python
python pandas 对时间序列文件处理的实例
2018/06/22 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
全球速卖通西班牙站:AliExpress西班牙
2017/10/30 全球购物
Manduka官网:瑜伽垫、瑜伽毛巾和服装
2018/07/02 全球购物
OSPF有什么优点?为什么OSPF比RIP收敛快?
2013/02/13 面试题
城市精细化管理实施方案
2014/03/04 职场文书
个人三严三实对照检查材料思想汇报
2014/09/22 职场文书
2015届大学生就业推荐表自我评价
2014/09/27 职场文书
2019奶茶店创业计划书范本,值得你借鉴
2019/08/14 职场文书
php字符串倒叙
2021/04/01 PHP
利用Nginx代理如何解决前端跨域问题详析
2021/04/02 Servers