使用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 相关文章推荐
textContent在Firefox下与innerText等效的属性
May 12 Javascript
asp(javascript)全角半角转换代码 dbc2sbc
Aug 06 Javascript
JQuery包裹DOM节点的方法
Jun 11 Javascript
老生常谈遮罩层 滚动条的问题
Apr 29 Javascript
jquery实现图片轮播器
May 23 jQuery
jQuery实现动态删除LI的方法
May 30 jQuery
js如何编写简单的ajax方法库
Aug 02 Javascript
EasyUI在Panel上动态添加LinkButton按钮
Aug 11 Javascript
Vue props用法详解(小结)
Jul 03 Javascript
Vue从TodoList中学父子组件通信
Feb 05 Javascript
three.js利用gpu选取物体并计算交点位置的方法示例
Nov 25 Javascript
jQuery ajax - getScript() 方法和getJSON方法
May 14 jQuery
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
默默简单的写了一个模板引擎
2007/01/02 PHP
PHP将两个关联数组合并函数提高函数效率
2014/03/18 PHP
destoon实现VIP排名一直在前面排序的方法
2014/08/21 PHP
php服务器的系统详解
2019/10/12 PHP
JavaScript表达式:URL 协议介绍
2013/03/10 Javascript
JavaScript中的连字符详解
2013/11/28 Javascript
Nodejs异步回调的优雅处理方法
2014/09/25 NodeJs
PHP使用方法重载实现动态创建属性的get和set方法
2014/11/17 Javascript
简介可以自动完成UI的AngularJS工具angular-smarty
2015/06/23 Javascript
jQuery实现默认是闭合的FAQ展开效果菜单
2015/09/14 Javascript
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
深入研究React中setState源码
2017/11/17 Javascript
详解使用uni-app开发微信小程序之登录模块
2019/05/09 Javascript
详解Python中find()方法的使用
2015/05/18 Python
浅谈Python爬取网页的编码处理
2016/11/04 Python
详谈Python高阶函数与函数装饰器(推荐)
2017/09/30 Python
python使用threading获取线程函数返回值的实现方法
2017/11/15 Python
Python编程argparse入门浅析
2018/02/07 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
python对csv文件追加写入列的方法
2019/08/01 Python
pytorch masked_fill报错的解决
2020/02/18 Python
python 写一个文件分发小程序
2020/12/05 Python
CSS3的transition和animation的用法实例介绍
2014/08/20 HTML / CSS
美国亚洲时尚和美容产品的一站式网上商店:Stylevana
2019/09/05 全球购物
在C语言中实现抽象数据类型什么方法最好
2014/06/26 面试题
农民工创业典型事迹
2014/01/25 职场文书
爱国卫生月实施方案
2014/02/21 职场文书
yy婚礼司仪主持词
2014/03/14 职场文书
《海伦?凯勒》教学反思
2014/04/17 职场文书
县政府班子个人对照检查材料
2014/10/05 职场文书
2014光棍节单身联谊活动策划书
2014/10/10 职场文书
精神病医院见习报告
2014/11/03 职场文书
教师学期个人总结
2015/02/11 职场文书
2015年党务工作者个人工作总结
2015/10/22 职场文书
读后感怎么写?书写读后感的基本技巧!
2019/12/10 职场文书
pandas中DataFrame重置索引的几种方法
2021/05/24 Python