Python 爬⾍PhantomJs 获取JS 动态数据
Python 爬⾍ PhantomJs 获取JS动态数据
上篇⽂章我⾮常high的爬取了⼀个正常⽹页的数据
对是正常
不正常的来了
这次研究的就是那些“不正常”的⽹页 当时是我太天真 后⾯发现⽔⼜深
介于现在JS H5的⼤趋势 ⼤部分⽹站都是混⼊了JS数据加载 数据是延迟加载的
这样如果我们⽤原始的urllib.open(url) 加载出来的都是还没有加载js数据之前的 所以爆炸了
所以按照上篇⽂章那么正常的提取数据显然不可取了 那毕竟那是静态的 战场上 敌⼈也不会像抗⽇神剧剧情⼀样让你当靶⼦不是
我当时的想法就是要让让⽹页JS渲染数据加载完全了 我们才开始解析 这样才⾏ 想想就⾏了 然⽽我并不会
并不会后⾯查了⼀些资料
⽆⾮两种实现
getsavefilename1 分析JS源码 出请求 ⾃⼰模拟实现 难度⽐较⾼ ⿇烦
2 模拟浏览器实现 三⽅库多 简单 但是效率会慢⼀点然后搜到了很多相关的库 这⾥使⽤的是 Selenium + PhantomJs ⽹上推荐⽐较多Selenium是⼀个⽤于Web应⽤程序测试的⼯具
Phantom JS是⼀个服务器端的 JavaScript API 的 WebKit
看了⼀下Selenium的Api 发现没有PhantomJS 他也可以使⽤FireFox来实现如同PhantomJs的功能
介于⽹上都是推荐PhantomJS 所以我也这样实现
Selenium就像⼀个⼤容器 ⾥⾯放着PhantomJs来实现JS的渲染 我们直接操作Selenium的Api就⾏
这次选取的⽬标是 淘宝模特的⽹站 为什么是这个呢 除了美⼥多
美⼥多就够了
还有就是我学习的资料就是⽤的这个
这个⾥⾯就是⽤这个作为实例
但是这个后续可能因为淘宝改版了⽹站结构 他的例⼦不能成功 所以我才研究JS的动态加载
字数2034阅读2900评论16喜欢8
开始套路 这⾥环境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 webdriver
class Spider:
def__init__(self):
self.page=1
self.dirName='MMSpider'
#这是⼀些配置关闭loadimages可以加快速度但是第⼆页的图⽚就不能获取了打开(默认) cap = webdriver.DesiredCapabilities.PHANTOMJS
cap["phantomjs.sourceTimeout"] = 1000
#cap["phantomjs.page.settings.loadImages"] = False
#cap["phantomjs.page.settings.localToRemoteUrlAccessEnabled"] = True
self.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=w()
url="mm.taobao/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=repile(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_ad().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]
def getDetailPage(self,url,name,begin_time):
url='http:'+url
(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:
brief+=+'\n'
#保存个⼈信息
icon_url=self.driver.find_element_by_xpath('//div[@class="mm-p-model-info-left-top"]//img')
icon_url=_attribute('src')
dir=self.dirName+'/'+name
self.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=_attribute('href')
try:
except Exception,e:
print u'获取所有相册异常 %s'%e.message
end_time=w()
#保存个⼈信息以及耗时
try:self.saveBrief(brief,dir,name,end_time-begin_time)
except Exception,e:
print u'保存个⼈信息失败 %s'%e.message
#获取所有图⽚
def getAllImage(self,images_url,name):
(images_url)
#只获取第⼀个相册
photos=self.driver.find_element_by_xpath('//div[@class="mm-photo-cell-middle"]//h4/a') photos__attribute('href')
#进⼊相册页⾯获取相册内容
(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=1
print u'%s 的相册有%s张照⽚, 尝试全部下载....'%(name,len(images))
for imageUrl in images:
splitPath = _attribute('src').split('.')
fTail = splitPath.pop()
if len(fTail) > 3:
fTail = "jpg"
fileName = self.dirName+'/'+name +'/'+name+ str(index) + "." + fTail
print u'下载照⽚地址%s '%fileName
self._attribute('src'),fileName)
index+=1
def saveIcon(self,url,dir,name):
print u'头像地址%s %s '%(url,name)
splitPath=url.split('.')
fTail=splitPath.pop()
fileName=dir+'/'+name+'.'+fTail
print fileName
self.saveImg(url,fileName)
#写⼊图⽚
def saveImg(self,imageUrl,fileName):
print imageUrl
u=urllib2.urlopen(imageUrl)
ad()
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_time
fileName=dir+'/'+name+'.txt'
f=open(fileName,'w+')
print u'正在获取%s的个⼈信息保存到%s'%(name,fileName)
f.de('utf-8'))
#创建⽬录
def mkdir(self,path):
path=path.strip()
print u'创建⽬录%s'%path
if ists(path):
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论