Python-爬虫案例

Python-爬虫案例

  • 代码
  • 代码

代码

import requests
import json
import threading
from queue import Queue
import time


class HeiMaTouTiao:
    def __init__(self):
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) "
                          "AppleWebKit/537.36 (KHTML, like Gecko) "
                          "Chrome/92.0.4515.107 Safari/537.36",
            'Authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIU'
                             'zI1NiJ9.eyJleHAiOjE2NTY2NTk3NjcsInVzZXJfaWQiOjEsInJlZn'
                             'Jlc2giOmZhbHNlLCJ2ZXJpZmllZCI6dHJ1ZX0.ZSdV5mT6w_yhEKLg'
                             'qcvWNln2GKHBxfxK7d8YXaoCMYg'}
        # URL队列
        self.url_queue = Queue()
        # 提取的内容队列
        self.content_queue = Queue()

    def get_url_list(self, start_page, end_page):
        url_temp = 'http://api-toutiao-web.itheima.net/mp/v1_0/articles?' \
                   'page={}&per_page=10&response_type=comment'
        url_list = [url_temp.format(i) for i in range(start_page, end_page + 1)]
        for url in url_list:
            print('正在请求:', url)
            self.url_queue.put(url)

    def get_data(self):
        content_li = []
        while True:
            url = self.url_queue.get()
            comment = requests.get(url=url, headers=self.headers).text
            data = json.loads(comment)
            data = data['data']['results']
            for index in range(len(data)):
                content = dict()
                content['标题'] = data[index]['title']
                if data[index]['comment_status'] is True:
                    content['评论状态'] = '正常'
                else:
                    content['评论状态'] = '关闭'
                content['总评论数'] = data[index]['total_comment_count']
                content['粉丝评论数'] = data[index]['fans_comment_count']
                content_li.append(content)
            self.content_queue.put(content_li)
            self.url_queue.task_done()

    def save_data(self):
        while True:
            content_list = self.content_queue.get()
            with open('toutiao.json', mode='a+', encoding='utf-8')as f:
                f.write(json.dumps(content_list, ensure_ascii=False, indent=2))
            self.content_queue.task_done()

    def run(self):
        start_page = int(input('请输入抓取的起始页:'))
        end_page = int(input('请输入抓取的结束页:'))
        # 线程列表
        t_list = []
        if start_page <= 0:
            print('抓取的起始页从1开始。')
        else:
            t_url = threading.Thread(target=self.get_url_list, args=(
                start_page, end_page))
            t_list.append(t_url)
        # 提取内容线程
        for i in range(9):
            t_content = threading.Thread(target=self.get_data)
            t_list.append(t_content)
        # 保存数据
        t_save = threading.Thread(target=self.save_data)
        t_list.append(t_save)
        for t in t_list:
            t.setDaemon(True)
            t.start()
        for q in [self.url_queue, self.content_queue]:
            q.join()


if __name__ == '__main__':
    heimatoutiao = HeiMaTouTiao()
    start_time = time.time()
    heimatoutiao.run()
    end_time = time.time()
    print(f'总用时:{end_time - start_time}秒')

这段Python代码定义了一个名为 HeiMaTouTiao 的类,用于爬取和保存某学习网站上的文章信息。

代码

