使用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 相关文章推荐
onsubmit阻止form表单提交与onclick的相关操作
Sep 03 Javascript
JQuery.ajax传递中文参数的解决方法 推荐
Mar 28 Javascript
js弹出div并显示遮罩层
Feb 12 Javascript
js生成验证码并直接在前端判断
May 15 Javascript
AngularJS进行性能调优的7个建议
Dec 28 Javascript
JavaScript如何实现组合列表框中元素移动效果
Mar 01 Javascript
JavaScript 事件对内存和性能的影响
Jan 22 Javascript
JS 实现随机验证码功能
Feb 15 Javascript
JavaScript仿微信打飞机游戏
Jul 05 Javascript
微信小程序开发问题之wx.previewImage
Dec 25 Javascript
vue实现固定位置显示功能
May 30 Javascript
python实现迭代法求方程组的根过程解析
Nov 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
php !function_exists("T7FC56270E7A70FA81A5935B72EACBE29"))代码解密
2011/01/07 PHP
PHP中把stdClass Object转array的几个方法
2014/05/08 PHP
Yii实现多按钮保存与提交的方法
2014/12/03 PHP
php 7新特性之类型申明详解
2017/06/06 PHP
php实现的双色球算法示例
2017/06/20 PHP
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
JavaScript在IE中“意外地调用了方法或属性访问”
2008/11/19 Javascript
基于jQuery的自动完成插件
2011/02/03 Javascript
常用一些Javascript判断函数
2012/08/14 Javascript
jQuery修改CSS伪元素属性的方法
2014/07/30 Javascript
js实现获取当前时间是本月第几周的方法
2015/08/11 Javascript
js精美的幻灯片画集特效代码分享
2015/08/29 Javascript
jquery zTree异步加载简单实例讲解
2016/02/25 Javascript
jQuery 获取多选框的值及多选框中文的函数
2016/05/16 Javascript
jQuery Ajax 全局调用封装实例代码详解
2016/06/02 Javascript
实例分析nodejs模块xml2js解析xml过程中遇到的坑
2017/03/18 NodeJs
基于vue+ bootstrap实现图片上传图片展示功能
2017/05/17 Javascript
JavaScript实现图片本地预览功能【不用上传至服务器】
2017/09/20 Javascript
jQuery实现左右滑动的toggle方法
2018/03/03 jQuery
ES6与CommonJS中的模块处理的区别
2018/06/13 Javascript
JS实现动态生成html table表格的方法分析
2018/07/11 Javascript
JS实现单张或多张图片持续无缝滚动的示例代码
2020/05/10 Javascript
JSONObject与JSONArray使用方法解析
2020/09/28 Javascript
[01:04:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第二场 1月31日
2021/03/11 DOTA
Python语言实现机器学习的K-近邻算法
2015/06/11 Python
Python使用pydub库对mp3与wav格式进行互转的方法
2019/01/10 Python
基于python实现matlab filter函数过程详解
2020/06/08 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
2020/12/21 Python
Desigual德国官网:在线购买原创服装
2018/03/27 全球购物
时尚孕妇装:Ingrid & Isabel
2019/05/08 全球购物
恐龙的灭绝教学反思
2014/02/12 职场文书
银行职员自我鉴定
2014/04/20 职场文书
保护黄河倡议书
2014/05/16 职场文书
党的群众路线对照检查材料
2014/09/22 职场文书
反腐倡廉剖析材料
2014/09/30 职场文书
优质护理心得体会
2016/01/22 职场文书