Python爬虫案例二:获取虎牙主播图片(动态网站)

复制代码
爬虫流程:优先假设是JSON数据,抓包方式只能翻页
 JSON数据
 HTML数据
 1.异步数据(即先返回HTML,再返回目标的数据,只是触发了JSON请求),不在HTML中
 2.不能刷新网页,直接翻页

测试链接:https://live.huya.com/

源代码:

复制代码
import requests, json, os
class Two(object):
    def __init__(self):
        # 初始化
        self.no = 1
        self.start_url = 'https://live.huya.com/liveHttpUI/getLiveList?'
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'
        }
    # params不能写在__init__()里面,因为__init__()只执行一次,params是变化的
    def confrim_params(self):
        # 构造7页的params
        for i in range(1, 8):
            params = {
                'iGid': '1663',
                'iPageNo': '{}'.format(i),  # i是字符串
                'iPageSize': '120'
            }
            self.request_start_url(params)
            # break
    def request_start_url(self, params):
        # 请求起始地址
        # 法一:
        # response = requests.get(self.start_url, headers = self.headers(), params=params).text
        # response = json.loads(response)

        # 法二(request自带,自动变字典)---常用:
        response = requests.get(self.start_url, headers=self.headers, params=params).json()
        self.parse_response(response)

    def parse_response(self, response):
        # 解析响应
        for data in response['vList']:
            name = data['sNick'].replace('.', '').replace('/', '')
            link = data['sScreenshot']
        self.request_link(name, link)

    def request_link(self, name, link):
        # 请求图片链接
        img_data = requests.get(link, headers=self.headers).content
        self.create_dir(name, img_data)

    def create_dir(self, name, img_data):
        # 创建文件夹
        if not os.path.exists('../虎牙'):
            os.mkdir('../虎牙')
        self.save_data(name, img_data)

    def save_data(self, name, img_data):
        # 保存图片
        with open(f'虎牙/{name}.jpg', 'wb') as f:
            f.write(img_data)
        print('ok  第{}张--{}'.format(self.no, name))
        self.no += 1

    def main(self):
        # 逻辑控制部分
        self.confrim_params()

if __name__ == '__main__':
    t = Two()
    t.main()
相关推荐
ㄣ知冷煖★5 分钟前
基于openEuler操作系统的图神经网络应用开发:以Cora数据集节点分类为例的研究与实践
python
klzdwydz7 分钟前
注解与反射
java·开发语言
ULTRA??11 分钟前
C语言简化版本开辟动态内存的万能MALLOC宏封装
c语言·开发语言
祝余Eleanor12 分钟前
Day32 深入理解SHAP图
人工智能·python·机器学习
talenteddriver16 分钟前
java: 分页查询(自用笔记)
java·开发语言
繁华似锦respect17 分钟前
lambda表达式中的循环引用问题详解
java·开发语言·c++·单例模式·设计模式·哈希算法·散列表
我要升天!24 分钟前
QT -- 网络编程
c语言·开发语言·网络·c++·qt
Unlyrical30 分钟前
为什么moduo库要进行线程检查
linux·服务器·开发语言·c++·unix·muduo
GIS阵地30 分钟前
Qt实现简易仪表盘
开发语言·c++·qt·pyqt·qgis·qt5·地理信息系统
int WINGsssss33 分钟前
【无标题】
pytorch·分布式·python