使用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 相关文章推荐
JavaScript继承方式实例
Oct 29 Javascript
jQuery源码分析-05异步队列 Deferred 使用介绍
Nov 14 Javascript
picLazyLoad 实现图片延时加载(包含背景图片)
Jul 21 Javascript
Bootstrap入门教程一Hello Bootstrap初识
Mar 02 Javascript
原生JS实现不断变化的标签
May 22 Javascript
JavaScript实现的可变动态数字键盘控件方式实例代码
Jul 15 Javascript
js禁止表单重复提交
Aug 29 Javascript
VueAwesomeSwiper在VUE中的使用以及遇到的一些问题
Jan 11 Javascript
Node.js利用console输出日志文件的方法示例
Apr 27 Javascript
vue计算属性computed的使用方法示例
Mar 13 Javascript
安装多版本Vue-CLI的实现方法
Mar 24 Javascript
Openlayers实现地图全屏显示
Sep 28 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程序的php代码
2008/04/07 PHP
为PHP初学者的8点有效建议
2010/11/20 PHP
php中magic_quotes_gpc对unserialize的影响分析
2014/12/16 PHP
四个PHP非常实用的功能
2015/09/29 PHP
php array_keys 返回数组的键名
2016/10/25 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
js 小贴士一星期合集
2010/04/07 Javascript
再论Javascript下字符串连接的性能
2011/03/05 Javascript
javascript时区函数介绍
2012/09/14 Javascript
Js+Jq获取URL参数的集中方法示例代码
2014/05/20 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
2014/08/19 Javascript
原生JavaScript实现瀑布流布局
2020/06/28 Javascript
bootstrap IE8 兼容性处理
2017/03/22 Javascript
使用异步组件优化Vue应用程序的性能
2019/04/28 Javascript
layui点击左侧导航栏,实现不刷新整个页面,只刷新局部的方法
2019/09/25 Javascript
微信小程序开发打开另一个小程序的实现方法
2020/05/17 Javascript
解决vue 退出动画无效的问题
2020/08/09 Javascript
Python中的异常处理简明介绍
2015/04/13 Python
在Django的模型和公用函数中使用惰性翻译对象
2015/07/27 Python
简单讲解Python中的闭包
2015/08/11 Python
详解python里使用正则表达式的全匹配功能
2017/10/19 Python
Python使用matplotlib简单绘图示例
2018/02/01 Python
Python3实现转换Image图片格式
2018/06/21 Python
详解Django的CSRF认证实现
2018/10/09 Python
python DataFrame 取差集实例
2019/01/30 Python
Python logging日志模块 配置文件方式
2020/07/12 Python
家得宝墨西哥官网:The Home Depot墨西哥
2019/11/18 全球购物
上海雨人软件技术开发有限公司测试题
2015/07/14 面试题
小学语文国培感言
2014/03/04 职场文书
幼儿老师求职信
2014/06/30 职场文书
2014基层党员批评与自我批评范文
2014/09/24 职场文书
银行保安拾金不昧表扬稿
2015/05/05 职场文书
宪法宣传标语100条
2019/10/15 职场文书
Golang二维切片初始化的实现
2021/04/08 Golang
MongoDB使用profile分析慢查询的步骤
2021/04/30 MongoDB
Win11 引入 Windows 365 云操作系统,适应疫情期间混合办公模式:启动时直接登录、模
2022/04/06 数码科技