Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页

时间:2021-10-08 22:28:47

前一段时间工作太忙一直没有时间继续更新这个教程,最近离职了趁着这段时间充裕赶紧多写点东西。之前我们已经简单了解了对普通网页的抓取,今天我就给大家讲一讲怎么去抓取采用Ajax异步加的网站。

工具和环境

  1. 语言:python 2.7
  2. IDE: Pycharm
  3. 浏览器:Chrome
  4. 爬虫框架:Scrapy 1.3.3

什么是AJAX?

AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。

AJAX = 异步 JavaScript和XML(标准通用标记语言的子集)。

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

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

两个Chrome插件

Toggle JavaScript

这个插件可以帮助我们快速直观地检测网页里哪些信息是通过AJAX异步加载而来的,具体怎么用,下面会详细讲解。
chrome商店下载地址:https://chrome.google.com/webstore/detail/toggle-javascript/cidlcjdalomndpeagkjpnefhljffbnlo?utm_source=chrome-app-launcher-info-dialog(Ps:打不的小伙伴自行百度搜索国内提供chrome插件下载的网站离线安装)

JSON-handle

这个插件可以帮我们格式化Json串,从而让我们以一个更友好的方式查看Json内的信息。
chrome商店下载地址:https://chrome.google.com/webstore/detail/json-handle/iahnhfdhidomcpggpaimmmahffihkfnj(Ps:打不的小伙伴自行百度搜索国内提供chrome插件下载的网站离线安装)

分析过程

分析页面是否采用AJAX

上次我们拿了豆瓣当做例子,刚好我发现了豆瓣有AJAX异步加载的页面,这次我们就不换了,还拿豆瓣做例子。(逃
首先我们打开豆瓣电影分类排行榜 - 动作片栏目。
Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页
打开过后你有没有发现什么不一样的地方呢?如果你的网速慢你会发现下面的电影信息是在网页别的部分出现后才慢慢出现的,试着把界面往下滑会不断有新的电影信息更新出来。
遇到这种情况初步就可以认定这个页面是采用AJAX异步加载的,你也可以通过右键查看网页源码来鉴别。比如说你右键查看源码ctrl+f搜索这个杀手不太冷这几个字,你会发现源码里没有。
Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页
上面的方法虽然能用,但是总感觉有点笨。还记得上面推荐的那个chrome插件Toggle JavaScript吗?
Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页
安好这个插件它就会出现在chrome浏览器的右边,试着轻轻点一下。
Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页
我的天呐!这么神奇吗?!刚才的电影信息都不见了!还记得AJAX的介绍吗?AJAX = 异步 JavaScript和XML。当我们点击了插件就代表这个我们封禁了JavaScript,这个页面里的JavaScript代码无法执行,那么通过AJAX异步加载而来的信息当然就无法出现了。通过这种方法我们能快速精确地知道哪些信息是异步加载而来的。

如何抓取AJAX异步加载页面

对于这种网页我们一般会采用两种方法:

  1. 通过抓包找到AJAX异步加载的请求地址;
  2. 通过使用PhantomJS等无头浏览器执行JS代码后再对网页进行抓取。

通常情况下我会采用第一种方法,因为使用无头浏览器会大大降低抓取效率,而且第一种方法得到的数据格式往往以Json为主,非常干净。在这里我只讲解第一种方法,第二种方法作为爬虫的终极武器我会在后续的教程中进行讲解。
回到我们需要抓取的页面,还记得我说过页面的一个细节吗,下拉更新。进入页面后我们按F12打开chrome浏览器的开发者工具选择Network,然后实现一次下拉更新。
Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页
你会在Network里发现一个Response为Json格式的请求,仔细看看Json里的内容你会明白这些都是网页上显示的电影信息。右键该请求地址选择Open Link in New Tab,如果你装了JSON-handle插件你会以下面这种更友好的方式查看这个Json串。
Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页
接着再让我们看一该请求的Header信息。
Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页
首先我们可以看出这是一个get请求,多看几个下拉请求的地址后你会发现地中的start=xxx在不断变化,每次增加20。所以我们只用更改这个参数就可以实现翻页不断获取新数据(修改其他的参数也会有不同的效果,这里就不一一细说了,留给大家慢慢地探索)。
spider代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# -*- coding: utf-8 -*-
# @Time : 2017/4/9 14:32
# @Author : woodenrobot
 
 
import re
import json
 
 
from scrapy import Request
from scrapy.spiders import Spider
from scrapyspider.items import DoubanMovieItem
 
 
class DoubanAJAXSpider(Spider):
name = 'douban_ajax'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36',
}
 
def start_requests(self):
url = 'https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20'
yield Request(url, headers=self.headers)
 
def parse(self, response):
datas = json.loads(response.body)
item = DoubanMovieItem()
if datas:
for data in datas:
item['ranking'] = data['rank']
item['movie_name'] = data['title']
item['score'] = data['score']
item['score_num'] = data['vote_count']
yield item
 
# 如果datas存在数据则对下一页进行采集
page_num = re.search(r'start=(\d+)', response.url).group(1)
page_num = 'start=' + str(int(page_num)+20)
next_url = re.sub(r'start=\d+', page_num, response.url)
yield Request(next_url, headers=self.headers)

在Scrapy工程文件的spiders里写好爬虫文件后在settings.py所在的目录下打开终端运行以下代码就能输出相应的电影数据。

