Python 爬虫 PhantomJs 获取JS动态数据

字数2034 阅读2900 评论16 喜欢8

上篇文章我非常high的爬取了一个正常网页的数据
对是正常

不正常的来了

这次研究的就是那些“不正常”的网页 当时是我太天真 后面发现水又深
介于现在JS H5的大趋势 大部分网站都是混入了JS数据加载 数据是延迟加载的

这样如果我们用原始的urllib.open(url) 加载出来的都是还没有加载js数据之前的 所以爆炸了

所以按照上篇文章那么正常的提取数据显然不可取了 那毕竟那是静态的 战场上 敌人也不会像抗日神剧剧情一样让你当靶子不是

我当时的想法就是要让让网页JS渲染数据加载完全了 我们才开始解析 这样才行 想想就行了 然而我并不会

并不会

后面查了一些资料

  • 无非两种实现
    1 分析JS源码 找出请求 自己模拟实现 难度比较高 麻烦
    2 模拟浏览器实现 三方库多 简单 但是效率会慢一点

然后搜到了很多相关的库 这里使用的是 Selenium + PhantomJs 网上推荐比较多

  • Selenium是一个用于Web应用程序测试的工具
  • Phantom JS是一个服务器端的 JavaScript API 的 WebKit

看了一下Selenium的Api 发现没有PhantomJS 他也可以使用FireFox来实现如同PhantomJs的功能
介于网上都是推荐PhantomJS 所以我也这样实现
Selenium就像一个大容器 里面放着PhantomJs来实现JS的渲染 我们直接操作Selenium的Api就行

这次选取的目标是 淘宝模特的网站 为什么是这个呢 除了美女多

美女多就够了

还有就是我学习的资料就是用的这个
Python学习的网站这个里面就是用这个作为实例
但是这个后续可能因为淘宝改版了网站结构 他的例子不能成功 所以我才研究JS的动态加载

开始套路 这里环境Windows
1 安装Selenium 用Pip 安装 如果Pip不能被找到 记得设置环境变量Python/Script
2 下载PhantomJs 然后将 解压后的执行文件放在被设置过环境变量的地方 不设置的话 后续代码就要设置 所以这里直接放进来方便

Paste_Image.png

这里检查一下

Paste_Image.png

能找到 说明Ok

下面是全部实现代码

官网的一些配置

