使用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 相关文章推荐
DOM 基本方法
Jul 18 Javascript
JavaScript初学者应注意的七个细节小结
Jan 30 Javascript
7个JS基础知识总结
Mar 05 Javascript
js调用百度地图及调用百度地图的搜索功能
Sep 07 Javascript
jQuery实现三级菜单的代码
May 09 Javascript
jQuery基本选择器(实例及表单域value的获取方法)
May 20 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
Jun 06 Javascript
JS编写函数实现对身份证号码最后一位的验证功能
Dec 29 Javascript
JS实现图片放大缩小的方法
Feb 15 Javascript
详解angular element()方法使用
Apr 08 Javascript
Node 搭建一个静态资源服务器的实现
May 20 Javascript
JS实现网页端猜数字小游戏
Mar 06 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
SONY ICF-F10中波修复记
2021/03/02 无线电
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
2013/11/14 PHP
解决Codeigniter不能上传rar和zip压缩包问题
2014/03/07 PHP
PHP实现事件机制的方法
2015/07/10 PHP
Laravel5.4简单实现app接口Api Token认证方法
2019/08/29 PHP
关于js datetime的那点事
2011/11/15 Javascript
js字符编码函数区别分析
2011/12/28 Javascript
nodejs之请求路由概述
2014/07/05 NodeJs
批量下载对路网图片并生成html的实现方法
2016/06/07 Javascript
js css实现垂直方向自适应的三角提示菜单
2016/06/26 Javascript
微信小程序 教程之wxapp视图容器 swiper
2016/10/19 Javascript
使用node.js中的Buffer类处理二进制数据的方法
2016/11/26 Javascript
微信小程序获取循环元素id以及wx.login登录操作
2017/08/17 Javascript
详解vue中组件参数
2018/07/09 Javascript
JSON基本语法及与JavaScript的异同实例分析
2019/01/04 Javascript
Python机器学习算法之k均值聚类(k-means)
2018/02/23 Python
python实现人脸识别经典算法(一) 特征脸法
2018/03/13 Python
Python简单实现查找一个字符串中最长不重复子串的方法
2018/03/26 Python
Python生成任意范围任意精度的随机数方法
2018/04/09 Python
对python中的six.moves模块的下载函数urlretrieve详解
2018/12/19 Python
python实现狄克斯特拉算法
2019/01/17 Python
Python3实现的判断回文链表算法示例
2019/03/08 Python
numpy.random模块用法总结
2019/05/27 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
2020/04/30 Python
Python flask框架端口失效解决方案
2020/06/04 Python
通过实例解析python and和or使用方法
2020/11/14 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
2021/02/23 Python
结合CSS3的布局新特征谈谈常见布局方法
2016/01/22 HTML / CSS
HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述
2013/01/30 HTML / CSS
洲际酒店集团大中华区:IHG中国
2016/08/17 全球购物
美国东北部户外服装和设备零售商:Eastern Mountain Sports
2016/10/05 全球购物
华为python面试题
2016/05/03 面试题
2014年迎新年活动方案
2014/02/19 职场文书
幼儿园父亲节活动方案
2014/03/11 职场文书
学校领导干部民主生活会整改方案
2014/09/29 职场文书
安装Ruby和 Rails的详细步骤
2022/04/19 Ruby