1
scrapy crawl douban_ajax -o douban_movie.csv

代码Github地址:https://github.com/Wooden-Robot/scrapy-tutorial/blob/master/scrapyspider/scrapyspider/spiders/douban_ajax_spider.py

结尾

整片文章主要以介绍思路为主,抓取的站点也只是做示范内容并不重要。授之以鱼不如授之以渔,希望大家可以从这篇教程里学到解决问题的方法与思路。: )

Scrapy爬虫框架教程(四)-- 抓取AJAX异步加载网页的更多相关文章

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

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

  2. scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250

    scrapy爬虫框架教程(二)-- 爬取豆瓣电影TOP250 前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大 ...

  3. scrapy爬虫框架教程(二)-- 爬取豆瓣电影

    前言 经过上一篇教程我们已经大致了解了Scrapy的基本情况,并写了一个简单的小demo.这次我会以爬取豆瓣电影TOP250为例进一步为大家讲解一个完整爬虫的流程. 工具和环境 语言:python 2 ...

  4. PHPcurl抓取AJAX异步内容(转载)

    PHPcurl抓取AJAX异步内容 其实抓ajax异步内容的页面和抓普通的页面区别不大.ajax只不过是做了一次异步的http请求,只要使用firebug类似的工具,找到请求的后端服务url和传值的参 ...

  5. 淘宝购物车页面 智能搜索框Ajax异步加载数据

    如果有朋友对本篇文章的一些知识点不了解的话,可以先阅读此篇文章.在这篇文章中,我大概介绍了一下构建淘宝购物车页面需要的基础知识. 这篇文章主要探讨的是智能搜索框Ajax异步加载数据.jQuery的社区 ...

  6. jQuery的AJax异步加载

    主要用到load()方法以及getScript()方法,具体以一个例子说明: 在现有html文件中加载一个拟好的片段,以及在片段加载完成之前阻止用户进一步操作的弹出框. 首先是现有html代码,无任何 ...

  7. ajax异步加载问题

    使用ajax异步加载数据,在之后需要用到这个数据时,应该将之后的js一并写入ajax函数中,否则后面的js不能找到动态拼接的dom节点. 或者将其封装成方法,在ajax动态加载数据的最后调用该方法.

  8. scrapy实战4 GET方法抓取ajax动态页面(以糗事百科APP为例子):

    一般来说爬虫类框架抓取Ajax动态页面都是通过一些第三方的webkit库去手动执行html页面中的js代码, 最后将生产的html代码交给spider分析.本篇文章则是通过利用fiddler抓包获取j ...

  9. Python网络爬虫_爬取Ajax动态加载和翻页时url不变的网页

    1 . 什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新 ...

随机推荐

  1. js、css引用文件的下载方式

    js.css引用文件的下载方式 一.测试(chrome):1.直接使用<script...>.<link...>标签来混合引入脚本文件和css文件, <script as ...

  2. zabbix服务器监控suse系统教程

    zabbix服务器监控suse系统教程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 花了近一个星期才学会了如何监控window和linux主机的基本信息以及报价情况(我已经把笔记 ...

  3. Qt之QCustomPlot绘图(一)配置和第一个例子

    最近一个用Qt开发的项目需要绘制坐标曲线,我在老师的指点下使用了QCustomPlot这个插件,使用方法简单,功能还算不错. 可是在网上找了很多资料和博文都只是将官方提供的例子演示一遍,没有系统全面的 ...

  4. partial 函数

    函数的partial应用 函数在执行时,要带上所有必要的参数进行调用.但是,有时参数可以在函数被调用之前提前获知.这种情况下,一个函数有一个或多个参数预先就能用上,以便函数能用更少的参数进行调用. 例 ...

  5. 201521123035《Java程序设计》第六周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  6. CentOS-7&period;3 设置静态 ip

    1. VMnet8 必须设置固定 ip,否则会发生:虚拟机可以访问主机和外网,但是主机 windows 却访问不了虚拟机 2. 虚拟网络编辑器设置网关 IP(G): 必须与 VMnet8 的 ip 在 ...

  7. BZOJ3724PA2014Final Krolestwo——欧拉回路&plus;构造

    题目描述 你有一个无向连通图,边的总数为偶数.设图中有k个奇点(度数为奇数的点),你需要把它们配成k/2个点对(显然k被2整除).对于每个点对(u,v),你需要用一条长度为偶数(假设每条边长度为1)的 ...

  8. hdu1540 区间合并&plus;询问某点的最大连续块

    询问操作需要搞一下 今天被区间合并降智了 /* D a: 摧毁第a个点 Q a:询问a所在的点的块大小 R :修复最后被破坏的点 对于所有的点需要进行一次更新 更新比较容易,tag用来表示区间是否是完 ...

  9. 经典SQL面试题(转)

    以下题目都在MySQL上测试可行,有疏漏或有更优化的解决方法的话欢迎大家提出,我会持续更新的:) 有三个表,如果学生缺考,那么在成绩表中就不存在这个学生的这门课程成绩的记录,写一段SQL语句,检索出每 ...

  10. M1事后分析汇报以及总结

    一.设想和目标 1. 们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件主要是为了提供周边美食和菜谱查询功能,为“吃货”们提供便利.对典型用户和场景有清晰的描 ...