#coding=utf-8
__author__ = 'Daemon'import urllib2,re,os,datetime
from selenium import webdriverclass Spider:def __init__(self):self.page=1self.dirName='MMSpider'#这是一些配置 关闭loadimages可以加快速度 但是第二页的图片就不能获取了打开(默认)cap = webdriver.DesiredCapabilities.PHANTOMJScap["phantomjs.page.settings.resourceTimeout"] = 1000#cap["phantomjs.page.settings.loadImages"] = False#cap["phantomjs.page.settings.localToRemoteUrlAccessEnabled"] = Trueself.driver = webdriver.PhantomJS(desired_capabilities=cap)def getContent(self,maxPage):for index in range(1,maxPage+1):self.LoadPageContent(index)#获取页面内容提取def LoadPageContent(self,page):#记录开始时间begin_time=datetime.datetime.now()url="https://mm.taobao.com/json/request_top_list.htm?page="+str(page)self.page+=1;USER_AGENT='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.130 Safari/537.36'headers = {'User-Agent':USER_AGENT }request=urllib2.Request(url,headers=headers)response=urllib2.urlopen(request)#正则获取pattern_link=re.compile(r'<div.*?class="pic-word">.*?<img src="(.*?)".*?'r'<a.*?class="lady-name".*?href="(.*?)".*?>(.*?)</a>.*?'r'<em>.*?<strong>(.*?)</strong>.*?'r'<span>(.*?)</span>',re.S)items=re.findall(pattern_link,response.read().decode('gbk'))for item in items:#头像,个人详情,名字,年龄,地区print u'发现一位MM 名字叫%s 年龄%s 坐标%s'%(item[2],item[3],item[4])print u'%s的个人主页是 %s'%(item[2],item[1])print u'继续获取详情页面数据...'#详情页面detailPage=item[1]name=item[2]self.getDetailPage(detailPage,name,begin_time)def getDetailPage(self,url,name,begin_time):url='http:'+urlself.driver.get(url)base_msg=self.driver.find_elements_by_xpath('//div[@class="mm-p-info mm-p-base-info"]/ul/li')brief=''for item in base_msg:print item.textbrief+=item.text+'\n'#保存个人信息icon_url=self.driver.find_element_by_xpath('//div[@class="mm-p-model-info-left-top"]//img')icon_url=icon_url.get_attribute('src')dir=self.dirName+'/'+nameself.mkdir(dir)#保存头像try:self.saveIcon(icon_url,dir,name)except Exception,e:print u'保存头像失败 %s'%e.message#开始跳转相册列表images_url=self.driver.find_element_by_xpath('//ul[@class="mm-p-menu"]//a')images_url=images_url.get_attribute('href')try:self.getAllImage(images_url,name)except Exception,e:print u'获取所有相册异常 %s'%e.messageend_time=datetime.datetime.now()#保存个人信息 以及耗时try:self.saveBrief(brief,dir,name,end_time-begin_time)except Exception,e:print u'保存个人信息失败 %s'%e.message#获取所有图片def getAllImage(self,images_url,name):self.driver.get(images_url)#只获取第一个相册photos=self.driver.find_element_by_xpath('//div[@class="mm-photo-cell-middle"]//h4/a')photos_url=photos.get_attribute('href')#进入相册页面获取相册内容self.driver.get(photos_url)images_all=self.driver.find_elements_by_xpath('//div[@id="mm-photoimg-area"]/a/img')self.saveImgs(images_all,name)def saveImgs(self,images,name):index=1print u'%s 的相册有%s张照片, 尝试全部下载....'%(name,len(images))for imageUrl in images:splitPath = imageUrl.get_attribute('src').split('.')fTail = splitPath.pop()if len(fTail) > 3:fTail = "jpg"fileName = self.dirName+'/'+name +'/'+name+ str(index) + "." + fTailprint u'下载照片地址%s '%fileNameself.saveImg(imageUrl.get_attribute('src'),fileName)index+=1def saveIcon(self,url,dir,name):print u'头像地址%s %s '%(url,name)splitPath=url.split('.')fTail=splitPath.pop()fileName=dir+'/'+name+'.'+fTailprint fileNameself.saveImg(url,fileName)#写入图片def saveImg(self,imageUrl,fileName):print imageUrlu=urllib2.urlopen(imageUrl)data=u.read()f=open(fileName,'wb')f.write(data)f.close()#保存个人信息def saveBrief(self,content,dir,name,speed_time):speed_time=u'当前MM耗时 '+str(speed_time)content=content+'\n'+speed_timefileName=dir+'/'+name+'.txt'f=open(fileName,'w+')print u'正在获取%s的个人信息保存到%s'%(name,fileName)f.write(content.encode('utf-8'))#创建目录def mkdir(self,path):path=path.strip()print u'创建目录%s'%pathif os.path.exists(path):return Falseelse:os.makedirs(path)return Truespider=Spider()
#获取前5页
spider.getContent(5)

效果如下 只获取了第一个相册的第一页的 如果要全部的 还要涉及到模拟下滑加载更多这里先不作了解:

Paste_Image.png

Paste_Image.png

妹子不得来告我吧

闭着眼睛删除

声明一遍 如果有不能展示的 联系我 我会删掉的。。。

Paste_Image.png

现在来分析一下 实现过程

  • 第一页 任务列表 正常网页 看看结构 来用正则获取任务详情页面

Paste_Image.png

Paste_Image.png

  • 页面详情 使用PhantomJS 来加载 然后根据Xpath来获取 XPath是个宝贝啊 特别好用很粗暴一下子可以拿到想要的

粗暴提取

上篇文章有相关资料 不做详细分析 这个丑丑的正则

  1. 基本信息获取 观察结构

    对应的代码

    获取基本信息

  2. 然后头像也是一样

    Paste_Image.png

    获取头像

  3. 获取相册地址 进入相册页面

    获取相册链接

  4. 最后在相册里面获取第一页展示的

相册列表结构分析

拿到相册数据

下载相册内容

到此结束 保存相关信息的代码 上面也给出了 这里不做详细说明

基本分析 就是用google浏览器的F12 来分析结构 然后 抽取内容 感觉Python 相关资料很少啊 尤其是中文的
这个PhantomJs 之所以这里给出分享过程 因为我确实在Google 知乎(度娘更不用说了)上面搜索相关资料很少 别人也就说用这个 也没说咋用 对于新手来讲 还是希望能有一个完整的过程分析

