什么猫猫最受欢迎?Python采集猫咪交易数据
前言
在日常生活中,我们看到可爱的猫咪表情包,总是会忍不住收藏

认识的一些朋友也养了猫,比如橘猫、英短、加菲猫之类的

看他们发朋友圈撸猫,老羡慕了,猫咪真的太可爱啦。

你是不是也动过养猫猫的小心思呢~反正我是动过了
于是,网上闲逛的时候发现一个专门交易猫猫的网站—猫猫交易网
这不得采集20W+ 条猫猫数据,以此来了解一下可爱的猫咪。

python源码、教程、资料、解答: 点击此处跳转文末名片获取
数据获取
打开猫猫交易网,先采集猫咪品种数据,首页点击猫咪品种

这里打开页面可以看到猫猫品种列表:

但只显示了每种猫猫的品种名,参考价格,我们点进详情页,可以看到更加详细的数据:
品种名、参考价格、中文学名、基本信息、性格特点、生活习性、优缺点、喂养方法等。

检查网页,可以发现网页结构简单,容易解析和提取数据。
代码如下:
import requests
import re
import csv
from lxml import etree
from tqdm import tqdm
from fake_useragent import UserAgent
随机产生请求头
ua = UserAgent(verify_ssl=False, path='fake_useragent.json')def random_ua(): # 用于随机切换请求头headers = {"Accept-Encoding": "gzip","Accept-Language": "zh-CN","Connection": "keep-alive","Host": "www.maomijiaoyi.com","User-Agent": ua.random}return headers
创建保存数据的csv
def create_csv(): with open('./data/cat_kind.csv', 'w', newline='', encoding='utf-8') as f:wr = csv.writer(f)wr.writerow(['品种', '参考价格', '中文学名', '别名', '祖先', '分布区域','原产地', '体型', '原始用途', '今日用途', '分组', '身高','体重', '寿命', '整体', '毛发', '颜色', '头部', '眼睛','耳朵', '鼻子', '尾巴', '胸部', '颈部', '前驱', '后驱','基本信息', 'FCI标准', '性格特点', '生活习性', '优点/缺点','喂养方法', '鉴别挑选'])
获取HTML网页源代码 返回文本
def scrape_page(url1): response = requests.get(url1, headers=random_ua())# print(response.status_code)response.encoding = 'utf-8'return response.text
获取每个品种猫咪详情页url
def get_cat_urls(html1): dom = etree.HTML(html1)lis = dom.xpath('//div[@class="pinzhong_left"]/a')cat_urls = []for li in lis:cat_url = li.xpath('./@href')[0]cat_url = 'http://*****' + cat_urlcat_urls.append(cat_url)return cat_urls
采集每个品种猫咪详情页里的有关信息
def get_info(html2): # 品种kind = re.findall('div class="line1">.*?<div class="name">(.*?)<span>', html2, re.S)[0]kind = kind.replace('\r','').replace('\n','').replace('\t','')# 参考价格price = re.findall('<div>参考价格:</div>.*?<div>(.*?)</div>', html2, re.S)[0]price = price.replace('\r', '').replace('\n', '').replace('\t', '')# 中文学名chinese_name = re.findall('<div>中文学名:</div>.*?<div>(.*?)</div>', html2, re.S)[0]chinese_name = chinese_name.replace('\r', '').replace('\n', '').replace('\t', '')# 别名other_name = re.findall('<div>别名:</div>.*?<div>(.*?)</div>', html2, re.S)[0]other_name = other_name.replace('\r', '').replace('\n', '').replace('\t', '')# 祖先ancestor = re.findall('<div>祖先:</div>.*?<div>(.*?)</div>', html2, re.S)[0]ancestor = ancestor.replace('\r', '').replace('\n', '').replace('\t', '')# 分布区域area = re.findall('<div>分布区域:</div>.*?<div>(.*?)</div>', html2, re.S)[0]area = area.replace('\r', '').replace('\n', '').replace('\t', '')# 原产地source_area = re.findall('<div>原产地:</div>.*?<div>(.*?)</div>', html2, re.S)[0]source_area = source_area.replace('\r', '').replace('\n', '').replace('\t', '')# 体型body_size = re.findall('<div>体型:</div>.*?<div>(.*?)</div>', html2, re.S)[0]body_size = body_size.replace('\r', '').replace('\n', '').replace('\t', '').strip()# 原始用途source_use = re.findall('<div>原始用途:</div>.*?<div>(.*?)</div>', html2, re.S)[0]source_use = source_use.replace('\r', '').replace('\n', '').replace('\t', '')# 今日用途today_use = re.findall('<div>今日用途:</div>.*?<div>(.*?)</div>', html2, re.S)[0]today_use = today_use.replace('\r', '').replace('\n', '').replace('\t', '')# 分组group = re.findall('<div>分组:</div>.*?<div>(.*?)</div>', html2, re.S)[0]group = group.replace('\r', '').replace('\n', '').replace('\t', '')# 身高height = re.findall('<div>身高:</div>.*?<div>(.*?)</div>', html2, re.S)[0]height = height.replace('\r', '').replace('\n', '').replace('\t', '')# 体重weight = re.findall('<div>体重:</div>.*?<div>(.*?)</div>', html2, re.S)[0]weight = weight.replace('\r', '').replace('\n', '').replace('\t', '')# 寿命lifetime = re.findall('<div>寿命:</div>.*?<div>(.*?)</div>', html2, re.S)[0]lifetime = lifetime.replace('\r', '').replace('\n', '').replace('\t', '')# 整体entirety = re.findall('<div>整体</div>.*?<!-- 页面小折角 -->.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]entirety = entirety.replace('\r', '').replace('\n', '').replace('\t', '').strip()# 毛发hair = re.findall('<div>毛发</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]hair = hair.replace('\r', '').replace('\n', '').replace('\t', '').strip()# 颜色color = re.findall('<div>颜色</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]color = color.replace('\r', '').replace('\n', '').replace('\t', '').strip()# 头部head = re.findall('<div>头部</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]head = head.replace('\r', '').replace('\n', '').replace('\t', '').strip()# 眼睛eye = re.findall('<div>眼睛</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]eye = eye.replace('\r', '').replace('\n', '').replace('\t', '').strip()# 耳朵ear = re.findall('<div>耳朵</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]ear = ear.replace('\r', '').replace('\n', '').replace('\t', '').strip()# 鼻子nose = re.findall('<div>鼻子</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]nose = nose.replace('\r', '').replace('\n', '').replace('\t', '').strip()# 尾巴tail = re.findall('<div>尾巴</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]tail = tail.replace('\r', '').replace('\n', '').replace('\t', '').strip()# 胸部chest = re.findall('<div>胸部</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]chest = chest.replace('\r', '').replace('\n', '').replace('\t', '').strip()# 颈部neck = re.findall('<div>颈部</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]neck = neck.replace('\r', '').replace('\n', '').replace('\t', '').strip()# 前驱font_foot = re.findall('<div>前驱</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]font_foot = font_foot.replace('\r', '').replace('\n', '').replace('\t', '').strip()# 后驱rear_foot = re.findall('<div>前驱</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]rear_foot = rear_foot.replace('\r', '').replace('\n', '').replace('\t', '').strip()
保存前面猫猫的各种有关信息
cat = [kind, price, chinese_name, other_name, ancestor, area, source_area,body_size, source_use, today_use, group, height, weight, lifetime,entirety, hair, color, head, eye, ear, nose, tail, chest, neck, font_foot, rear_foot]
提取标签栏信息(基本信息-FCI标准-性格特点-生活习性-优缺点-喂养方法-鉴别挑选)
html2 = etree.HTML(html2)labs = html2.xpath('//div[@class="property_list"]/div')for lab in labs:text1 = lab.xpath('string(.)')text1 = text1.replace('\n','').replace('\t','').replace('\r','').replace(' ','')cat.append(text1)return cat
保存数据 追加写入
def write_to_csv(data): with open('./data/cat_kind.csv', 'a+', newline='', encoding='utf-8') as fn:wr = csv.writer(fn)wr.writerow(data)
创建保存数据的csv
if __name__ == '__main__':create_csv()# 猫咪品种页面urlbase_url = 'http://*****/index.php?/pinzhongdaquan_5.html'# 获取品种页面中的所有urlhtml = scrape_page(base_url)urls = get_cat_urls(html)# 进度条可视化运行情况 就不打印东西来看了pbar = tqdm(urls)
开始采集
for url in pbar:text = scrape_page(url)info = get_info(text)write_to_csv(info)
成功采集了猫咪品种数据保存到csv,接下来采集猫猫交易数据

