动态网页即不再是加载后立即下载所有页面内容。这样就会造成许多网页在浏览器中展示的内容不会出现在 HTML 源码中。于是就无法用静态网页的下载方法下载了。

对于这种动态网页的下载,一般有两种方法。

(1)JavaScript 逆向工程

比如一个搜索网页, firebug 显示 HTML 如下

<div class="container"><header class="mastheader row" id="header"><section id="main" class="main row"><div class="span12"><form><div id="results"><table><tbody><tr><td><div><a href="/view/Afghanistan"></div></td></tr></tr>

但是我们用如下的代码下载失败了

import lxml.html
from downloader import Downloader
D = Downloader()
html = D("http://example.webscraping.com/search")  # 该搜索页面的地址
tree = lxml.html.fromstring(html)
tree.cssselect("div#results a")

检查网页源代码可以帮助我们了解抽取操作为什么失败。在源代码中,可以发现我们准备抓取的 div 元素实际上是空的。

<div id="results">
</div>

而以上 firebug 显示给我们的却是网页的当前状态,也就是使用 JavaScript 动态加载完搜索结果之后的网页。这就是静态网页下载方法失败的原因。

我们对 JavaScript 进行逆向工程,在 Firebug 中单击 Console 选项卡,然后执行一次搜索,我们将会看到一个 AJAX 请求,如下图所示:

这就是使用 firebug 对 JavaScript 进行的逆向工程,可以看到 AJAX 响应返回的数据是 Json 格式的,因此我们可以用 json 解析。我们在代码中使用该请求的链接和json 数据:

import json
import string
template_url = 'http://example.webscraping.com/ajax/search.josn?&search_term={}&page_size=10&page=0'
for letter in string.lowercase: # 遍历搜索 a-zhtml = D(template_url.format(letter))try:ajax = json.loads(html)...

也可以用 "." 来表示全部搜索条件,即搜索全部。

template_url = 'http://example.webscraping.com/ajax/search.josn?&search_term={}&page_size=10&page=0'
html = D(template_url.format("."))
ajax = json.loads(html)
for record in ajax["records"]:row = [record[field] for field in FIELDS]writer.writerow(row)

(2)selenium 驱动浏览器运行

  2.1 python selenium 安装

安装很简单,一般使用火狐浏览器运行,所以一般先安装火狐浏览器: pip install selenium
但是还要处理一些小细节,否则后面运行报错:

1.下载 geckodriver.exe  地址:https://github.com/mozilla/geckodriver/releases 根据系统版本下载
2.下载后解压将 geckodriver.exe 复制到火狐的安装目录下,并将此目录配置环境变量 Path

3.重启 cmd

Ubuntu 解决方法:

1.下载 geckodriverckod 地址: https://github.com/mozilla/geckodriver/releases

2.解压后将geckodriverckod 存放至 /usr/local/bin/ 路径下即可

2.2 selenium 方法

from selenium import webdriver
driver = webdriver.Firefox()  # 火狐驱动,此时会弹出一个空的火狐浏览器窗口# 想要在选定的浏览器中加载网页,可以调用 get() 方法,执行后会弹出指定的网页窗口
driver.get("http://example.webscraping.com/search")  # 这个就是前面示例的动态搜索网页# 找到搜索文本框后,可以通过 send_keys() 方法输入内容,模拟键盘输入
# search_term 就是前面逆向工程解析的 ajax 请求ID
driver.find_element_by_id("search_term").send_keys(".") # "." 代表全部# 设置每页显示的数量为 1000
js = "document.getElementById('page_size').options[1].text='1000'"
driver.execute_script(js)# 模拟点击搜索按钮 点击 search
driver.find_element_by_id("search").click()# 等待 AJAX 请求加赞完毕,等待 30s
driver.implicitly_wait(30)# 使用 CSS 选择器获取国家链接
links = driver.find_element_by_css_selector('#results a')
# 抽取链接文本,并创建一个国家列表
countries = [link.text for link in links]
print countries# 关闭浏览器
driver.close()

