【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: 请求获取响应内容htmlin: url:url地址out: Nonereturn: int >0 ok, <0 some wrongothers: 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: Nonereturn: Noneothers: 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: Noneout: Nonereturn: Noneothers: 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 UserAgentclass 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: 请求获取响应内容htmlin: url:url地址out: Nonereturn: int >0 ok, <0 some wrongothers: 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: Nonereturn: Noneothers: 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: Noneout: Nonereturn: Noneothers: 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-2sif __name__ == '__main__':spider = CocosSpider()spider.run()