进入到买猫卖猫页面:

爬取更详细的数据需要进入详情页,包含商家信息、猫咪品种、猫龄、价格、标题、在售只数、预防等信息。

由于数据量较大,可以分开爬取,先获取到每一页中的所有猫猫详情交易链接的 url 保存到csv,再
读取 csv 中的 url 来请求,爬取每条交易数据,爬虫思路跟前面类似,为了加快爬取效率,可以使用多线程或者异步爬虫。
最终获取了 20W+ 条数据。
尾语 💝
要成功,先发疯,下定决心往前冲!
学习是需要长期坚持的,一步一个脚印地走向未来!
未来的你一定会感谢今天学习的你。
—— 心灵鸡汤
本文章到这里就结束啦~感兴趣的小伙伴可以复制代码去试试哦 😝

相关文章:
什么猫猫最受欢迎?Python采集猫咪交易数据
前言 在日常生活中,我们看到可爱的猫咪表情包,总是会忍不住收藏 认识的一些朋友也养了猫,比如橘猫、英短、加菲猫之类的 看他们发朋友圈撸猫,老羡慕了,猫咪真的太可爱啦。 你是不是也动过养猫猫的小心思呢~反正我是动…...
使用Nextcloud搭建私人云盘,并内网穿透实现公网远程访问
文章目录摘要视频教程1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名摘要 Nextcloud,它是ownCloud的一个分支,是一个文件…...
行业盛会|2023中国(东莞)国际测量控制及仪器仪表展览会
时间:2023年11月16-18日 地点:广东现代国际展览中心 ◆展会背景background: 众所周知,当今世界已经进入信息时代,信息技术成为推动科学技术高速发展的关键技术。…...
redis集群 服务器重启测试
redis集群 服务器重启测试1、集群规划:2台服务器 每台服务器运行3个redis实例2、重启2台服务器后redis实例没有自动重启最后一对主从节点比较 重启实例后和之前的主从分配3、再次重启2台服务器4、主从同步测试1、集群规划:2台服务器 每台服务器运行3个re…...
Diffusion的unet中用到的AttentionBlock详解
AttentionBlocktorch.splittorch中的permute的用法torch.transpose()view()torch.bmmsoftmax(x, dim-1)Diffusion的unet中用到的AttentionBlock详解class AttentionBlock(nn.Module):__doc__ r"""Applies QKV self-attention with a residual connection.Input…...
ElasticSearch索引文档写入和近实时搜索
一、基本概念 1.Segments In Lucene 众所周知,ElasticSearch存储的基本单元Shard,ES中一个Index可能分为多个Shard,事实上每个Shard都是一个Lucence的Index,并且每个Lucene Index由多个Segment组成,每个Segment事实上…...
【C语言蓝桥杯每日一题】——等差数列
【C语言蓝桥杯每日一题】——等差数列😎前言🙌等差数列🙌解题思路分析:😍解题源代码分享:😍总结撒花💞😎博客昵称:博客小梦 😊最喜欢的座右铭&…...
EM7电磁铁的技术参数
电磁铁可以通过更换电磁铁极头在一定范围内改善磁场的大小和磁场的均匀度 ,并且可以通过调整极头间距改变磁场的大小。主要用于磁滞现象研究、磁化系数测量、霍尔效应研究、磁光实验、磁场退火、核磁共振、电子顺磁共振、生物学研究、磁性测量、磁性材料取向、磁性产…...
选择很重要,骑友,怎么挑选骑行装备?
骑行装备的重要性,已经不用多说了,大家也都知道。但是如何挑选,如何选择适合自己的骑行装备呢?今天我来和大家聊一聊这个问题。首先我们需要了解一个概念:骑行装备分为两大类:骑行服和骑行鞋。对于公路车来…...
【JUC面试题】Java并发编程面试题
Java并发编程 基础知识 1. 为什么要使用并发编程? 提升多核系统的CPU利用率一般来说一台主机上的会有多个CPU核心,我们可以创建多个线程,理论 上讲操作系统可以将多个线程分配给不同的CPU去执行,每个CPU执行一个线程,…...
spark笔记
spark笔记 1. 概述 Spark是一种基于内存的快速、通用、可扩展的大数据分析计算引擎;Spark提供内存计算,将计算结果直接放在内存中,减少了迭代计算的IO开销,有更高效的运算效率。 1.1 Spark核心模块 Spark Core:提供S…...
丢失了packet.dll原因和解决方法全面指南
packet.dll是Windows操作系统中的一个重要文件,它主要用于网络通信,如果丢失了这个文件,可能会导致网络连接问题。本文将探讨packet.dll文件丢失的原因,并提供相应的解决方法。 一、丢失packet.dll文件的原因 1. 病毒感染&#x…...
算法练习随记(三)
1.全排列 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2: 输入&#x…...
基于Python 进行卫星图像多种指数分析
一、前言本文帮助读者更好地了解卫星数据以及使用 Python 探索和分析哨兵2卫星数号数据在Sundarbans地区的不同方法。二、Sundarbans研究区孙德尔本斯(Sundarbans)是恒河、雅鲁藏布江和梅克纳河在孟加拉湾汇合形成的三角洲中最大的红树林区之一。 孙德尔…...
(Week 15)综合复习(C++,字符串,数学)
文章目录T1 [Daimayuan]删删(C,字符串)输入格式输出格式样例输入样例输出数据规模解题思路T2 [Daimayuan]快快变大(C,区间DP)输入格式输出格式样例输入样例输出数据规模解题思路T3 [Daimayuan]饿饿 饭饭2&a…...
迪赛智慧数——柱状图(正负条形图):“光棍”排行榜TOP10省份
效果图 中国单身男女最多的省份是广东,广东的人口是全国最多的。人口多了,单身的人也会多,单身女性324万,男性498万。全国第二的省份是四川省,单身女性256万,单身男性296万。 数据源:静态数据…...
IDEA集成chatGTP让你编码如虎添翼
第一步,打开您的IDEA, 打开首选项(Preference) -> 插件(Plugin) 在插件市场搜索 chatGPT, 点击安装 安装完毕后会提示您重启IDE, 重启IDEA. 重启后您会发现窗口,右边条上 竖着挂着个chatGPT按钮了。 第二步、配置APIkey或accessToken(二选一,推荐accessToken无费用…...
Python3 os.close() 方法、Python3 File readline() 方法
Python3 os.close() 方法 概述 os.close() 方法用于关闭指定的文件描述符 fd。 语法 close()方法语法格式如下: os.close(fd);参数 fd -- 文件描述符。 返回值 该方法没有返回值。 实例 以下实例演示了 close() 方法的使用: #!/usr/bin/python3…...
Vision Pro 自己写的一些自定义工具(c#)
目录前言一、保存图片工具1、展示2、源码下载地址二、3D图片格式转化1、展示2、源码下载地址三、所有工具汇总下载地址前言 自己用c#写的一些visionPro自定义工具,便于使用的时候直接拿出来,后续会不断添加新的工具。 想看怎么使用c#写visionPro自定义…...
ARM/FPGA/DSP板卡选型大全,总有一款适合您
创龙科技ARM/FPGA/DSP嵌入式板卡选型大全2023.2版本正式发布!接下来,跟着我们一起看看有哪些亮点吧! 6大主流工业处理器原厂 创龙科技现有30多条产品线,覆盖工业自动化、能源电力、仪器仪表、通信、医疗、安防等工业领域,与6大主流工业处理器原厂强强联合,包括德州仪器…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
