爬豆瓣

什么是 AJAX ?

AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。

AJAX = Asynchronous JavaScript and XML(AJAX = 异步 JavaScript 和 XML。)。

AJAX 不是新的编程语言,而是一种使用现有标准的新方法。

AJAX 是一种用于创建快速动态网页的技术。

通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面。

动态加载的数据

通过另一个单独的请求请求到的数据

如果我们要对一个陌生的网站进行指定数据的爬取?

首先要明确爬取的数据在该网站是否为动态加载的

如何判断?

  1. 浏览器中按F12打开开发者工具,然后点击Network下的All
  2. 刷新网页,可以看到很多请求,直接找到第一个点击
  3. 然后在Response里按ctrl+F全局搜索
  4. 在全局搜索框中输入网页中的任意标题或者比较容易辨认的文字或者数字
  5. 如果可以查到,证明不是动态加载的,反之就是动态加载

是:通过浏览器抓包工具实现全局搜索,定位动态加载数据对应的数据包,从数据包中提取请求的url和请求参数。

不是:就可以直接将浏览器地址栏中的网址作为我们requests请求的url。

首先我们通过浏览器随机进入豆瓣主页的一个分类,下面我这个网址是代表着(热门电视剧)分类:

https://movie.douban.com/tv/#!type=tv&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0

我们往下翻,发现没有下一页,而是四个字:加载更多,我们点击它后,又加载出了一些电视剧,那我们观察一下此时网页的url变成了:

https://movie.douban.com/tv/#!type=tv&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=20

变化就在于最后的start=0变成了start=20,而且整张页面并没有重新加载,页面最下方就加载出了数据,那么我们可以判断这些新加载出来的数据肯定是AJAX动态加载的了。

上面说了动态加载的数据是另一个单独的请求请求到的数据,现在我们就把它找出来。

  1. 在浏览器中按F12打开开发者工具
  2. 点击Network下的XHR(XHR就是 XMLHttpRequest 对象,也就是ajax功能实现所依赖的对象),这样我们就能看到AJAX发出的请求
  3. 点击第二行的clear(一个小圆圈中间有个反斜杠)方便我们观察在点击加载更多后发出了什么请求

果然我们发现了一个请求,点击它,可以看到里面有Headers和Response

Response下返回的是json数据,我们打开json在线解析工具https://www.json.cn/,然后解析,会发现这些数据就是我们点击加载更多后新加载出来的数据

而我们观察一下page_limit:和page_start:

page_limit=20&page_start=0(页面初始时),此时页面共有20部电视剧

page_limit=20&page_start=20(第一次点击加载更多时),此时页面共有40部电视剧

page_limit=20&page_start=40(第二次点击加载更多时),此时页面共有60部电视剧

由此得出结论,从page_start开始,加载page_limit个电视剧

而Headers下有

  1. type:
    tv
  2. tag:
    热门
  3. sort:
    recommend
  4. page_limit:
    20
  5. page_start:
    20

以及Request URL,Request URL则包含着这些参数

那我们就直接请求去掉参数的Request URL,然后请求时再把参数加上,这样参数可以动态化。

以下为完整代码:

import requests

url = 'https://movie.douban.com/j/search_subjects'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36'
}
page_start = input('您想从第几部电影开始获取:')
page_limit = input('您想一次获取多少部电影:')
#url里携带的参数
dic = {
'type': 'tv',
'tag': '热门',
'sort': 'recommend',
'page_limit': page_limit,
'page_start': page_start,
}
response = requests.get(url=url,params=dic,headers=headers)
page_text = response.json()#json返回的是序列化好的实例对象
print(page_text)#page_text是一个字典,数据在字典键值对中的值里面 for dic in page_text['subjects']:
_title = dic['title']
_rate = dic['rate']
print(_title+_rate)

https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=20

