最近有一个小需求,需要根据用户输入的某宝的店铺 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. 剑指Offer——二叉树

    剑指Offer--二叉树 前言 数据结构通常是编程面试中考察的重点.在参加面试之前,应聘者需要熟练掌握链表.树.栈.队列和哈希表等数据结构,以及它们的操作.本片博文主要讲解二叉树操作的相关知识,主要包 ...

  2. java实现异步调用实例

    在JAVA平台,实现异步调用的角色有如下三个角色: 调用者 取货凭证   真实数据 一个调用者在调用耗时操作,不能立即返回数据时,先返回一个取货凭证.然后在过一断时间后凭取货凭证来获取真正的数据.  ...

  3. vbox centos安装增强工具

    就是虚拟机识别不了宿主机的usb接口,这个虚拟机有没有图形界面,看看怎么装. 一个是依赖包问题,另一个就是挂了安装包,但是我怎么找到它并安装上去的问题. 虚拟机是centos6.6哈 vbox4.3. ...

  4. 盘点:2016中国百强地产CIO高峰论坛的8大看点

    2016年中国百强地产CIO高峰论坛将于2016年6月16日至18日在浙江湖州举行,届时百余位地产公司CIO将出席大会,共同探讨新形势下如何重塑IT价值,增强地产公司的市场竞争力和盈利能力. 此次大会 ...

  5. React Native入门教程2 -- 基本组件使用及样式

    在上一篇文章中,我们学会了如何搭建React Native的环境(React Native入门教程(笔记) 1 – 开发环境搭建),不知道你们是否搭建好了呢,如果还没有,那么快动起小手,来体验RN带给 ...

  6. nginx 详解反向代理负载均衡

    什么是反向代理负载均衡 使用代理服务器可以将请求转发给内部的Web服务器,使用这种加速模式显然可以提升静态网页的访问速度.因此也可以考虑使用这种技术,让代理服务器将请求 均匀转发给多台内部Web服务器 ...

  7. Chapter 2 User Authentication, Authorization, and Security(8):创建映射到登录名的数据库用户

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/38944121,专题目录:http://blog.csdn.net/dba_huangzj ...

  8. Microsoft Office Excel cannot access the file, There are several possible reasons

    今天在做EXCEL打印读取模板时报错了,错误信息如下: Microsoft Excel cannot access the file 'D:\xx.xlsx'. There are several p ...

  9. Css详解之(选择器)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. Shell脚本的调试技术

    编程中必不可少的一点就是调试,Shell脚本以其强大的功能令人向往,当然,它的强大之处不只是体现在语言的实现功能上,更强大的是它的调试功能,下面,我将以实例讲解Shell脚本的调试技术. 下面是我所用 ...