python获取ajax加载的数据

python 复制代码
"""  
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')
相关推荐
计算机徐师兄16 小时前
Python基于Flask的豆瓣电影数据分析可视化系统(附源码,文档说明)
爬虫·python·flask·豆瓣电影·豆瓣电影数据分析可视化系统·豆瓣电影数据分析·python豆瓣电影数据分析
大数据学习爱好者18 小时前
基于flask+vue的租房信息可视化系统
大数据·开发语言·爬虫·python·信息可视化
数据小爬虫@1 天前
利用Python爬虫按图搜索1688商品(拍立淘):实战案例指南
爬虫·python·图搜索算法
奔跑吧邓邓子1 天前
【Python爬虫(3)】解锁Python爬虫技能树:深入理解模块与包
开发语言·爬虫·python·模块·
m0_748251721 天前
【论文投稿】Python 网络爬虫:探秘网页数据抓取的奇妙世界
爬虫·python·microsoft
大懒猫软件1 天前
使用 Python 爬虫和 FFmpeg 爬取 B 站高清视频
爬虫·python·ffmpeg
大数据学习爱好者2 天前
python旅游推荐系统+爬虫+可视化(协同过滤算法)
大数据·爬虫·python·深度学习·信息可视化
m0_748239832 天前
Python中的简单爬虫
爬虫·python·信息可视化
代码轨迹3 天前
使用DeepSeek+本地知识库,尝试从0到1搭建高度定制化工作流(爬虫模块篇)
人工智能·爬虫·python
奔跑吧邓邓子3 天前
【Python爬虫(4)】揭开Python爬虫的神秘面纱:基础概念全解析
开发语言·爬虫·python·基础概念