import requests
import json
from pymongo import MongoClient
class LittleRabbit:
    def __init__(self):
        # 准备车载用品类页面的URL
        self.init_url = 'https://apipc-xiaotuxian-front.itheima.net/category/goods/temporary'
        # 请求头
        self.headers = {
            "Content-Type": "application/json;charset=utf-8",
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64)'
                          'AppleWebKit/537.36 (KHTML, like Gecko)'
                          'Chrome/90.0.4430.212 Safari/537.36'}
        # 连接MongoDB的客户端
        self.client = MongoClient('127.0.0.1', 27017)

    def load_category_page(self, page):
        """
        抓取车载用品类商品展示页面的数据
        :param page:待抓取的页码数
        :return:车载用品类下的所有商品
        """
        # 准备请求体
        request_payload = {"page": page, "pageSize": 20, "categoryId": "1005009"}
        # 将字典form_data转换为JSON字符串
        json_data = json.dumps(request_payload)
        response = requests.post(url=self.init_url, data=json_data,
                                 headers=self.headers)
        # 将服务器返回的JSON字符串先转换成字典,再获取字典中的商品信息
        all_goods = json.loads(response.text)["result"]["items"]
        return all_goods

    def load_detail_page(self, all_goods):
        """
        抓取商品详情页的数据
        :param all_goods: 车载用品类下的所有商品
        :return: 所有商品的详情信息
        """
        # 准备基本URL
        base_url = 'https://apipc-xiaotuxian-front.itheima.net/goods?'
        # 定义一个数组,保存所有商品的详情信息
        goods_detail_info = []
        for good_info in all_goods:
            # 提取商品的ID标识
            good_id = dict(id=good_info['id'])
            # 根据拼接商品详情页的完整URL,发送GET请求
            response = requests.get(url=base_url, params=good_id)
            # 将服务器返回的JSON数据转换为字典
            good_detail = json.loads(response.text)
            goods_detail_info.append(good_detail)
        return goods_detail_info

    def parse_page(self, detail_data):
        """
        解析商品详情页的数据,提取目标数据
        :param detail_data:所有商品的详情数据
        :return:所有商品的信息
        """
        # 定义一个列表,保存所有商品的信息
        all_goods_info = []
        temp_url = 'http://erabbit.itheima.net/#/product/'
        for info in detail_data:
            dict_data = dict()
            dict_data['商品名称'] = info['result']['name']
            dict_data['商品描述'] = info['result']['desc']
            dict_data['商品链接'] = temp_url + info['result']['id']
            dict_data['商品价格'] = info['result']['price']
            # 获取详情页面中的第一张图片
            dict_data['商品图片'] = info['result']['mainPictures'][0]
            good_detail = info['result']['details']['properties']
            dict_data['商品详情'] = ''.join([':'.join(info.values()) + '\n' for info in good_detail])
            all_goods_info.append(dict_data)
        return all_goods_info

    def save_data(self, goods_info):
        """
        存储商品详情的数据
        :param get_goods_info:
        """
        # 建立连接到本地的MongoDB
        client = self.client
        # 访问/创建数据库rabbit
        db = client.rabbi
        try:
            for good in goods_info:
                # 创建集合little_rabbit,并在该集合中插入文档对象
                db.little_rabbit.insert_one(good)
            print('保存成功')
            # 访问集合中的文档对象
            result = db.little_rabbit.find()
            for doc in result:
                print(doc)
        except Exception as error:
            print(error)

    def run(self):
        """
        启动网络爬虫,控制网络爬虫的执行流程
        """
        begin_page = int(input('起始页码:'))
        end_page = int(input('结束页码:'))
        if begin_page <= 0:
            print('起始页码从1开始')
        else:
            for page in range(begin_page, end_page + 1):
                print(f'正在抓取第{page}页')
                all_goods = self.load_category_page(page)
                goods_detail = self.load_detail_page(all_goods)
                goods_info = self.parse_page(goods_detail)
                self.save_data(goods_info)


if __name__ == '__main__':
    lr = LittleRabbit()
    lr.run()

用于爬取和存储指定网站上的商品信息到MongoDB数据库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/758845.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GIT-LFS使用

0.前言 目前git仓库有很多很大的文件需要管理&#xff0c;但是直接上传&#xff0c;每次clone的文件太大&#xff0c;所有准备使用git-lfs解决。 1、下载和安装 Git LFS 1.1、直接下载二进制包&#xff1a; Releases git-lfs/git-lfs GitHub 安装 Git LFS sudo rpm -ivh…

Leica Cyclone 3DR2024 一款功能强大的点云建模软件下载License获取

Leica Cyclone 3DR 2024 是一款功能强大的点云建模软件&#xff0c;使用旨在为用户提供全面的点云管理、自动化的点云分析&#xff0c;结合强大的建模&#xff0c;在一个直观友好的环境中&#xff0c;专注的完成挑战&#xff0c;提高生产力&#xff0c;轻松创建并交付专业的成果…

杨幂跨界学术圈:内容营销专家刘鑫炜带你了解核心期刊的学术奥秘

近日&#xff0c;知名艺人杨幂在权威期刊《中国广播电视学刊》上发表了一篇名为《浅谈影视剧中演员创作习惯——以电视剧<哈尔滨一九四四>为例》的学术论文&#xff0c;此举在学术界和娱乐圈均引起了广泛关注。该期刊不仅享有极高的声誉&#xff0c;还同时被北大中文核心…

Data-Driven Reinforcement Learning for Robotic Manipulation

意思是 不同的任务以及机器人都有单独的数据和模型 未来需要整合 一个大的数据集包含所有的 然后训练一个大模型 以后具体的任务只需要针对这个模型进行微调 challenge bootstrapping with large data 2 3 4 高清图补充

【C++】using namespace std 到底什么意思

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文作为 JohnKi 的学习笔记&#xff0c;引用了部分大佬的案例 &#x1f4e2;未来很长&a…

【SGX系列教程】(二)第一个 SGX 程序: HelloWorld,linux下运行

文章目录 0. SGX基础原理分析一.准备工作1.1 前提条件1.2 SGX IDE1.3 基本原理 二.程序设计2.1 目录结构2.2 源码设计2.2.1 Encalve/Enclave.edl:Enclave Description Language2.2.2 Enclave/Enclave.lds: Enclave linker script2.2.3 Enclave/Enclave.config.xml: Enclave 配置…

ctfshow-web入门-命令执行(web59-web65)

目录 1、web59 2、web60 3、web61 4、web62 5、web63 6、web64 7、web65 都是使用 highlight_file 或者 show_source 1、web59 直接用上一题的 payload&#xff1a; cshow_source(flag.php); 拿到 flag&#xff1a;ctfshow{9e058a62-f37d-425e-9696-43387b0b3629} 2、w…