爬虫(5)-- 动态网页下载相关推荐

  1. 简单的爬虫架构和网页下载器requests

    目录 简单的爬虫架构: 网页下载器: URL管理器: 网页解析器: 网页下载器requests: 发送requests请求: 接收requests请求: requests操作实例: 简单的爬虫架构: ...

  2. python3.4.4实现网页爬虫基础之网页下载器三种方法

    这是是慕课网<Python开发简单爬虫>中网页下载器的三种实现方法,课程用的是python2.7,这里用最新的3.4.4实现出来,分享给新人: import urllib.request ...

  3. Python爬虫之动态网页抓取(万科更新时间)

    一.前言 爬取的页面分为静态页面和动态页面,静态的页面爬取很常见,就如豆瓣top250的爬取,展示的内容都在HTML源代码中.而动态页面,很多内容不会出现在HTML源代码中,例如使用JavaScrip ...

  4. 网络爬虫(动态网页爬取关于混合动力汽车的论文数据)

    一.实验目的 (1) 熟悉网页浏览器开发工具的使用: (2) 掌握动态网页加载过程: (3) 掌握 post 请求参数设置: (4) 掌握基本的反反爬技术: (5) 能够根据问题需求,指定网络爬虫方案 ...

  5. python 爬虫动态网页的区别_Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取...

    区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...

  6. python动态页面元素爬取_Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过浏览器审查元素解析真实网页地址...

    由于主流网站都使用JavaScript展示网页内容,和前面简单抓取静态网页不同的是,在使用JavaScript时,很多内容并不会出现在HTML源代码中,而是在HTML源码位置放上一段JavaScrip ...

  7. Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过浏览器审查元素解析真实网页地址...

    由于主流网站都使用JavaScript展示网页内容,和前面简单抓取静态网页不同的是,在使用JavaScript时,很多内容并不会出现在HTML源代码中,而是在HTML源码位置放上一段JavaScrip ...

  8. Python爬虫 - 解决动态网页信息抓取问题

    作者:K同学啊 时间:2020年7月29日 写在前面:本文仅供参考学习之用,请勿用作其他用途. 1.嵌入式网页爬取 举例:最常见的分页式网页 这里我用天津市的信访页面来做示例,(地址:http://w ...

  9. 网络爬虫--23.动态网页数据抓取

    文章目录 一. Ajax 二. 获取Ajax数据的方式 三. selenium+chromedriver获取动态数据 四. selenium基本操作 一. Ajax 二. 获取Ajax数据的方式 三. ...

最新文章

  1. 利用Lucene.net搜索引擎进行多条件搜索的做法
  2. CHIL-SQL-PRIMARY KEY 约束
  3. 标签页式样的对话框参考
  4. 看到了一个 蒙特卡洛方法 随机数得出 圆周率的c++ 源码
  5. 分布领域驱动设计(DDD):领域接口化设计式缓存的选择
  6. php aes java_AES php java 互转
  7. ContextCapture Smart3D 使用问题汇总
  8. android极光富媒体推送,极光推送如何在android客户端接收富媒体
  9. 采样频率、采样点数、频率分辨率
  10. OT网络安全-OT客户端安全防护要采取那些措施
  11. 软件测试知识点和面试题--手工测试篇(功能测试)
  12. composer php 扩展,正确的Composer扩展包安装方法
  13. 利用opencv棋盘格标定法对鱼眼图像校正分析
  14. java万年历方法_利用java制作万年历
  15. 华为月薪11万招工程师,看到要求我傻眼了!
  16. 双屏切换单屏,之前在另一显示器显示的软件窗口现无法显示解决方法
  17. 使用8266做串口调试工具一
  18. stegsolve使用方法
  19. 读书笔记《计算广告》
  20. HTTP的几种认证方式之BASIC 认证(基本认证)

热门文章

  1. 3D打印切片软件补洞修复算法研究
  2. 笔记本电脑小米画报的壁纸位置
  3. IOS端一款超多书源的看书神器,不怕你找不到书!
  4. 超好用的mac字幕软件:ArcTime Pro for Mac中文免费版
  5. JavaCV的摄像头实战之十二:性别检测
  6. 卫视通:社交电视应用
  7. Mapchart 绘制基因在染色体上的分布图
  8. 微博属于 BBS 社区吗?
  9. 进程是否采用3d指令的判断
  10. 微信电商小程序购买/加入购物车组件设计