其实大部分主流网站都不是静态的html,html和Javascript相结合已经是大势所趋。

本篇以花瓣网主页为例子。

花瓣网主页,右键查看网页源代码,获得的页面是这样的:

544bef74be05?t=123

如果还是用之前静态页面的那一套(用requests和urllib)。由于获得的是静态页面,这时动态JS都还没加载出来,那肯定是啥都挖不出来了。

这里讲讲几种解决方法:

(1)方法一:

直接调出开发者工具,复制element的html代码,保存,用正则或BeautifulSoup或xpath提取信息。

544bef74be05?t=123

办法很土,不过好处是绕开了模拟浏览器环境的坑。使用有较大局限性

注意:这里还可以复制Xpath和selector(对应BeautifulSoup中的select方法),这个能让我们无脑对进行单项定位。

(2)方法二:

我们可以先右键看下我们要采集的图片地址的格式:

544bef74be05?t=123

544bef74be05?t=123

大概格式就是' http://img.hb.aicdn.com/ '+'图片特有编号'+‘_sq320’

我们把编号直接在静态的网页源代码中搜一下,

544bef74be05?t=123

发现图片的编号在JS中,用Xpath或BeautifulSoup是没有办法提取的,可以利用正则表达式来提取信息

但是这个页面非常恶心,实现起来会非常累。而且在首页中后缀是‘_sq320’,在其他页面还有'_sq236bl4',‘_fw658’,‘_fw236’的格式,还要对这些进行判断也非常麻烦,这种方法有较大局限性。

(3)方法三:

用谷歌插件web Scraper实现,无需编程。

不写代码的爬虫,10分钟搞定中有详细的介绍,还有视频可以学习。

对多数网站都挺适用的,我还没怎么用过,还在学习如何使用中。

(4)方法四:

分析JS源码 找出请求 自己模拟实现 难度比较高 。

这里有个今日头条的案例:http://www.jianshu.com/p/4fe8bb1ea984 ,讲的很棒很详细,但是有时API接口找不着或者是API接口地址随机变换,那还是得用万能的方法五。

(4)方法五(最有效):

模拟浏览器实现。比较常见的是 Selenium + PhantomJs ,基本上能解决大多数的爬虫问题,但是效率比较低,一般要配合多进程。

Selenium(点我查看中文文档,请务必先浏览一遍)是一个自动化测试框架。它能够模拟人工操作,比如能在浏览器中点击按钮、在输入框中输入文本、自动填充表单、还能进行浏览器窗口的切换、对弹出窗口进行操作。也就是说你能手动做的东西,基本都能用它来实现自动化!

Selenium模块可以在cmd中进行安装。

544bef74be05?t=123

Selenium的安装

Selenium当前支持的WebDriver有: Firefox, Chrome, IE and Remote等。

当然也包括Phantomjs。Phantomjs是一个“无头”浏览器,也就是没有界面的浏览器,但是功能与普通的浏览器无异,但占用较少的内存。

phantomjs-2.1.1官方下载地址

不知道为啥我下载时老出问题,所以再放一个CSDN的下载地址phantomjs-2.1.1CSDN下载地址

解压后可将phantomjs.exe的路径设置到环境变量中,以win10系统为例:我的电脑 -> 右键“属性” -> 点击“高级系统设置” -> 点击“环境变量”,可以看到当前path的一些路径, 为了方便,将phantomjs.exe放入到path的已有路径中。

当然,不进行环境变量设置也行,只不过是程序需要声明phantomjs.exe的位置罢了。

544bef74be05?t=123

