最近有一个小需求,需要根据用户输入的某宝的店铺 url,检查地址是否存在,并抓取店铺名称。某宝店铺 url 的 title 通常是 xx-xx-xx 的形式,中间的 xx 就是对应的店铺名称。

这个需求很简单,根据 url 直接发送 get 请求,利用 cheerio 解析得到的 html 文件,就可以获得 title 的内容,再切割字符串就可以获得店铺名称。

为了验证某宝店铺页面的 title 均是 xx-xx-xx 形式,并且中间的 xx 就是店铺名称,就要搜索大量店铺页面名称。一个个查看即耗时间也不实际,于是决定利用爬虫快速获取店铺名称。其实爬虫的基本思路并不难,更重要的在于分析页面结构,以获取需要的内容。

页面大致分为3种情况:

① 直出页面,获取到 html 文件就可以解析需要的内容

② 动态页面,所需内容是数据通过接口获得的,直接请求接口即可

③ 动态页面,找不到相关数据接口,借助 PhantomJS 获取完整的页面

怎样能快速获得大量的店铺 url 呢?某宝的宝贝列表中,宝贝信息其实是包含了该宝贝所在店铺首页的链接,通过宝贝列表就可以快速获得店铺 url。通过分析页面,很不幸,宝贝列表是脚本动态加载的,并且找不到相关数据的接口,唯有借助 PhantomJS 了。PhantomJS 虽然强大,但性能并不是很好,不过为了满足我的好奇心,足够了。

PhantomJS

PhantomJS 是一个 webkit 的 JavaScript API,相当于一个阉割版的浏览器,详情可查看官网

PhantomJS 获取并解析页面的语法也很简单,完整demo

// page。open 打开并加载 url,这里的 url 为宝贝列表页面
page.open(url, function (s) {
  console.log('index ' + index + ' ' + s)
  if (s === 'success') {
    setTimeout(function () {
      // page.evaluate 用于解析页面内容,详情请看官网  
      const shopUrl = page.evaluate(function () {
        const urls = []
        const ele = document.getElementsByClassName('J_ShopInfo')
        for(var i = 0, len = ele.length; i < len; ++i) {
          const item = ele[i]
          urls.push(item.href)
        }
        return urls
      })
      getTitle(shopUrl, 0, getShopsName(index + 44, max))
    }, 1500)
  } })
getTitle 用于获取店铺首页 url 的 title
function getTitle (urls, i, cb) {
if (i < urls.length) {
const url = urls[i]
page.open(url, function(s) {
if (s === 'success') {
const result = page.evaluate(function () {
return document.title
})
console.log(i + ' ' + result)
titles.push(result)
getTitle (urls, i + 1, cb)
}
})
} else {
cb && cb()
}
}

在访问宝贝列表页面和店铺页面时,由于某宝的反爬虫措施,这里都用了递归搜索,确保不是并发请求页面,否则页面会获取失败。setTimeout 是为了等待页面中所需内容已加载后再解析。如果获取到页面后立即解析,只会得到一个几乎空白的页面。

由于页面都包含大量的图片信息,可以通过设置

page.settings.loadImages = false

不加载内联图片,减少 PhantomJS 的性能消耗。

让程序自己一直循环执行,就可以获取到大量的数据啦

