python获取ajax加载的数据

news/2024/7/19 10:32:21 标签: 爬虫
"""  
https://www.duitang.com/napi/blogv2/list/by_search/?


堆糖页面分析:
    使用Ajax加载,aferid是控制加载的图片和页面,从零开始,会提前加载下一页的Ajax数据
    第一页的图片是after_id从0到120,会提前加载下一页的after_id:124
"""
import time
from urllib.parse import urlencode
import requests
import re
from threading import Thread
from queue import Queue
import json
import os


class ThreadFetchUrl(Thread):
    def __init__(self, url_queue, img_data_queue, headers):
        super().__init__()
        self.url_queue = url_queue
        self.headers = headers
        self.img_data_queue = img_data_queue

    def run(self):
        while not self.url_queue.empty():
            url = self.url_queue.get()
            response = requests.get(url, headers=self.headers).text
            """
            '''将Ajax中的json字符串写入文本'''
            page_name = re.findall('&after_id=(.*?)&', url)[0]
            with open(self.path + page_name + '.txt', 'w', encoding='utf-8') as f:
                f.write(response.text)
            """
            dict_resp = json.loads(response)
            list = dict_resp['data']['object_list']
            for i in list:
                id = i['photo']['id']
                href = i['photo']['path']
                self.img_data_queue.put((id, href))
        else:
            print('url_queue已空,线程结束')


class ThreadSaveImg(Thread):
    ''' 将url添加到队列中 '''
    def __init__(self, img_data_queue, path):
        super().__init__()
        self.path = path
        self.img_data_queue = img_data_queue

    def run(self):
        ''' 线程执行代码块 '''
        while True:
            try:
                id, href = self.img_data_queue.get(timeout=3)
            except:
                print('等待超时,线程停止!')
                break
            else:
                postfix = href.split('.')[-1]
                img_data = requests.get(href).content
                with open(self.path + str(id) + '.' + postfix, 'wb') as f:
                    f.write(img_data)
                    print(f'图片{id},保存成功!')


class ImageDuitang(ThreadFetchUrl, ThreadSaveImg):
    def __init__(self):
        self.url_prefix = 'https://www.duitang.com/napi/blogv2/list/by_search/?'
        self.headers = {
            'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.69",
        }
        self.url_queue = Queue()
        self.img_data_queue = Queue()
        if not os.path.exists('./duitang1'):
            os.mkdir('./duitang1')
        self.path = './duitang1/'

    def urlenqueue(self, page_num, kwd):
        for i in range(0, 24 * 5 * page_num, 24):
            params = {
                'kw': '{}'.format(kwd),
                'after_id': f'{i}',
                'type': 'feed',
                'include_fields': 'top_comments,is_root, source_link, item, buyable, root_id, status, like_count, like_id, sender, album, reply_count, favorite_blog_id',
                '_type': '',
            }
            url = self.url_prefix + urlencode(params)
            self.url_queue.put(url)


    def main(self):
        kwd = input('请输入数据关键字:')
        page_num = int(input('请输入要抓取前几页:'))
        self.urlenqueue(page_num, kwd)
        for i in range(10):
            t1 = ThreadFetchUrl(self.url_queue, self.img_data_queue, self.headers)
            t1.start()
        for i in range(30):
            t2 = ThreadSaveImg(self.img_data_queue, self.path)
            t2.start()



if __name__ == '__main__':
    DT = ImageDuitang()
    DT.main()
    print('\n&&&&&&&&&&主线程已结束&&&&&&&&&&\n')


http://www.niftyadmin.cn/n/5021557.html

相关文章

网卡bond和信息查看 EDACDIMMCEError错误导致服务器重启

https://blog.csdn.net/weixin_45720992?spm1001.2101.3001.5343 EDACDIMMCEError错误导致服务器重启 现象: 最近几天一个华为RH2285服务器一直不定时自动重启,基本每天一两次,查看系统日志报下面的错误,每秒记录一条错误日志 …

WIFI版本云音响设置教程阿里云平台版本

文章目录 WIFI本云音响设置教程介绍一、申请设备三元素1.登录阿里云物联网平台2.创建产品3.设置产品参数4.添加设备5.获取三元素 二、设置设备三元素1.打开MQTTConfigTools2.计算MQTT参数3.使用windows电脑的WIFI连接到设备热点4.设置参数5.配置设备连接路由器 三、阿里云物联网…

mvn打包:依赖包和启动包分离

简述 依赖插件&#xff1a; maven-jar-plugin maven-assembly-plugin项目目录结构 assembly.xml <assembly xmlns"http://maven.apache.org/ASSEMBLY/2.1.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://…

Mysql主从复制之skip-slave-start,slave-parallel-type,slave-parallel-workers参数详解和测试

参数1&#xff09;skip-slave-start 0 参数详解&#xff1a;禁用skip-slave-start&#xff0c;slave进程会随着mysql启动而启动。skip-slave-start1为开启 测试&#xff1a;当前slave的查不到该参数&#xff0c;且/etc/my.cnf也没有配置该文件&#xff0c;重启服务后&#x…

重装系统后原git项目报错

重装系统后使用sourcetree打开项目报错提示如下&#xff1a; 解决方案就是输入上图中给的提示:

flink MemoryStateBackend 和 RocksDBStateBackend 切换导致任务出现bug

这两个stateBackend有什么区别 速度和大小的区别 RocksDBStateBackend 会多出序列化,反序列化 所以性能更差,但是他可以支撑很大的状态. 和任务代码相关,可能导致bug 测试不同状态后端(注意开启checkpoint),使用 map_dp.get(key).append(value) 的效果是否相同其中 value是…

什么气传导蓝牙耳机好?2023气传导耳机推荐

​随着科技的发展&#xff0c;耳机市场正迎来一场前所未有的变革。气传导耳机作为一种新兴的耳机类型&#xff0c;正逐渐受到消费者的关注和青睐。然而&#xff0c;面对层出不穷的气传导耳机&#xff0c;我们该如何选择&#xff1f;本文将帮助你挑选到最适合自己的气传导耳机&a…

Microsoft 365企业版包含的主要产品

目录 前台 Office 365企业版 Microsoft Teams SharePoint Online OneDrive for Business Exchange Online Azure Active Directory