貴陽(yáng)市網(wǎng)站建設(shè)引流獲客app下載
前言
在日常生活中,我們看到可愛(ài)的貓咪表情包,總是會(huì)忍不住收藏
認(rèn)識(shí)的一些朋友也養(yǎng)了貓,比如橘貓、英短、加菲貓之類的
看他們發(fā)朋友圈擼貓,老羨慕了,貓咪真的太可愛(ài)啦。
你是不是也動(dòng)過(guò)養(yǎng)貓貓的小心思呢~反正我是動(dòng)過(guò)了
于是,網(wǎng)上閑逛的時(shí)候發(fā)現(xiàn)一個(gè)專門交易貓貓的網(wǎng)站—貓貓交易網(wǎng)
這不得采集20W+ 條貓貓數(shù)據(jù),以此來(lái)了解一下可愛(ài)的貓咪。
python源碼、教程、資料、解答: 點(diǎn)擊此處跳轉(zhuǎn)文末名片獲取
數(shù)據(jù)獲取
打開(kāi)貓貓交易網(wǎng),先采集貓咪品種數(shù)據(jù),首頁(yè)點(diǎn)擊貓咪品種
這里打開(kāi)頁(yè)面可以看到貓貓品種列表:
但只顯示了每種貓貓的品種名,參考價(jià)格,我們點(diǎn)進(jìn)詳情頁(yè),可以看到更加詳細(xì)的數(shù)據(jù):
品種名、參考價(jià)格、中文學(xué)名、基本信息、性格特點(diǎn)、生活習(xí)性、優(yōu)缺點(diǎn)、喂養(yǎng)方法等。
檢查網(wǎng)頁(yè),可以發(fā)現(xiàn)網(wǎng)頁(yè)結(jié)構(gòu)簡(jiǎn)單,容易解析和提取數(shù)據(jù)。
代碼如下:
import requests
import re
import csv
from lxml import etree
from tqdm import tqdm
from fake_useragent import UserAgent
隨機(jī)產(chǎn)生請(qǐng)求頭
ua = UserAgent(verify_ssl=False, path='fake_useragent.json')def random_ua(): # 用于隨機(jī)切換請(qǐng)求頭headers = {"Accept-Encoding": "gzip","Accept-Language": "zh-CN","Connection": "keep-alive","Host": "www.maomijiaoyi.com","User-Agent": ua.random}return headers
創(chuàng)建保存數(shù)據(jù)的csv
def create_csv(): with open('./data/cat_kind.csv', 'w', newline='', encoding='utf-8') as f:wr = csv.writer(f)wr.writerow(['品種', '參考價(jià)格', '中文學(xué)名', '別名', '祖先', '分布區(qū)域','原產(chǎn)地', '體型', '原始用途', '今日用途', '分組', '身高','體重', '壽命', '整體', '毛發(fā)', '顏色', '頭部', '眼睛','耳朵', '鼻子', '尾巴', '胸部', '頸部', '前驅(qū)', '后驅(qū)','基本信息', 'FCI標(biāo)準(zhǔn)', '性格特點(diǎn)', '生活習(xí)性', '優(yōu)點(diǎn)/缺點(diǎn)','喂養(yǎng)方法', '鑒別挑選'])
獲取HTML網(wǎng)頁(yè)源代碼 返回文本
def scrape_page(url1): response = requests.get(url1, headers=random_ua())# print(response.status_code)response.encoding = 'utf-8'return response.text
獲取每個(gè)品種貓咪詳情頁(yè)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
采集每個(gè)品種貓咪詳情頁(yè)里的有關(guān)信息
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','')# 參考價(jià)格price = re.findall('<div>參考價(jià)格:</div>.*?<div>(.*?)</div>', html2, re.S)[0]price = price.replace('\r', '').replace('\n', '').replace('\t', '')# 中文學(xué)名chinese_name = re.findall('<div>中文學(xué)名:</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', '')# 分布區(qū)域area = re.findall('<div>分布區(qū)域:</div>.*?<div>(.*?)</div>', html2, re.S)[0]area = area.replace('\r', '').replace('\n', '').replace('\t', '')# 原產(chǎn)地source_area = re.findall('<div>原產(chǎn)地:</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>.*?<!-- 頁(yè)面小折角 -->.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]entirety = entirety.replace('\r', '').replace('\n', '').replace('\t', '').strip()# 毛發(fā)hair = re.findall('<div>毛發(fā)</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()# 前驅(qū)font_foot = re.findall('<div>前驅(qū)</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]font_foot = font_foot.replace('\r', '').replace('\n', '').replace('\t', '').strip()# 后驅(qū)rear_foot = re.findall('<div>前驅(qū)</div>.*?<div></div>.*?<div>(.*?)</div>', html2, re.S)[0]rear_foot = rear_foot.replace('\r', '').replace('\n', '').replace('\t', '').strip()
保存前面貓貓的各種有關(guān)信息
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]
提取標(biāo)簽欄信息(基本信息-FCI標(biāo)準(zhǔn)-性格特點(diǎn)-生活習(xí)性-優(yōu)缺點(diǎn)-喂養(yǎng)方法-鑒別挑選)
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
保存數(shù)據(jù) 追加寫入
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)
創(chuàng)建保存數(shù)據(jù)的csv
if __name__ == '__main__':create_csv()# 貓咪品種頁(yè)面urlbase_url = 'http://*****/index.php?/pinzhongdaquan_5.html'# 獲取品種頁(yè)面中的所有urlhtml = scrape_page(base_url)urls = get_cat_urls(html)# 進(jìn)度條可視化運(yùn)行情況 就不打印東西來(lái)看了pbar = tqdm(urls)
開(kāi)始采集
for url in pbar:text = scrape_page(url)info = get_info(text)write_to_csv(info)
成功采集了貓咪品種數(shù)據(jù)保存到csv,接下來(lái)采集貓貓交易數(shù)據(jù)
進(jìn)入到買貓賣貓頁(yè)面:
爬取更詳細(xì)的數(shù)據(jù)需要進(jìn)入詳情頁(yè),包含商家信息、貓咪品種、貓齡、價(jià)格、標(biāo)題、在售只數(shù)、預(yù)防等信息。
由于數(shù)據(jù)量較大,可以分開(kāi)爬取,先獲取到每一頁(yè)中的所有貓貓?jiān)斍榻灰祖溄拥?url 保存到csv,再
讀取 csv 中的 url 來(lái)請(qǐng)求,爬取每條交易數(shù)據(jù),爬蟲思路跟前面類似,為了加快爬取效率,可以使用多線程或者異步爬蟲。
最終獲取了 20W+ 條數(shù)據(jù)。
尾語(yǔ) 💝
要成功,先發(fā)瘋,下定決心往前沖!
學(xué)習(xí)是需要長(zhǎng)期堅(jiān)持的,一步一個(gè)腳印地走向未來(lái)!
未來(lái)的你一定會(huì)感謝今天學(xué)習(xí)的你。
—— 心靈雞湯
本文章到這里就結(jié)束啦~感興趣的小伙伴可以復(fù)制代碼去試試哦 😝