这期内容当中小编将会给大家带来有关Python如何爬取猫咪网站交易数据,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
看到可爱的猫咪表情包,总是会忍不住收藏,晒部分图如下:
从这个网站里爬取了猫猫品种介绍的数据,以及 20W+ 条猫猫交易数据,以此来了解一下可爱的猫咪。
打开猫猫交易网,先爬取猫咪品种数据,打开页面可以看到猫猫品种列表:
检查网页,可以发现网页结构简单,容易解析和提取数据。爬虫代码如下:
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 def create_csv(): # 创建保存数据的csv with open('./data/cat_kind.csv', 'w', newline='', encoding='utf-8') as f: wr = csv.writer(f) wr.writerow(['品种', '参考价格', '中文学名', '别名', '祖先', '分布区域', '原产地', '体型', '原始用途', '今日用途', '分组', '身高', '体重', '寿命', '整体', '毛发', '颜色', '头部', '眼睛', '耳朵', '鼻子', '尾巴', '胸部', '颈部', '前驱', '后驱', '基本信息', 'FCI标准', '性格特点', '生活习性', '优点/缺点', '喂养方法', '鉴别挑选']) def scrape_page(url1): # 获取HTML网页源代码 返回文本 response = requests.get(url1, headers=random_ua()) # print(response.status_code) response.encoding = 'utf-8' return response.text def get_cat_urls(html1): # 获取每个品种猫咪详情页url 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://www.maomijiaoyi.com' + cat_url cat_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) if __name__ == '__main__': # 创建保存数据的csv create_csv() # 猫咪品种页面url base_url = 'http://www.maomijiaoyi.com/index.php?/pinzhongdaquan_5.html' # 获取品种页面中的所有url html = 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)
运行效果如下:
爬取更详细的数据需要进入详情页,包含商家信息、猫咪品种、猫龄、价格、标题、在售只数、预防等信息。
看各种猫咪的体型分布
橘猫是世界各地都有的,不愧是我大橘猫。俗话说 "十个橘猫九个胖还有一个压塌炕"。橘猫比起其他花色的猫咪更喜欢吃东西,它们的食欲很好,能更好地生存,可能这也是橘猫在世界范围都有的原因吧。可它却是小型猫,橘猫小时候颜值一般挺高,看起来小小的一只,又嫩又可爱的,但等橘猫长大以后,才真正地意识到什么是 "橘足轻重"。
橘猫的交易数量最多呀,之前也提到橘猫世界各地都有,从这里也可以看到橘猫数量最多。其次是咖啡猫,布偶猫,英短蓝白猫等。
售卖的猫咪猫龄主要在1-6个月,都是刚出生还未满半岁的小猫咪呀。这时候的小猫咪应该很可爱吧,等待有缘的主人把它带回家。
最后来看一下网站里价格最贵的猫咪和浏览次数最多的猫咪
import pandas as pd df = pd.read_excel('处理后数据.xlsx') print(df.info()) df1 = df.sort_values(by='浏览次数', ascending=False) print(df1.iloc[:3, ::].values) print('----------------------------------------------------------') df2 = df.sort_values(by='价格', ascending=False) print(df2.iloc[:3, ::].values)
# 浏览次数最多的 http://www.maomijiaoyi.com/index.php?/chanpinxiangqing_441879.html http://www.maomijiaoyi.com/index.php?/chanpinxiangqing_462431.html http://www.maomijiaoyi.com/index.php?/chanpinxiangqing_455366.html
反观浏览次数排第二、第三的,价格便宜不少,预防都打了3针疫苗,在售只数还比较充裕,还比第一可爱好多(个人感觉)。
# 价格最贵的如下 http://www.maomijiaoyi.com/index.php?/chanpinxiangqing_265770.html http://www.maomijiaoyi.com/index.php?/chanpinxiangqing_281910.html http://www.maomijiaoyi.com/index.php?/chanpinxiangqing_230417.html
价格最贵的发现均为 3000 元的布偶猫。查阅资料发现,布偶猫,大型猫咪,不仅购买的时候价格高昂,饲养成本也比较高,因为食量和运动量都比较大,而且美容等相关费用也会高一些。
上述就是小编为大家分享的Python如何爬取猫咪网站交易数据了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。