目前绝大多数的网站的页面都是冬天页面,动态页面中的部分内容是浏览器运行页面中的JavaScript 脚本动态生成的,爬取相对比较困难

先来看一个很简单的动态页面的例子,在浏览器中打开 http://quotes.toscrape.com/js,显示如下:

页面总有十条名人名言,每一条都包含在<div class = "quote">元素中,现在我们在 Scrapy shell中尝试爬取页面中的名人名言:

  1. $ scrapy shell http://quotes.toscrape.com/js/
  2. ...
  3. >>> response.css(''div.quote)
  4. []

从结果可以看出,爬取失败了,在页面中没有找到任何包含名人名言的 <div class = 'quote'>元素。这些 <div class = 'qoute'>就是动态内容,从服务器下载的页面中并不包含他们(多以我们爬去失败),浏览器执行了页面中的一段 JavaScript 代码后,他们才被生成出来。

  

图中的 JavaScript 代码如下:

  

  1. var data = [
  2. {
  3. "tags": [
  4. "change",
  5. "deep-thoughts",
  6. "thinking",
  7. "world"
  8. ],
  9. "author": {
  10. "name": "Albert Einstein",
  11. "goodreads_link": "/author/show/9810.Albert_Einstein",
  12. "slug": "Albert-Einstein"
  13. },
  14. "text": "\u201cThe world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.\u201d"
  15. },
  16. {
  17. "tags": [
  18. "abilities",
  19. "choices"
  20. ],
  21. "author": {
  22. "name": "J.K. Rowling",
  23. "goodreads_link": "/author/show/1077326.J_K_Rowling",
  24. "slug": "J-K-Rowling"
  25. },
  26. "text": "\u201cIt is our choices, Harry, that show what we truly are, far more than our abilities.\u201d"
  27. },
  28. {
  29. "tags": [
  30. "inspirational",
  31. "life",
  32. "live",
  33. "miracle",
  34. "miracles"
  35. ],
  36. "author": {
  37. "name": "Albert Einstein",
  38. "goodreads_link": "/author/show/9810.Albert_Einstein",
  39. "slug": "Albert-Einstein"
  40. },
  41. "text": "\u201cThere are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.\u201d"
  42. },
  43. {
  44. "tags": [
  45. "aliteracy",
  46. "books",
  47. "classic",
  48. "humor"
  49. ],
  50. "author": {
  51. "name": "Jane Austen",
  52. "goodreads_link": "/author/show/1265.Jane_Austen",
  53. "slug": "Jane-Austen"
  54. },
  55. "text": "\u201cThe person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.\u201d"
  56. },
  57. {
  58. "tags": [
  59. "be-yourself",
  60. "inspirational"
  61. ],
  62. "author": {
  63. "name": "Marilyn Monroe",
  64. "goodreads_link": "/author/show/82952.Marilyn_Monroe",
  65. "slug": "Marilyn-Monroe"
  66. },
  67. "text": "\u201cImperfection is beauty, madness is genius and it's better to be absolutely ridiculous than absolutely boring.\u201d"
  68. },
  69. {
  70. "tags": [
  71. "adulthood",
  72. "success",
  73. "value"
  74. ],
  75. "author": {
  76. "name": "Albert Einstein",
  77. "goodreads_link": "/author/show/9810.Albert_Einstein",
  78. "slug": "Albert-Einstein"
  79. },
  80. "text": "\u201cTry not to become a man of success. Rather become a man of value.\u201d"
  81. },
  82. {
  83. "tags": [
  84. "life",
  85. "love"
  86. ],
  87. "author": {
  88. "name": "Andr\u00e9 Gide",
  89. "goodreads_link": "/author/show/7617.Andr_Gide",
  90. "slug": "Andre-Gide"
  91. },
  92. "text": "\u201cIt is better to be hated for what you are than to be loved for what you are not.\u201d"
  93. },
  94. {
  95. "tags": [
  96. "edison",
  97. "failure",
  98. "inspirational",
  99. "paraphrased"
  100. ],
  101. "author": {
  102. "name": "Thomas A. Edison",
  103. "goodreads_link": "/author/show/3091287.Thomas_A_Edison",
  104. "slug": "Thomas-A-Edison"
  105. },
  106. "text": "\u201cI have not failed. I've just found 10,000 ways that won't work.\u201d"
  107. },
  108. {
  109. "tags": [
  110. "misattributed-eleanor-roosevelt"
  111. ],
  112. "author": {
  113. "name": "Eleanor Roosevelt",
  114. "goodreads_link": "/author/show/44566.Eleanor_Roosevelt",
  115. "slug": "Eleanor-Roosevelt"
  116. },
  117. "text": "\u201cA woman is like a tea bag; you never know how strong it is until it's in hot water.\u201d"
  118. },
  119. {
  120. "tags": [
  121. "humor",
  122. "obvious",
  123. "simile"
  124. ],
  125. "author": {
  126. "name": "Steve Martin",
  127. "goodreads_link": "/author/show/7103.Steve_Martin",
  128. "slug": "Steve-Martin"
  129. },
  130. "text": "\u201cA day without sunshine is like, you know, night.\u201d"
  131. }
  132. ];
  133. for (var i in data) {
  134. var d = data[i];
  135. var tags = $.map(d['tags'], function(t) {
  136. return "<a class='tag'>" + t + "</a>";
  137. }).join(" ");
  138. document.write("<div class='quote'><span class='text'>" + d['text'] + "</span><span>by <small class='author'>" + d['author']['name'] + "</small></span><div class='tags'>Tags: " + tags + "</div></div>");
  139. }

  阅读代码可以了解页面中动态生成的细节,所有名人名言信息被保存在数组 data 中,最后的 for 循环迭代 data 中的每项信息,使用 document。write 生成每条名人名言对应的 <div class = ‘quote’>元素。

  上面是动态页面中最简单的一个例子,数据被应编码到 JavaScript 代码中, 实际中更常见的是JavaScript 通过 HTTP 请求跟网站动态交互获取数据(AJAX),然后使用数据更新 HTMML 页面。爬取此类动态网页需要先执行页面使用 JavaScript 渲染引擎页面,咋进行爬取。

