使用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多线程的实现方法
May 08 Javascript
谷歌浏览器 insertCell与appendChild的区别
Feb 12 Javascript
Extjs学习笔记之九 数据模型(上)
Jan 11 Javascript
JavaScript中的property和attribute介绍
Dec 26 Javascript
js数组方法扩展实现数组统计函数
Apr 09 Javascript
JavaScript中getUTCSeconds()方法的使用详解
Jun 11 Javascript
AngularJs 弹出模态框(model)
Apr 07 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
Nov 24 Javascript
微信小程序动态显示项目倒计时效果
Jun 13 Javascript
手动用webpack搭建第一个ReactApp的示例
Apr 11 Javascript
在小程序开发中使用npm的方法
Oct 17 Javascript
vue 中 elment-ui table合并上下两行相同数据单元格
Dec 26 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中通过ADO调用Access数据库的方法测试不通过
2006/12/31 PHP
js 优化次数过多的循环 考虑到性能问题
2011/03/05 Javascript
基于jquery ajax 用户无刷新登录方法详解
2012/04/28 Javascript
原生javascript实现图片按钮切换
2015/01/12 Javascript
JavaScript让Textarea支持tab按键的方法
2015/06/26 Javascript
第一次接触JS require.js模块化工具
2016/04/17 Javascript
基于jquery实现表格内容筛选功能实例解析
2016/05/09 Javascript
从0开始学Vue
2016/10/27 Javascript
jquery实现百叶窗效果
2017/01/12 Javascript
基于angular实现模拟微信小程序swiper组件
2017/06/11 Javascript
AngularJS集合数据遍历显示的实例
2017/12/27 Javascript
微信小程序人脸识别功能代码实例
2019/05/07 Javascript
简谈创建React Component的几种方式
2019/06/15 Javascript
Vue实现星级评价效果实例详解
2019/12/30 Javascript
python实现2014火车票查询代码分享
2014/01/10 Python
基于python爬虫数据处理(详解)
2017/06/10 Python
python字典操作实例详解
2017/11/16 Python
使用Python脚本从文件读取数据代码实例
2020/01/19 Python
Django使用Celery加redis执行异步任务的实例内容
2020/02/20 Python
如何查看python关键字
2021/01/17 Python
amazeui模态框弹出后立马消失并刷新页面
2020/08/19 HTML / CSS
土耳其家居建材网站:Koçtaş
2016/11/22 全球购物
美国机场停车位预订:About Airport Parking
2018/03/26 全球购物
Hawes & Curtis官网:英国经典品牌
2019/07/27 全球购物
Ruby如何创建一个线程
2013/03/10 面试题
DELPHI中如何调用API,可举例说明
2014/01/16 面试题
《猫》教学反思
2014/02/26 职场文书
观看《永远的雷锋》心得体会
2014/03/12 职场文书
年终晚会活动方案
2014/08/21 职场文书
优秀教师申报材料
2014/12/16 职场文书
学年个人总结范文
2015/03/05 职场文书
端午节寄语2015
2015/03/23 职场文书
会议营销主持词
2015/07/03 职场文书
2015迎新晚会活动总结
2015/07/16 职场文书
golang json数组拼接的实例
2021/04/28 Golang
2021年国漫热度排行前十,完美世界上榜,第四是美国动画作品
2022/03/18 国漫