什么猫猫最受欢迎?Python采集猫咪交易数据

news/2024/12/2 6:57:12/

前言

在日常生活中,我们看到可爱的猫咪表情包,总是会忍不住收藏

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

在这里插入图片描述

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

你是不是也动过养猫猫的小心思呢~反正我是动过了

于是,网上闲逛的时候发现一个专门交易猫猫的网站—猫猫交易网

这不得采集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+ 条数据。

尾语 💝

要成功,先发疯,下定决心往前冲!

学习是需要长期坚持的,一步一个脚印地走向未来!

未来的你一定会感谢今天学习的你。

—— 心灵鸡汤

本文章到这里就结束啦~感兴趣的小伙伴可以复制代码去试试哦 😝

👇问题解答 · 源码获取 · 技术交流 · 抱团学习请联系👇


http://www.ppmy.cn/news/471395.html

相关文章

猫狗分类,猫狗大战

项目全部代码在文章末尾 1、任务描述 Cats vs. Dogs&#xff08;猫狗大战&#xff09;数据集下载地址为https://www.kaggle.com/c/dogs-vs-cats/data。这个数据集是Kaggle大数据竞赛某一年的一道赛题&#xff0c;利用给定的数据集&#xff0c;用算法实现猫和狗的识别。 其中包…

猫的平均寿命约为15年,全球最长寿的猫在英国,活了38年

猫是家庭宠物中最受欢迎的动物之一&#xff0c;它们不仅可爱、温顺&#xff0c;还拥有多种优秀的特征和能力。以下是一些有趣的猫的数据&#xff0c;咱通过数据图表一一分享&#xff1a; 全球猫的数量&#xff1a; 全球有超过5亿只宠物猫&#xff0c;它是很受人们欢迎的动物。…

东北猫咪带我躺平末世

丧尸来袭时,我趴在床上,啃着鸭脖哈着啤酒,看着我那黑心妹妹和渣男前男友为了一个长毛的面包互殴。 没办法,谁让末日之前我捡了一只有钱、会说话还是重生而来的大白猫呢。 看着别人从丧尸底下虎口夺食,而我躺在五百平的大房子里混吃等死,我忍不住捏了捏猫毛乎乎的小耳朵…

Maven的简单介绍

一、Maven的简介 1.Maven是什么 ①Maven的本质是一个项目管理工具&#xff0c;将项目开发和管理过程抽象成一个项目对象模型(POM) ②POM(Project Object Model):项目对象模型 2.Maven的作用 ①项目构建&#xff1a;提供标准的、跨平台的自动化项目构建方式 ②依赖管理&…

消息队列及常见消息队列介绍

一、消息队列(MQ)概述 消息队列&#xff08;Message Queue&#xff09;&#xff0c;是分布式系统中重要的组件&#xff0c;其通用的使用场景可以简单地描述为&#xff1a; 当不需要立即获得结果&#xff0c;但是并发量又需要进行控制的时候&#xff0c;差不多就是需要使用消息队…

【月薪一万五的程序员与月薪五千的公务员,如何做出选择?】

简介&#xff1a;在职业选择方面&#xff0c;月薪是一个重要的考量因素。对于许多人来说&#xff0c;选择月薪较高的职业可以获得更好的生活质量和经济状况。在这篇文章中&#xff0c;我们将探讨月薪一万五的程序员和月薪五千的公务员两个不同的职业&#xff0c;考虑它们的优势…

GEE:绘制一个点的Landsat1985-2020年逐日NDVI时间序列折线图

作者:CSDN @ _养乐多_ 本文记录了在GoogleEarthEngine(GEE)平台上选择一个点,根据该点在时间段内所有有效像素值绘制折线图的代码。 结果如下图所示, 文章目录 一、代码二、代码链接一、代码 var roi = geometry Map.addLayer(roi, {color

malloc 背后的虚拟内存 和 malloc实现原理

面试的时候经常会被问到 malloc 的实现。从操作系统层面来说&#xff0c;malloc 确实是考察面试者对操作系统底层的存储管理理解的一个很好的方式&#xff0c;涉及到虚拟内存、分页/分段等。下面逐个细说。 1. 虚拟内存 首先需要知道的是程序运行起来的话需要被加载的物理内存…