Python-爬虫案例

Python-爬虫案例

  • 代码
  • 代码

代码

import requests
import json
import threading
from queue import Queue
import timeclass 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).textdata = 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):# 准备车载用品类页面的URLself.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_goodsdef load_detail_page(self, all_goods):"""抓取商品详情页的数据:param all_goods: 车载用品类下的所有商品:return: 所有商品的详情信息"""# 准备基本URLbase_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_infodef 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_infodef save_data(self, goods_info):"""存储商品详情的数据:param get_goods_info:"""# 建立连接到本地的MongoDBclient = self.client# 访问/创建数据库rabbitdb = client.rabbitry: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.mzph.cn/diannao/38304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端笔记-day11

文章目录 01-空间-平移02-视距03-空间旋转Z轴04-空间旋转X轴05-空间旋转Y轴06-立体呈现07-案例-3D导航08-空间缩放10-动画实现步骤11-animation复合属性12-animation拆分写法13-案例-走马灯14-案例-精灵动画15-多组动画16-全民出游全民出游.htmlindex.css 01-空间-平移 <!D…

基于Spring Boot的在线医疗咨询平台的设计与实现【附源码】

基于Spring Boot的在线医疗咨询平台的设计与实现 Design and implementation of the computer hardware mall based on Spring Boot Candidate&#xff1a; Supervisor&#xff1a; April 20th, 2024 学位论文原创性声明 本人郑重声明&#xff1a;所呈交的论文是本人在导师…

初中英语优秀作文分析-006How to Deal with the Exam Stress-如何应对考试压力

更多资源请关注纽扣编程微信公众号 记忆树 1 We students are very busy with schoolwork and in the face of many exams every school day. 翻译 我们学生忙于功课&#xff0c;每个上学日都面临许多考试。 简化记忆 考试 句子结构 We students 主语 我们学生&#xf…

Vite: 高阶特性 Pure ESM

概述 ESM 已经逐步得到各大浏览器厂商以及 Node.js 的原生支持&#xff0c;正在成为主流前端模块化方案。 而 Vite 本身就是借助浏览器原生的 ESM 解析能力( type“module” )实现了开发阶段的 no-bundle &#xff0c;即不用打包也可以构建 Web 应用。不过我们对于原生 ESM 的…

综合评价类模型——突变级数法

含义 首先&#xff1a;对评价目标进行多层次矛盾分解其次&#xff1a;利用突变理论和模糊数学相结合产生突变模糊隶属函数再次&#xff1a;由归一公式进行综合量化运算最终&#xff1a;归一为一个参数&#xff0c;即求出总的隶属函数&#xff0c;从而对评价目标进行排序分析特点…

【linux/shell实战案例】shell中变量的使用

目录 一.linux变量声明及定义 二.linux变量使用方法 三.linux变量使用花括号${name}和双引号“$name”的区别 四.linux变量使用单引号$name和双引号“$name”的区别 五.linux变量中使用命令 一.linux变量声明及定义 #!/bin/bash namezhaodabao 等号两边不能有空格变量名…

ES6面试题——箭头函数和普通函数有什么区别

