phantomjs 爬去动态页面
最近有一个小需求,需要根据用户输入的某宝的店铺 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 爬去动态页面的更多相关文章
- selenium+phantomjs爬取动态页面数据
1.安装selenium pip/pip3 install selenium 注意依赖关系 2.phantomjs for windows 下载地址:http://phantomjs.org/down ...
- Scrapy 爬取动态页面
目前绝大多数的网站的页面都是冬天页面,动态页面中的部分内容是浏览器运行页面中的JavaScript 脚本动态生成的,爬取相对比较困难 先来看一个很简单的动态页面的例子,在浏览器中打开 http://q ...
- Python 爬虫实例(8)—— 爬取 动态页面
今天使用python 和selenium爬取动态数据,主要是通过不停的更新页面,实现数据的爬取,要爬取的数据如下图 源代码: #-*-coding:utf-8-*- import time from ...
- selenium + PhantomJS 爬取js页面
from selenium import webdriver import time _url="http://xxxxxxxx.com" driver = webdriver.P ...
- selenium自动化测试爬取动态页面大全
目录 一:浏览器信息测试 二:查找结点 三:测试动作 四:获取节点信息 五:切换子页面Frame 六,延时请求 七:前进和后退 八:Cookies 八:选项卡处理 九:捕获异常 这里之讲解用法,安 ...
- 爬虫系列5:scrapy动态页面爬取的另一种思路
前面有篇文章给出了爬取动态页面的一种思路,即应用Selenium+Firefox(参考<scrapy动态页面爬取>).但是selenium需要运行本地浏览器,比较耗时,不太适合大规模网页抓 ...
- scrapy使用PhantomJS爬取数据
环境:python2.7+scrapy+selenium+PhantomJS 内容:测试scrapy+PhantomJS 爬去内容:涉及到js加载更多的页面 原理:配置文件打开中间件+修改proces ...
- Python+Selenium爬取动态加载页面(1)
注: 最近有一小任务,需要收集水质和水雨信息,找了两个网站:国家地表水水质自动监测实时数据发布系统和全国水雨情网.由于这两个网站的数据都是动态加载出来的,所以我用了Selenium来完成我的数据获取. ...
- phantomjs+selenium实现爬取动态网址
之前使用 selenium + firefox驱动浏览器来实现爬取动态网址,但是firefox经常更新,更新后时常会导致webdriver启动不来,所以改用phantomjs+selenium来改善一 ...
随机推荐
- shell入门之函数应用
最近在学习shell编程,文中若有错误的地方还望各位批评指正. 先来看一个简单的求和函数 #!/bin/bash #a test about function f_sum 7 8 function f ...
- popupwindow和listview
在使用PopupWindow的时候,有一个不好的地方就是不太好设置弹出窗体的大小.如果指定绝对大小,那么对于不同分辨率不同尺寸的手机来说,显示出来效果会不同,从而导致用户体验不佳. 为了达到Popup ...
- Android 基于MVC的MVVM模式开发
由skay整理 http://blog.csdn.net/sk719887916/article/details/50386144 什么是MVVM 我们一步步来,从MVC开始. MVC 我们都知道, ...
- 【一天一道LeetCode】#130. Surrounded Regions
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- Python 编程常见问题
Python 编程常见问题 经常使用Python编程,把经常遇到问题在这里记录一下,省得到网上查找,因此这篇文章会持续更新,需要的可以Mark一下.进入正题: 1.Python常用的文件头声明 #!/ ...
- Oracle Enterprise Linux 64-bit 下Oracle11g的监听配置修改及测试步骤
测试环境:Oracle Enterprise Linux 64-bit (5.8版本) + Oracle 11g 64位 相关说明: Oracle11g64位软件的安装位置为/u01/app/orac ...
- ActivityManagerService启动过程分析
之前讲Android的View的绘制原理和流程的时候,讲到过在Android调用setContentView之后,Android调用了一个prepreTravle的方法,这里面就提到了Activity ...
- Ajax 初步学习总结
Ajax是什么 Ajax是(Asynchronous JavaScript And XML)是异步的JavaScript和xml.也就是异步请求更新技术.Ajax是一种对现有技术的一种新的应用,不是一 ...
- javascript语法之函数案例练习
需求:文本框内输入月份,弹窗提示本月天数. 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&qu ...
- JAVA之旅(六)——单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖
JAVA之旅(六)--单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖 java也越来越深入了,大家加油吧!咱们一步步来 一.单例设计模式 什么是设计模式? JAVA当中有 ...