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')
相关推荐
java1234_小锋19 小时前
[免费]基于Python的天气预报(天气预测分析)(Django+sklearn机器学习+selenium爬虫)可视化系统【论文+源码+SQL脚本】
爬虫·python·selenium·天气预报·天气预测
38242782719 小时前
python3网络爬虫开发实战 第2版:使用aiohttp
开发语言·爬虫·python
APIshop20 小时前
API 接口文档测试:从“能跑”到“敢上线”的完整闭环
爬虫·python
盼哥PyAI实验室20 小时前
[特殊字符]️ 实战爬虫:Python 抓取【采购公告】接口数据(含踩坑解析)
开发语言·爬虫·python
小白学大数据1 天前
Python 网络爬虫:Scrapy 解析汽车之家报价与评测
开发语言·爬虫·python·scrapy
weixin_446260851 天前
[特殊字符] MediaCrawler - 自媒体平台爬虫 [特殊字符]️
爬虫·媒体
傻啦嘿哟1 天前
用Kubernetes管理大规模爬虫节点:从单机到云原生的进化之路
爬虫·云原生·kubernetes
王同学_1162 天前
爬虫辅助技术(css选择器、xpath、正则基础语法)
前端·css·爬虫
3824278272 天前
使用 webdriver-manager配置geckodriver
java·开发语言·数据库·爬虫·python