MathType7.6专业数学公式编辑器!与Word、PPT等常用软件无缝对接。

MathType&#xff0c;一款专业的数学公式编辑器&#xff0c;以其强大的功能和友好的用户界面&#xff0c;在科研、教学等领域广受欢迎。它支持丰富的数学符号和公式模板&#xff0c;满足不同用户的需求。同时&#xff0c;MathType还提供了多种输出格式&#xff0c;方便与其他文…

3ds Max导出fbx贴图问题简单记录

1.前言 工作中发现3ds Max导出的fbx在其它软件&#xff08;Autodesk viewer&#xff0c;blender&#xff0c;navisworks&#xff0c;FBXReview等&#xff09;中丢失了部分贴图&#xff0c;但导出的fbx用3ds Max打开却正常显示。 fbx格式使用范围较广&#xff0c;很多常见的三…

如何用Go语言,实现基于宏系统的解释器?

目录 一、Go语言介绍二、什么是宏系统三、什么是解释器四、如何用Go语言实现一个基于宏系统的解释器&#xff1f; 一、Go语言介绍 Go语言&#xff0c;又称为Golang&#xff0c;是一种由谷歌公司开发并开源的编程语言。Go语言的设计目标是提高程序员的生产力&#xff0c;同时具…

树莓派开发之文件传输

文章目录 一、简介使用U盘传输文件使用SD卡传输文件使用Xftp 7传输文件 二、 总结 一、简介 在树莓派开发中经常会用到文件传输&#xff0c;下面介绍几种树莓派文件传输的几种方法。 使用U盘传输文件 &#xff08;1&#xff09;复制所需传输文件到U盘 &#xff08;2&#…

详细介绍MySQL的索引(上)

索引 索引概述 索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用(指向数据&#xff0c;这样就可以在这些数据结构上实现高级查找算法&#xff0c;这种数据结…

【计算机图形学】期末考试知识点汇总(上)

文章目录 视频教程第一章 计算机图形学概述计算机图形学的定义计算机图形学的应用计算机图形学 vs 图像处理 vs模式识别图形显示器的发展及工作原理理解三维渲染管线 第二章 基本图元的扫描转换扫描转换直线的扫描转换DDA算法Bresenham算法中点画线算法圆的扫描转换中点画圆算法…

json文件 增删查改

默认收藏夹 qt操作json格式文件... 这个人的 写的很好 我的demo全是抄他的 抄了就能用 —————————— 下次有空把我的demo 传上来 在E盘的demo文件夹 json什么名字

小迪安全v2023笔记 1-18

小迪安全v2023笔记 1-18 棱角社区 文章目录 1. 基础入门1. 正向shell与反向shell2. web应用3. 抓包&#xff0c;封包&#xff0c;协议&#xff0c;app&#xff0c;小程序&#xff0c;pc应用&#xff0c;web应用 2. 信息打点1. 常见信息获取2. 文件泄露3. 常见阻碍4. CDN绕过&a…

二叉树第二期:堆的实现与应用

若对树与二叉树的相关概念&#xff0c;不太熟悉的同学&#xff0c;可移置上一期博客 链接&#xff1a;二叉树第一期&#xff1a;树与二叉树的概念-CSDN博客 本博客目标&#xff1a;对二叉树的顺序结构&#xff0c;进行深入且具体的讲解&#xff0c;同时学习二叉树顺序结构的应用…

电子电路学习笔记(3)三极管

部分内容参考链接&#xff1a; 电子电路学习笔记&#xff08;5&#xff09;——三极管_三极管 箭头-CSDN博客 模拟电子技术基础笔记&#xff08;4&#xff09;——晶体三极管_集电结的单向导电性-CSDN博客 硬件基本功-36-三极管Ib电流如何控制Ic电流_哔哩哔哩_bilibili 部分…

栈的实现

栈 1.栈的概念及结构 栈是一种特殊的线性表&#xff0c;其只允许在固定的一端插入和删除元素。进行插入和删除的一端称为栈顶&#xff0c;另一端称为栈底。栈中的元素支持先进后出的原则。 2.栈的实现 栈的实现一般使用数组和链表&#xff0c;相对而言使用数组更优一些&…

SpringCloud Alibaba Seata2.0基础入门与安装

官网地址&#xff1a;https://seata.apache.org/zh-cn/ GitHub下载地址&#xff1a;https://github.com/apache/incubator-seata/releases 本文这里下载的是seata2.0.0版本。 【1】概述 ① Seata是什么 Simple Extensible Autonomous Transaction Architecture&#xff0c…

python多继承的3C算法

python多继承的3C算法 有很多地方都说python多继承的继承顺序&#xff0c;是按照深度遍历的方式&#xff0c;其实python多继承顺序的算法&#xff0c;不是严格意义上的深度遍历&#xff0c;而是基于深度遍历基础上优化出一种叫3C算法 python多继承的深度遍历 class C:def ru…