> 文章列表 > 【Python_requests学习笔记(七)】基于requests模块 实现动态加载数据的爬取

【Python_requests学习笔记(七)】基于requests模块 实现动态加载数据的爬取

【Python_requests学习笔记(七)】基于requests模块 实现动态加载数据的爬取

基于requests模块 实现动态加载数据的爬取

前言

此篇文章中介绍基于requests模块 实现动态加载数据的爬取,并以 抓取Cocos中文社区中:热门主题下的帖子名称及id数据 为例进行讲解。

正文

1、需求梳理

抓取Cocos中文社区中:热门主题下的帖子名称及id数据
【Python_requests学习笔记(七)】基于requests模块 实现动态加载数据的爬取

2、动态加载网站

在写爬虫思路之前先介绍下 数据动态加载网站
动态加载网站:其源码页中没有出现想要爬取的数据,只有JS 代码,这样的网站为动态加载网站。
其主要特点为:

  1. 右键、查看网页源码中没有具体数据;
  2. 滚动鼠标滑轮或其他动作时数据才会加载;
  3. 页面局部刷新时数据加载。

3、爬虫思路

  1. F12打开控制台,执行页面动作开始抓取网络数据包

  2. 抓取返回 XHR:异步加载的网络数据包 下的 json文件的网络数据包
    【Python_requests学习笔记(七)】基于requests模块 实现动态加载数据的爬取

  3. General->Request URL:返回JSON数据的URL地址
    【Python_requests学习笔记(七)】基于requests模块 实现动态加载数据的爬取

  4. QueryStringParameters(查询参数)-观察规律
    【Python_requests学习笔记(七)】基于requests模块 实现动态加载数据的爬取

  5. 通过分析请求的url规律,获取对应的数据连接
    即:https://forum.cocos.org/top.json?page={}&per_page=50

  6. 通过得到的url地址,查看数据格式,确定想要爬取的数据真实存在
    【Python_requests学习笔记(七)】基于requests模块 实现动态加载数据的爬取
    所需数据 “id和title” 在 “topic_list” 下的 “topics” 下存在。

  7. 编写程序框架、完善程序,详情见: 4、程序实现

4、程序实现

  1. 初始化函数
    def __init__(self):self.url = "https://forum.cocos.org/top.json?ascending=false&order=default&page={}&per_page=50"  # url地址
  1. 请求获取响应内容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内容函数
  1. 提取解析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)
  1. 程序入口函数
    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()

6、实现效果

【Python_requests学习笔记(七)】基于requests模块 实现动态加载数据的爬取