Python 爬虫 PhantomJs 获取JS动态数据相关推荐

  1. Python 爬虫:获取 JS 动态内容——应用宝搜索应用

      本内容主要介绍如何获取网页中 JS 动态生成的内容. 文章目录 1.1 Ajax 异步加载生成网页内容 1.2 从网页响应中找到 JS 脚本返回的数据 1.2.1 找到 JS 请求的数据接口 1. ...

  2. Python 爬虫:获取 JS 动态内容——应用宝搜索应用!

    1.1 Ajax 异步加载生成网页内容   现在越来越多的网页使用 Ajax 异步加载方式,即网页中的一些内容由前端的 JS 动态生成.由于呈现在网页上的内容是由 JS 生成而来,我们能够在浏览器上看 ...

  3. python爬取万方数据库,爬虫获取 js 动态数据 (万方数据库文献下载)

    今天讲讲用爬虫下载万方数据库文献. 右键那个下载按钮 -> 检查,我们可以看见,按钮的点击事件是一个 js 函数 upload(). 在网页源代码中,寻找这个 upload() 函数,发现它只在 ...

  4. Python爬虫4.2 — ajax(动态网页数据抓取)用法教程

    Python爬虫4.2 - ajax[动态网页数据]用法教程 综述 AJAX 介绍 什么是AJAX 实例说明 请求分析 获取方式 实例说明 其他博文链接 综述 本系列文档用于对Python爬虫技术的学 ...

  5. 基于python爬虫————静态页面和动态页面爬取

    基于python爬虫----静态页面和动态页面爬取 文章目录 基于python爬虫----静态页面和动态页面爬取 1. 爬虫的原理 2. 用正则表达式匹配获取数据 3. 页面源码解析 4. 通过req ...

  6. Python爬虫《自动化学报》数据爬取与数据分析

    Python爬虫<自动化学报>数据爬取与数据分析 文章目录 Python爬虫<自动化学报>数据爬取与数据分析 前言 一.代码 二.结果展示 三.爬虫实现 1.准备 2.获取网页 ...

  7. Python爬虫之猫眼APP电影数据(十八)

    原创不易,转载前请注明博主的链接地址:Blessy_Zhu https://blog.csdn.net/weixin_42555080 本次代码的环境: 运行平台: Windows Python版本: ...

  8. python爬虫(14)获取淘宝MM个人信息及照片(中)

    python爬虫(14)获取淘宝MM个人信息及照片(中) python爬虫(14)获取淘宝MM个人信息及照片(上) python爬虫(14)获取淘宝MM个人信息及照片(下)(windows版本) 在上 ...

  9. Python爬虫经常爬不到数据,或许你可以看一下小编的这篇文章

    原标题:解决Python爬虫爬不到数据 前言: 近期,通过做了一些小的项目,觉得对于Python爬虫有了一定的了解,于是,就对于Python爬虫爬取数据做了一个小小的总结,希望大家喜欢! 文章目录 原 ...

  10. python爬网页数据用什么_初学者如何用“python爬虫”技术抓取网页数据?

    原标题:初学者如何用"python爬虫"技术抓取网页数据? 在当今社会,互联网上充斥着许多有用的数据.我们只需要耐心观察并添加一些技术手段即可获得大量有价值的数据.而这里的&quo ...

最新文章

  1. 【swjtu】数据结构实验课程设计_图的关键路径
  2. Python网络爬虫开发实战,微博宫格验证码的识别
  3. java实现定时任务 Schedule
  4. 生成top图_最小生成树(Kruskal和Prim算法)
  5. ARM指令集的最新版本包括针对JavaScript的优化
  6. Android 表单之 EditText(输入框)详解
  7. H.264文件解析与码流分析
  8. PS一键飞溅碎片特效的插件
  9. 视频网站盈利模式与营销策划
  10. gc overhead limit exceeded解决方案
  11. compose安装单个扩展_将自动化测试扩展到单个项目之外
  12. 数据库和数据库软件的安装
  13. 五分钟学Java:可变参数究竟是怎么一回事?
  14. x1c2017 8G版 win linux的取舍纠结记录
  15. DBA Scripts
  16. 一文搞定代码中的命名
  17. 大数据OLAP技术体系学习框架
  18. c语言飞机买票系统,C语言实现飞机订票系统
  19. 设计师调色卡_21个适合设计师的令人兴奋的调色板工具
  20. 第二波:HTML+CSS+JavaScript数据可视化大屏平台模板实例10大通用模板,面向各行各业

热门文章

  1. python函数传递列表_python传递列表作为函数参数
  2. php 开启 pathinfo,Nginx + php-fpm 开启 PATH_INFO 模式
  3. java9类加载器_深入理解java虚拟机(九)类加载器以及双亲委派模型
  4. java 26进制转10进制_求将任意10进制数字转为26进制字母的算法
  5. python生成json文件_json文件生成by python
  6. 中的draw函数_哪一个热图函数更快?
  7. linux java 错误日志_求大神解决啊啊 啊,看看这个怎么了,在LINUX运行完的错误日志...
  8. 笔试算法题(17):奇偶数分置数组前后段 反序访问链表
  9. 通过90行代码学会HTML5 WebSQL的4种基本操作 1
  10. Laravel 项目使用 Carbon 人性化显示文章发表时间