但是使用Phantomjs的时候,有时遇到问题的时候要卡壳很久,因为不是可视化界面,很多东西感觉像是空想。因此,一般可以使用chrome来进行编写程序,然后最后再换成Phantomjs就好了(小爬虫直接用chrome也就行了)。这里需要用到chromedriver(点击下载),然后根据需要设置环境变量,方法和phantomjs.exe的一样。chrome我用58版本的会报错,后来装了chrome52.0.2743.116版本(32位百度盘链接: http://pan.baidu.com/s/1c2t6Ei8 密码: k9y8),能够成功运行,建议不要选太新的版本。

我在实际编程中,Phantomjs有时莫名报错,就算没报错等待的时候也觉得很乏味2333,用chrome就没问题。所以还是更加推荐先用Selenium + Chrome。

以爬取花瓣网首页的图片地址为例:

from selenium import webdriver

from bs4 import BeautifulSoup

#打开一个浏览器,若phantomjs.exe或chromedriver.exe在环境变量中

#可精简为driver = webdriver.PhantomJS()或driver = webdriver.Chrome(),否则要表明路径

driver = webdriver.Chrome(executable_path="D:\\Anaconda3\\chromedriver.exe")

#窗口最大化

#driver.maximize_window()

#访问网站

driver.get('http://huaban.com')

#获得网页信息

soup = BeautifulSoup(driver.page_source, "lxml")

#利用开发者工具找到我们需要的图片地址

results = soup.select('img[data-baiduimageplus-ignore="1"]')

#for r in results时发现有最后两个列表元素不是我们需要的网址,用[0:-2]去除

for r in results[0:-2]:

print('http:'+r['src'])

#关闭浏览器

driver.quit()

运行结果:

544bef74be05?t=123

关于Selenium还有好多其他的用法,比如点击登录,滚动页面等等,还有iframe框架怎么处理。先挖个坑,接下来还得再讲讲。

PS:我本身也是python刚刚入门,很多东西也不太懂,也是一点一点在学,所以网友们的问题我大多也都答不上来,只是提供一个简单的模板,大家一起参考。

python爬虫动态加载页面_python3的爬虫笔记8——动态加载页面爬虫相关推荐

  1. python post 请求登录后的页面_Python3 Post登录并且保存cookie登录其他页面的方法

    import urllib.request import sys import http.cookiejar import urllib.parse from bs4 import Beautiful ...

  2. 从html到jfinal的页面跳转页面,JFinal Weixin 学习笔记(5)-- 微信页面跳转

    项目结构 项目结构 WeixinApiController WeixinApiController 继承 ApiController ,所有使用 Api 的 controller 都需要继承此类. 目 ...

  3. Python爬虫入门 | 7 分类爬取豆瓣电影,解决动态加载问题

      比如我们今天的案例,豆瓣电影分类页面.根本没有什么翻页,需要点击"加载更多"新的电影信息,前面的黑科技瞬间被秒--   又比如知乎关注的人列表页面:   我复制了其中两个人昵称 ...

  4. python 异步加载图片_Python 爬取拉钩网异步加载页面

    如下是我简单的获取拉钩网异步加载页面信息的过程 获取的是深圳 Python 岗位的所有信息,并保存在Mongo中 (对于异步加载,有的人说是把你要爬页面的信息整个页面先爬下来,保存本地,然后再看有没有 ...

  5. 水滴石穿之IFRANME加载完成判断、获取函数的动态参数信息

    1.判断IFRAME是否加载完成 由于页面过程中,需要对IFRAME中的页面进行控制!但是由于IFRAME页面是其他人完成的,只是知道它的一些变量!页面结构如下: <mw:SplitterPan ...

  6. java spring包_java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式...

    java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式 发布时间:2018-08-20 12:02, 浏览次数:774 , 标签: java spri ...

  7. render注册一个链接组件_详解vue 动态加载并注册组件且通过 render动态创建该组件...

    基于 iview Tabs 组件实现 功能:为每个 tab 动态创建不同的.特定的组件内容,而不需要大量的 import 组件并进行 component 注册 Index.vue import loa ...

  8. 一个页面上有大量的图片,加载很慢,你有哪些方法优化这些图片的加载?

    一个页面上有大量的图片,加载很慢,你有哪些方法优化这些图片的加载? 1.使用 Sprites 图片技术 它将一个页面涉及到的所有零星图片都包含到一张大图中去,然后利用 CSS 技术展现出来.这样一来, ...

  9. render vue 添加类_详解vue 动态加载并注册组件且通过 render动态创建该组件

    基于 iview Tabs 组件实现 功能:为每个 tab 动态创建不同的.特定的组件内容,而不需要大量的 import 组件并进行 component 注册 Index.vue import loa ...

  10. [JAVA冷知识]动态加载不适合数组类?那如何动态加载一个数组类?

    写在前面 今天和小伙伴分享一些java小知识点,主要围绕下面几点: 既然数组是一个类, 那么编译后类名是什么?类路径呢? 为什么说动态加载不适合数组? 那应该如何动态加载一个数组? 部分内容参考 &l ...

最新文章

  1. win10 vEthernet
  2. sigmoid函数求导与自然指数
  3. 【Oracle】触发器最系统入门学习指导
  4. C语言程序设计 练习1-13
  5. Node提示:error code Z_BUF_ERROR,error error -5,error zlib:unexpected end of file
  6. maven java archetype_使用Maven Archetype创建Java项目模板
  7. 通常每个套接字地址只允许使用一次
  8. rest接口自动化测试_REST服务的自动化测试
  9. move std 函数 示例_C++ STL迭代器辅助函数
  10. leetcode 1217 python
  11. android自定义样式大全:shape,selector,layer-list,style,动画全部内容
  12. 在手机上写python_牛逼啊!一个随时随地写Python代码的神器
  13. [Java] ActionEvent 事件处理
  14. 硕士研究生毕业论文书写格式总结
  15. Csdn账号如何注销?
  16. mysql编写倒计时_最简单的实现倒计时
  17. 体验卡优惠券生成核销系统思路
  18. 高数 | 【重积分】线面积分880例题
  19. 麒麟子Cocos Creator 3D研究笔记十:【qfw】开源的Extension Pack for Cocos Creator 3D
  20. 看完这篇,黑苹果驱动VoodooI2C编译打包所有错误全搞定

热门文章

  1. 商汤科技开源DAVIS2017视频目标分割冠军代码
  2. torch yolov3梯度发散
  3. 梯度消失问题学习资料整理
  4. 运动检测(前景检测)之——ViBe
  5. Python中的reduce
  6. QoS技术之流量监管和流量整形
  7. linux socket文件数限制,Linux下高并发socket最大连接数所受的限制问题
  8. 导师会指导改matlab程序吗,导师指导记录.docx
  9. slope one 推荐算法python 代码_java和python实现一个加权SlopeOne推荐算法
  10. mysql联合查询数量不一致_Mybatis关联查询,查询出的记录数量与数据库直接查询不一致,如何解决?...