Scrapy 爬取动态页面的更多相关文章

  1. Scrapy爬取静态页面

    Scrapy爬取静态页面 安装Scrapy框架: Scrapy是python下一个非常有用的一个爬虫框架 Pycharm下: 搜索Scrapy库添加进项目即可 终端下: #python2 sudo p ...

  2. scrapy爬取动态分页内容

    1.任务定义: 爬取某动态分页页面中所有子话题的内容. 所谓"动态分页":是指通过javascript(简称"js")点击实现翻页,很多时候翻页后的页面地址ur ...

  3. Python 爬虫实例(8)—— 爬取 动态页面

    今天使用python 和selenium爬取动态数据,主要是通过不停的更新页面,实现数据的爬取,要爬取的数据如下图 源代码: #-*-coding:utf-8-*- import time from ...

  4. scrapy爬取相似页面及回调爬取问题(以慕课网为例)

    以爬取慕课网数据为例   慕课网的数据很简单,就是通过get方式获取的 连接地址为https://www.imooc.com/course/list?page=2 根据page参数来分页  

  5. selenium自动化测试爬取动态页面大全

    目录 一:浏览器信息测试 二:查找结点 三:测试动作 四:获取节点信息 五:切换子页面Frame 六,延时请求 七:前进和后退 八:Cookies 八:选项卡处理 九:捕获异常   这里之讲解用法,安 ...

  6. selenium+phantomjs爬取动态页面数据

    1.安装selenium pip/pip3 install selenium 注意依赖关系 2.phantomjs for windows 下载地址:http://phantomjs.org/down ...

  7. scrapy(四): 爬取二级页面的内容

    scrapy爬取二级页面的内容 1.定义数据结构item.py文件 # -*- coding: utf-8 -*- ''' field: item.py ''' # Define here the m ...

  8. 【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)

    上次挖了一个坑,今天终于填上了,还记得之前我们做的拉勾爬虫吗?那时我们实现了一页的爬取,今天让我们再接再厉,实现多页爬取,顺便实现职位和公司的关键词搜索功能. 之前的内容就不再介绍了,不熟悉的请一定要 ...

  9. Scrapy 框架 使用 selenium 爬取动态加载内容

    使用 selenium 爬取动态加载内容 开启中间件 DOWNLOADER_MIDDLEWARES = { 'wangyiPro.middlewares.WangyiproDownloaderMidd ...

随机推荐

  1. 吴裕雄 python 机器学习——集成学习AdaBoost算法分类模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import datasets,ensemble from sklear ...

  2. Caffe实例

    下载链接以及说明:  1.caffe代码按照官方教程下载windows分支下面的就可以了(https://github.com/BVLC/caffe/tree/windows). 2.cmake(ht ...

  3. mybatis--多对多关联

    mybatis3.0 添加了association和collection标签专门用于对多个相关实体类数据进行级联查询,但仍不支持多个相关实体类数据的级联保存和级联删除操作.因此在进行实体类多对多映射表 ...

  4. ios中ipa包的发布平台

    目前我所知的平台 1.蒲公英 目前 限制  金融类app  区块链类app的上传,小编的号因此刚被封号,而且交涉无果,不给解封,只有提交工单,包号注销了,再注册一个[建议看一下使用规则] 小编认为, ...

  5. HDU-1702-ACboy needs your help again!(Stack)

    队列和栈的判空都可以用empty #include <bits/stdc++.h> using namespace std; string oper,stru; int T,M,num; ...

  6. mysql中的数据类型长度

    “mysql中的数据类型长度是固定的 数据类型后面改的只是展示长度 没用的 int就是四个字节 2的31次方减一是最大值 所以改这个长度没用 只能改数据类型”

  7. 微信小程序开发豆瓣电影接口失效

    豆瓣旧API接口停用,使用以下接口代替 .获取正在热映的电影:https://douban.uieee.com/v2/movie/in_theaters访问参数:start : 数据的开始项 coun ...

  8. Sqoop的安装及常用命令

    本次安装主要是为了离线分析数据清洗完成后的操作:网站日志流量分析系统之数据清洗处理(离线分析) 一.概述 1. sqoop是Apache 提供的工具,用于hdfs和关系型数据库之间数据的导入和导入 2 ...

  9. Java日期时间API系列19-----Jdk8中java.time包中的新的日期时间API类,ZonedDateTime与ZoneId和LocalDateTime的关系,ZonedDateTime格式化和时区转换等。

    通过Java日期时间API系列6-----Jdk8中java.time包中的新的日期时间API类中时间范围示意图:可以很清晰的看出ZonedDateTime相当于LocalDateTime+ZoneI ...

  10. ASP.NET Core搭建多层网站架构【4-工作单元和仓储设计】

    2020/01/28, ASP.NET Core 3.1, VS2019, Microsoft.EntityFrameworkCore.Relational 3.1.1 摘要:基于ASP.NET Co ...