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()
相关推荐
niuniu_6661 分钟前
简单的自动化场景(以 Chrome 浏览器 为例)
运维·chrome·python·selenium·测试工具·自动化·安全性测试
FearlessBlot4 分钟前
Pyinstaller 打包flask_socketio为exe程序后出现:ValueError: Invalid async_mode specified
python·flask
Jtti7 分钟前
PHP在Debian环境上的并发处理能力如何
开发语言·debian·php
时光追逐者11 分钟前
在 Blazor 中使用 Chart.js 快速创建数据可视化图表
开发语言·javascript·信息可视化·c#·.net·blazor
独好紫罗兰14 分钟前
洛谷题单3-P5718 【深基4.例2】找最小值-python-流程图重构
开发语言·python·算法
小天努力学java16 分钟前
【面试题】如何用两个线程轮流输出0-200的值
java·开发语言
云边有个稻草人19 分钟前
【C++】第八节—string类(上)——详解+代码示例
开发语言·c++·迭代器·string类·语法糖auto和范围for·string类的常用接口·operator[]
正脉科工 CAE仿真27 分钟前
基于ANSYS 概率设计和APDL编程的结构可靠性设计分析
人工智能·python·算法
夏天想38 分钟前
vant4+vue3上传一个pdf文件并实现pdf的预览。使用插件pdf.js
开发语言·javascript·pdf·vant
惊鸿一博40 分钟前
c++ &&(通用引用)和&(左值引用)区别
开发语言·c++