phantomjs 爬去动态页面的更多相关文章

  1. selenium+phantomjs爬取动态页面数据

    1.安装selenium pip/pip3 install selenium 注意依赖关系 2.phantomjs for windows 下载地址:http://phantomjs.org/down ...

  2. Scrapy 爬取动态页面

    目前绝大多数的网站的页面都是冬天页面,动态页面中的部分内容是浏览器运行页面中的JavaScript 脚本动态生成的,爬取相对比较困难 先来看一个很简单的动态页面的例子,在浏览器中打开 http://q ...

  3. Python 爬虫实例(8)—— 爬取 动态页面

    今天使用python 和selenium爬取动态数据,主要是通过不停的更新页面,实现数据的爬取,要爬取的数据如下图 源代码: #-*-coding:utf-8-*- import time from ...

  4. selenium + PhantomJS 爬取js页面

    from selenium import webdriver import time _url="http://xxxxxxxx.com" driver = webdriver.P ...

  5. selenium自动化测试爬取动态页面大全

    目录 一:浏览器信息测试 二:查找结点 三:测试动作 四:获取节点信息 五:切换子页面Frame 六,延时请求 七:前进和后退 八:Cookies 八:选项卡处理 九:捕获异常   这里之讲解用法,安 ...

  6. 爬虫系列5:scrapy动态页面爬取的另一种思路

    前面有篇文章给出了爬取动态页面的一种思路,即应用Selenium+Firefox(参考<scrapy动态页面爬取>).但是selenium需要运行本地浏览器,比较耗时,不太适合大规模网页抓 ...

  7. scrapy使用PhantomJS爬取数据

    环境:python2.7+scrapy+selenium+PhantomJS 内容:测试scrapy+PhantomJS 爬去内容:涉及到js加载更多的页面 原理:配置文件打开中间件+修改proces ...

  8. Python+Selenium爬取动态加载页面(1)

    注: 最近有一小任务,需要收集水质和水雨信息,找了两个网站:国家地表水水质自动监测实时数据发布系统和全国水雨情网.由于这两个网站的数据都是动态加载出来的,所以我用了Selenium来完成我的数据获取. ...

  9. phantomjs+selenium实现爬取动态网址

    之前使用 selenium + firefox驱动浏览器来实现爬取动态网址,但是firefox经常更新,更新后时常会导致webdriver启动不来,所以改用phantomjs+selenium来改善一 ...

随机推荐

  1. BCD码与16进制互转算法

    关于这类算法,以前的文章已经讲过类似的:BCD码转二进制 #include <stdio.h> // HEX转BCD //bcd_data(<0x255,>0) unsigne ...

  2. 4. React 属性和状态介绍

            React 中的属性和状态初看之下可以互相替代,但是在 React 的设计哲学中两者有着截然不同的使用方式和使用场景. 属性的含义和用法         props = propert ...

  3. android自定义xmls文件属性

    在使用到自定义View的xml布局文件中需要加入xmlns:前缀=http://schemas.android.com/apk/res/你的自定义View所在的包路径. 下面是一个简单的例子: 结构图 ...

  4. linux常用的内核镜像格式

    linux常用的内核镜像格式 Linux内核有多种格式的镜像,包括vmlinux.Image.zImage等. 1.     Linux内核镜像格式 1.1 vmlinux vmlinuz是可引导的. ...

  5. Spark技术内幕:Worker源码与架构解析

    首先通过一张Spark的架构图来了解Worker在Spark中的作用和地位: Worker所起的作用有以下几个: 1. 接受Master的指令,启动或者杀掉Executor 2. 接受Master的指 ...

  6. Fork And Join框架初探

    首先,关于Fork And Join框架的入门资料我觉得最好的是: Java线程(十一):Fork/Join-Java并行计算框架 本文参考了这篇文章 Fork/Join框架的核心类是ForkJoin ...

  7. 新手学python(1):解析XML与系统调用

    最近需要做一个项目,完成一批音乐的格式转换.由于之前并未学习过python,所以想借此机会学一下.在介绍自己的学习过程之前,先把项目简要描述一下.目前在一台服务器a上有几十万首原始的MP3音乐文件,现 ...

  8. mac 下终端 操作svn命令 以及出现证书错误的处理方法

    首先,转载地址:http://hi.baidu.com/zhu410289616/item/eaaf160f60eb0dc62f4c6b0e 还有一个地址:http://www.cnblogs.com ...

  9. HTML5 classList API接口

    原文地址:HTML5 classList API 原文日期: 2010年07月13日 翻译日期: 2013年08月23日 当我陷入JavaScrip和JavaScript类库框架之中时,我总是有种希望 ...

  10. 青年菜君与小农女送菜商业模式PK

    青年菜君与小农女送菜商业模式PK   对比项 青年菜君 小农女送菜 优势 劣势 开业 2014年3月3日 2013年9月 渠道 地铁捕获用户 写字楼配送 送货 来店面自取 送货到写字楼 菜君 1.减少 ...