2_爬豆瓣电影_ajax动态加载的更多相关文章

  1. 爬虫--selenuim和phantonJs处理网页动态加载数据的爬取

    1.谷歌浏览器的使用 下载谷歌浏览器 安装谷歌访问助手 终于用上谷歌浏览器了.....激动 问题:处理页面动态加载数据的爬取 -1.selenium -2.phantomJs 1.selenium 二 ...

  2. selenuim和phantonJs处理网页动态加载数据的爬取

    一.图片懒加载 什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding:utf-8 -* ...

  3. 爬虫开发6.selenuim和phantonJs处理网页动态加载数据的爬取

    selenuim和phantonJs处理网页动态加载数据的爬取阅读量: 1203 动态数据加载处理 一.图片懒加载 什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/ ...

  4. 6-----selenuim和phantonJs处理网页动态加载数据的爬取

    动态数据加载处理 一.图片懒加载 什么是图片懒加载? 案例分析:抓取站长素材http://sc.chinaz.com/中的图片数据 #!/usr/bin/env python # -*- coding ...

  5. 爬虫——爬取Ajax动态加载网页

    常见的反爬机制及处理方式 1.Headers反爬虫 :Cookie.Referer.User-Agent 解决方案: 通过F12获取headers,传给requests.get()方法 2.IP限制 ...

  6. 爬虫再探实战(三)———爬取动态加载页面——selenium

    自学python爬虫也快半年了,在目前看来,我面临着三个待解决的爬虫技术方面的问题:动态加载,多线程并发抓取,模拟登陆.目前正在不断学习相关知识.下面简单写一下用selenium处理动态加载页面相关的 ...

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

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

  8. Python+Selenium爬取动态加载页面(2)

    注: 上一篇<Python+Selenium爬取动态加载页面(1)>讲了基本地如何获取动态页面的数据,这里再讲一个稍微复杂一点的数据获取全国水雨情网.数据的获取过程跟人手动获取过程类似,所 ...

  9. Python+Selenium爬取动态加载页面(1)

    注: 最近有一小任务,需要收集水质和水雨信息,找了两个网站:国家地表水水质自动监测实时数据发布系统和全国水雨情网.由于这两个网站的数据都是动态加载出来的,所以我用了Selenium来完成我的数据获取. ...

随机推荐

  1. Splash (渲染JS服务)介绍安装

    一. splash介绍 1.Splash 是一个带有 HTTP API 的 javascript 渲染服务.它是一个带有 HTTP API 的轻量级浏览器,使用 Twisted 和 QT5 在 Pyt ...

  2. 从-99打造Sentinel高可用集群限流中间件

    接上篇Sentinel集群限流探索,上次简单提到了集群限流的原理,然后用官方给的 demo 简单修改了一下,可以正常运行生效. 这一次需要更进一步,基于 Sentinel 实现内嵌式集群限流的高可用方 ...

  3. 5.8 NOI 模拟

    \(T1\) 比较容易想到的 二分转化为判定,判定是否存在一个子图能保证能一直在\(x\)时间内到达\(n\) 设\(dis(u,v)\)表示\(u->v\)的最短路 先找出候选节点\(i,di ...

  4. DolphinScheduler 线上 Meetup 视频回放(07.25)

    上周六下午 DolphinScheduler 社区联合 Doris 社区进行了 2020 年首次线上 Meetup,各位讲师都做了非常精彩的分享,也吸引了 1900 多位技术伙伴观看. 其中 Dolp ...

  5. Luogu3435 [POI2006]OKR-Periods of Words (KMP)

    \(next\)应用,将原串视作最长前缀复制后的子串 #include <iostream> #include <cstdio> #include <cstring> ...

  6. Luogu1527 [国家集训队]矩阵乘法 (整体二分)(Unfinished)

    全线RE的代码... 先搁这吧,下次再说.flag //#include <iostream> #include <cstdio> //#include <cstring ...

  7. Git 06 分支

    参考源 https://www.bilibili.com/video/BV1FE411P7B3?spm_id_from=333.999.0.0 版本 本文章基于 Git 2.35.1.2 概述 分支用 ...

  8. 百亿数据百亿花, 库若恒河沙复沙,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang数据库操作实践EP12

    Golang可以通过Gorm包来操作数据库,所谓ORM,即Object Relational Mapping(数据关系映射),说白了就是通过模式化的语法来操作数据库的行对象或者表对象,对比相对灵活繁复 ...

  9. [CF1526D] Kill Anton(逆序对,搜索)

    题面 A N T O N \rm ANTON ANTON 的基因由 A , N , T , O \rm A,N,T,O A,N,T,O 四种碱基排列组成. A N T O N \rm ANTON AN ...

  10. C++ 性能小测 1 二维数组的遍历效率

    C++ 性能小测 1 二维数组的遍历效率 遍历二维数组时,常规思路是使用一个嵌套循环.一方面,由于 CPU 使用了分支预测技术,因此通常将循环次数最多循环的放在最内层.另一方面,由于二维数组是按行存储 ...