Ajax,是利用JavaScript在保证页面不被刷新,页面链接不改变的情况下与服务器交换数据并更新部分网页的技术。简单的说,Ajax使得网页无需刷新即可更新其内容。举个例子,我们用浏览器打开新浪微博,进入某个用户的页面,当我们浏览到该页末尾时,会出现一个加载的动画,然后就刷新出来的新的微博内容,这个过程并不需要我们手动的刷新网页。

  Ajax的原理:发送Ajax请求到网页更新的这个过程可分为三步:

    1.发送请求

    2.解析内容

    3.渲染网页

  详细的原理介绍可参照:https://www.cnblogs.com/wanghp/p/6991554.html

  简单的说,JavaScript新建了一个XMLHttpRequest对象,然后调用onreadystatechange属性设置了监听,然后调用open()方法和send()方法向服务器发送了请求,当服务器返回响应时,监听对应的方法便会触发,然后在方法里解析响应的内容,从而实现了无需刷新便能更新网页。

  那么如何查看Ajax请求呢?以爬取哔哩哔哩番剧索引追番人数排行为例,我们使用Chrome浏览器打开https://www.bilibili.com/anime/index/#season_version=-1&area=-1&is_finish=-1&copyright=-1&season_status=-1&season_month=-1&pub_date=-1&style_id=-1&order=3&st=1&sort=0&page=1,并按F12打开开发者工具,如图所示:

在开发者工具中切换到Network选项卡,然后重新刷新页面,筛选XHR请求类型,如图所示:

在左边找到我们需要爬取的Ajax请求,即

点击header可以查看该请求的header信息,之后我们会用到。

Preview是该请求返回的响应内容,包含了我们所要爬取的信息。

接下来我们以爬取b站追番人数排行榜为例来介绍如何提取Ajax结果:

首先在header中找到请求链接,即Request URL:

接着找到该请求的参数信息:

观察到每次翻页,page参数+1,其他参数没有改变,所以我们每次请求时只需要改变page参数即可。

下面给出代码示例:

 from urllib.parse import urlencode
import requests
import time
import csv
import os base_url = "https://bangumi.bilibili.com/media/web_api/search/result?" headers = {
'Host':'bangumi.bilibili.com',
'Referer':'https://www.bilibili.com/anime/index/',
'User_Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
'Origin': 'https://www.bilibili.com',
} def get_page(page):
#参数
params = {
'season_version':'-1',
'area': '-1',
'is_finish': '-1',
'copyright': '-1',
'season_status': '-1',
'season_month':'-1',
'pub_date': '-1',
'style_id': '-1',
'order': '',
'st': '',
'sort': '',
'page': page,
'season_type':'',
'pagesize':''
}
url = base_url + urlencode(params)
try:
response = requests.get(url,headers=headers,allow_redirects=False)
#将内容解析为json格式返回
return response.json()
except requests.ConnectionError as e:
print('Error',e.args) def parse_page(json):
if json:
items = json.get('result').get('data')
for item in items:
ret = {}
ret['title'] = item.get('order').get('title')
ret['score'] = item.get('order').get('score')
ret['play'] = item.get('order').get('play')
ret['follow'] = item.get('order').get('follow')
ret['index_show'] = item.get('index_show')
ret['is_finish'] = item.get('is_finish')
yield item #写入文件
def write_to_file(items):
with open("bilibili.csv","a+") as csvfile:
writer = csv.writer(csvfile)
for item in items:
print(item)
writer.writerow([item['order']['follow'],item['title'],item['order']['score'],
item['order']['play'],item['index_show'],item['is_finish']]) def main(offset):
json = get_page(offset)
results = parse_page(json)
write_to_file(results)
return 0 if __name__ == '__main__':
for page in range(1,11):
main(offset=page)
time.sleep(1)

运行结果:

