【Python_requests学习笔记(七)】基于requests模块 实现动态加载数据的爬取
基于requests模块 实现动态加载数据的爬取
前言
此篇文章中介绍基于requests模块 实现动态加载数据的爬取,并以 抓取Cocos中文社区中:热门主题下的帖子名称及id数据 为例进行讲解。
正文
1、需求梳理
抓取Cocos中文社区中:热门主题下的帖子名称及id数据
2、动态加载网站
在写爬虫思路之前先介绍下 数据动态加载网站
动态加载网站:其源码页中没有出现想要爬取的数据,只有JS 代码,这样的网站为动态加载网站。
其主要特点为:
- 右键、查看网页源码中没有具体数据;
- 滚动鼠标滑轮或其他动作时数据才会加载;
- 页面局部刷新时数据加载。
3、爬虫思路
-
F12打开控制台,执行页面动作开始抓取网络数据包
-
抓取返回 XHR:异步加载的网络数据包 下的 json文件的网络数据包
-
General->Request URL:返回JSON数据的URL地址
-
QueryStringParameters(查询参数)-观察规律
-
通过分析请求的url规律,获取对应的数据连接
即:https://forum.cocos.org/top.json?page={}&per_page=50
-
通过得到的url地址,查看数据格式,确定想要爬取的数据真实存在
所需数据 “id和title” 在 “topic_list” 下的 “topics” 下存在。 -
编写程序框架、完善程序,详情见: 4、程序实现
4、程序实现
- 初始化函数
def __init__(self):
self.url = "https://forum.cocos.org/top.json?ascending=false&order=default&page={}&per_page=50" # url地址
- 请求获取响应内容html
def get_html(self, url):
"""
function: 请求获取响应内容html
in: url:url地址
out: None
return: int >0 ok, <0 some wrong
others: Get Response Html Func
"""
headers = {"User-Agent": UserAgent().random} # 构造随机请求头
html = requests.get(url=url, headers=headers).json() # 此处使用.json(),直接获取python数据类型
self.parse_html(html) # 调用 提取解析html内容函数
- 提取解析html内容函数
def parse_html(self, html):
"""
function: 提取解析html内容函数
in: html:响应内容
out: None
return: None
others: Extract & Parse Html Func
"""
item = {} # 定义一个空字典
for dic in html["topic_list"]["topics"]:
item["id"] = dic["id"]
item["名称"] = dic["title"]
print(item)
- 程序入口函数
def run(self):
"""
function: 程序入口函数
in: None
out: None
return: None
others: Program Entry Func
"""
for page in range(3): # 爬取1-3页的内容
url = self.url.format(page) # url地址拼接
self.get_html(url) # 调用 获取响应内容方法
time.sleep(random.randint(1, 2)) # 随机休眠1-2s
5、完整代码
import time
import random
import requests
from fake_useragent import UserAgent
class CocosSpider:
"""
抓取Cocos中文社区中:热门主题下的帖子名称及id数据
"""
def __init__(self):
self.url = "https://forum.cocos.org/top.json?ascending=false&order=default&page={}&per_page=50" # url地址
def get_html(self, url):
"""
function: 请求获取响应内容html
in: url:url地址
out: None
return: int >0 ok, <0 some wrong
others: Get Response Html Func
"""
headers = {"User-Agent": UserAgent().random} # 构造随机请求头
html = requests.get(url=url, headers=headers).json() # 此处使用.json(),直接获取python数据类型
self.parse_html(html) # 调用 提取解析html内容函数
def parse_html(self, html):
"""
function: 提取解析html内容函数
in: html:响应内容
out: None
return: None
others: Extract & Parse Html Func
"""
item = {} # 定义一个空字典
for dic in html["topic_list"]["topics"]:
item["id"] = dic["id"]
item["名称"] = dic["title"]
print(item)
def run(self):
"""
function: 程序入口函数
in: None
out: None
return: None
others: Program Entry Func
"""
for page in range(3): # 爬取1-3页的内容
url = self.url.format(page) # url地址拼接
self.get_html(url) # 调用 获取响应内容方法
time.sleep(random.randint(1, 2)) # 随机休眠1-2s
if __name__ == '__main__':
spider = CocosSpider()
spider.run()