1. this指向问题 <script> let obj {a: function () {console.log(this); // 打印出&#xff1a;{a: ƒ, b: ƒ}},b: () > {console.log(this); // 打印出Window {window: Window, self: Window,...}}, }; obj.a(); obj.b(); </script> 箭头函数中的this是在箭…

成都市水资源公报(2000-2022年)

数据年限&#xff1a;2000-2022年&#xff0c;无2009年 数据格式&#xff1a;pdf、word、jpg 数据内容&#xff1a;降水量、地表水资源量、地下水资源量、水资源总量、蓄水状况、平原区浅层地下水动态、水资源情况分析、供水量、用水量、污水处理、洪涝干旱等

类似李跳跳的软件有什么,强烈推荐所有安卓手机安装!!!

今天阿星分享一款让安卓手机更顺滑的神器——智慧岛。你问我李跳跳&#xff1f;由于大家都知道的原因&#xff0c;那是个曾经让广告无处遁形的神兵利器&#xff0c;可惜现在它已经退休了。不过别担心&#xff0c;智慧岛接过了接力棒&#xff0c;继续为我们的安卓体验保驾护航。…

Raccon:更好防侧信道攻击的后量子签名方案

1. 引言 安全社区已经开发出了一些出色的加密算法&#xff0c;这些算法非常安全&#xff0c;但最终&#xff0c;所有的数据都会被存储在硅和金属中&#xff0c;而入侵者越来越多地会在那里放置监视器来破解密钥。 破解加密密钥通常涉及暴力破解方法或利用实施过程中的缺陷。然…

2029年AI服务器出货量将突破450万台,AI推理服务器即将爆发式增长

在2020年&#xff0c;新冠疫情与远程办公模式的兴起推动了所有类型服务器的出货量达到峰值&#xff0c;随后几年里&#xff0c;除了AI服务器之外的所有类别都回归到了正常水平。 根据Omdia的研究数据&#xff0c;AI服务器的出货量在2020年急剧上升&#xff0c;并且至今未显示出…

浏览器中如何获取用户网络状态

网页开发中存在需要获取用户是否在线的场景及用户网络状态&#xff0c;浏览器提了navigator.onLine和navigator.connection可以实现这一需求。 获取在线状态 if (navigator.onLine) {console.log("online"); } else {console.log("offline"); }监听网络状…

日志的介绍

知识铺垫&#xff1a;在我们日常开发中&#xff0c;其实日志是和我们息息相关的。但可能平常都没怎么注意到日志相关的知识点&#xff0c;也不怎么关注日志&#xff0c;然后&#xff0c;在生产环境中&#xff0c;日志是必不可少的存在&#xff0c;项目出现问题了都是通过日志来…

cesium 添加 Echarts 图层(空气质量点图)

cesium 添加 Echarts 图层(下面附有源码) 1、实现思路 1、在scene上面新增一个canvas画布 2、通坐标转换,将经纬度坐标转为屏幕坐标来实现 3、将ecarts 中每个series数组中元素都加 coordinateSystem: ‘cesiumEcharts’ 2、示例代码 <!DOCTYPE html> <html lan…

Excel 数据筛选难题解决

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

缓存穿透、雪崩与击穿

缓存穿透、雪崩、击穿 1、缓存穿透强调都没有数据并发访问布隆过滤器缓存NULL值 2、缓存雪崩强调批量Key过期并发访问 3、缓存击穿强调单个Key过期并发访问互斥锁逻辑过期 分布式并发控制 1、缓存穿透 缓存穿透是指数据库和缓存都没有的数据&#xff0c;这样缓存永远不会生效&…

图形化用户界面-java头歌实训

图形化用户界面 import java.awt.*; import javax.swing.*; public class GraphicsTester extends JFrame { public GraphicsTester() { super("Graphics Demo"); setSize(480, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void paint…

服务器raid5坏盘-换盘-修复阵列过程

目录 背景原因分析解决步骤名词解释进入raid管理界面换回旧4号&#xff0c;进行import再次更换4号盘 总结 背景 服务器除尘之后文件服务器部分文件不能访问了,部分文件夹内容为空&#xff0c;起初以为是新配置的权限的问题&#xff0c;排查之后发现不仅仅是权限问题 jumpserv…

ISA95-标准2-数据字典部分的解析与设计指南

在 MES/MOM 系统中,ISA-95 第二部分的数据字典扮演着至关重要的角色,它确保了数据的一致性和准确性,为不同系统间的数据交换提供了标准化的术语和定义。以下是 MES/MOM 系统实现 ISA-95 第二部分数据字典的具体概念、功能模块以及应用场景: 一、概念、功能模块以及应用场景…

numpy - array(4)

arr1 np.array([[1, 2], [3, 4], [5, 6]]) &#xff08;1&#xff09;def insert(arr, obj, values, axisNone) 向array指定位置插入指定值 axis为默认值None时&#xff0c;如果array是多维数据,则先将array转化成向量obj&#xff1a;插入的索引&#xff0c;接受int或者多…