Ajax介绍及爬取哔哩哔哩番剧索引追番人数排行的更多相关文章

  1. Ajax数据的爬取(淘女郎为例)

    mmtao Ajax数据的爬取(淘女郎为例) 如有疑问,转到 Wiki 淘女郎模特抓取教程 网址:https://0x9.me/xrh6z 判断一个页面是不是 Ajax 加载的方法: 查看网页源代码, ...

  2. PYTHON 爬虫笔记九:利用Ajax+正则表达式+BeautifulSoup爬取今日头条街拍图集(实战项目二)

    利用Ajax+正则表达式+BeautifulSoup爬取今日头条街拍图集 目标站点分析 今日头条这类的网站制作,从数据形式,CSS样式都是通过数据接口的样式来决定的,所以它的抓取方法和其他网页的抓取方 ...

  3. 爬虫七之分析Ajax请求并爬取今日头条

    爬取今日头条图片 这里只讨论出现的一些问题,代码在最下面github链接里. 首先,今日头条取消了"图集"这一选项,因此对于爬虫来说效率降低了很多: 在所有代码都完成后,也许是爬取 ...

  4. 第十四节:Web爬虫之Ajax数据爬取

    有时候在爬取数据的时候我们需要手动向上滑一下,网页才加载一定量的数据,但是网页的url并没有发生变化,这时我们就要考虑使用ajax进行数据爬取了...

  5. 他爬取了B站所有番剧信息,发现了这些……

    本文来自「楼+ 之数据分析与挖掘实战 」第 4 期学员 -- Yueyec 的作业.他爬取了B站上所有的番剧信息,发现了很多有趣的数据- 关键信息:最高播放量 / 最强up主 / 用户追番数据 / 云 ...

  6. [python] 常用正则表达式爬取网页信息及分析HTML标签总结【转】

    [python] 常用正则表达式爬取网页信息及分析HTML标签总结 转http://blog.csdn.net/Eastmount/article/details/51082253 标签: pytho ...

  7. 爬虫实战——Scrapy爬取伯乐在线所有文章

    Scrapy简单介绍及爬取伯乐在线所有文章 一.简说安装相关环境及依赖包 1.安装Python(2或3都行,我这里用的是3) 2.虚拟环境搭建: 依赖包:virtualenv,virtualenvwr ...

  8. scrapy关键字爬取百度图库(一)

    刚入门学习python的菜鸟,如有错误,还望指教 爬取百度图库需要知道百度图库的加载方式是通过下拉加载的,所以我们需要分析Ajax请求来爬取每一页的数据信息 表述不清直接上图片 图片一是刷新页面后加载 ...

  9. python scrapy爬取知乎问题和收藏夹下所有答案的内容和图片

    上文介绍了爬取知乎问题信息的整个过程,这里介绍下爬取问题下所有答案的内容和图片,大致过程相同,部分核心代码不同. 爬取一个问题的所有内容流程大致如下: 一个问题url 请求url,获取问题下的答案个数 ...

随机推荐

  1. Java中String、StringBuffer和StringBuilder之间的区别

    String在Java中是字符串常量 例如 String str = "abc"; str = str + 1; System.out.println(str); 结果将是abc1 ...

  2. 实战iOS7之NSURLSession

    NSURLSession VS NSURLConnection NSURLSession可以看做是NSURLConnection的进化版,其对NSURLConnection的改进点有: * 根据每个S ...

  3. 《锋利的jQuery 第二版》chapter 1~

    chapter 1 认识 jQuery jquery.js(开发版),jquery.min.js(生产版) window.onload 与 $(document).ready() 的对比: jquer ...

  4. DatagridView 控件列顺序与设置的不一样

    解决方案如下 : 1. dataGridView1.AutoGenerateColumns = false; 2. 绑定的dataSource 中所有的列都要写进去(列一定是绑定的模型中属性) 先在界 ...

  5. S:List

    描述 写一个程序完成以下命令:new id ——新建一个指定编号为id的序列(id<10000)add id num——向编号为id的序列加入整数nummerge id1 id2——合并序列id ...

  6. 四,Smarty模板技术/引擎-----内建函数

    内建函数是smarty提供的函数,不允许修改,只能被调用: 自定义函数是自己编写函数,注册成为smarty的函数,之后可以被调用. PHP的自建函数很多,讲解下<foreach>和< ...

  7. uC/OS-II 函数之任务相关函数

    获得更多资料欢迎进入我的网站或者 csdn或者博客园 对于有热心的小伙伴在微博上私信我,说我的uC/OS-II 一些函数简介篇幅有些过于长应该分开介绍.应小伙伴的要求,特此将文章分开进行讲解.上文主要 ...

  8. 关于java编译

    1.不包括jar编译 javac -cp %CLASSPATH% -d ./classes/ ./src/org/csource/common/*.java --先编译基础模块,并且指定class保存 ...

  9. Android Fragment之间的通信(用fragment替换掉XML布局文件中的一个线性布局)

    1.XML布局 (1)主界面 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xml ...

  10. 【算法笔记】B1045 快速排序

    1045 快速排序 (25 分)   著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分后 ...