前言
嗨嘍巫湘,大家好呀装悲!這里是魔王吶~
環(huán)境使用:
- Python 3.8
- Pycharm
模塊使用:
- requests >>> pip install requests 數(shù)據(jù)請求模塊
- parsel >>> pip install parsel 數(shù)據(jù)解析模塊
- csv 內(nèi)置模塊
如果安裝python第三方模塊:
- win + R 輸入 cmd 點擊確定, 輸入安裝命令 pip install 模塊名 (pip install requests) 回車
- 在pycharm中點擊Terminal(終端) 輸入安裝命令
如何配置pycharm里面的python解釋器?
- 選擇file(文件) >>> setting(設(shè)置) >>> Project(項目) >>> python interpreter(python解釋器)
- 點擊齒輪, 選擇add
- 添加python安裝路徑
pycharm如何安裝插件?
- 選擇file(文件) >>> setting(設(shè)置) >>> Plugins(插件)
- 點擊 Marketplace 輸入想要安裝的插件名字 比如:翻譯插件 輸入 translation / 漢化插件 輸入 Chinese
- 選擇相應(yīng)的插件點擊 install(安裝) 即可
- 安裝成功之后 是會彈出 重啟pycharm的選項 點擊確定, 重啟即可生效
思路分析
這有自己的一套模板 <通用>
一. 數(shù)據(jù)來源分析
- 確定自己采集數(shù)據(jù)是什么, 并且這些數(shù)據(jù)可以從那里獲取到
鏈家網(wǎng)站數(shù)據(jù), 靜態(tài)網(wǎng)頁.... <你所看到的數(shù)據(jù), 都來于網(wǎng)頁源代碼>
二. 代碼實現(xiàn)步驟過程
- 發(fā)送請求, 對于url地址發(fā)送請求 https://cs.lianjia.com/ershoufang/104108672997.html
- 獲取數(shù)據(jù), 獲取網(wǎng)頁源代碼數(shù)據(jù)
- 解析數(shù)據(jù), 提取我們想要的數(shù)據(jù)內(nèi)容
- 保存數(shù)據(jù), 把數(shù)據(jù)保存到表格里面
代碼
一、采集數(shù)據(jù)
1.1 導(dǎo)入模塊
# 導(dǎo)入數(shù)據(jù)請求模塊
import requests
# 導(dǎo)入數(shù)據(jù)解析模塊
import parsel
import re
import csv
f = open('二手房多頁.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
'標題',
'賣點',
'總價',
'單價',
'戶型',
'樓層',
'共有樓層數(shù)',
'裝修',
'朝向',
'建造時間',
'面積',
'小區(qū)',
'區(qū)域',
'所屬區(qū)',
'梯戶比例',
'是否有電梯',
'房屋屬性',
'詳情頁',
])
csv_writer.writeheader()
1.2 發(fā)送請求
- 確定請求網(wǎng)址是什么
- 請求方式
- 偽裝模擬瀏覽器
headers >>> 請求頭加什么數(shù)據(jù), 怎么找呢?
User-Agent: 用戶代理 表示瀏覽器基本身份標識... <相當(dāng)于你進超市, 要看健康碼或者戴口罩>
如果你不加headers對于某些網(wǎng)站, 你可能被識別出來是你爬蟲程序, 被反爬 >>> 得不到數(shù)據(jù)headers 字典數(shù)據(jù)類型
for page in range(1, 11):
url = f'https://cs.lianjia.com/ershoufang/pg{page}/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36'
}
response = requests.get(url=url, headers=headers)
# print(response.text)
selector = parsel.Selector(response.text)
# 真正的掌握css選擇器解析方法 在系統(tǒng)課程都是需要學(xué)習(xí)2.5個小時左右
href = selector.css('.sellListContent li.clear .title a::attr(href)').getall()
for link in href:
# url = 'https://cs.lianjia.com/ershoufang/104108664407.html'
# 發(fā)送請求
response = requests.get(url=link, headers=headers)
# print(response) # <Response [200]> 響應(yīng)對象 200 狀態(tài)碼表示請求成功
# 獲取數(shù)據(jù)
# print(response.text)
1.3 解析數(shù)據(jù)
css選擇器 >>> 根據(jù)標簽屬性內(nèi)容提取數(shù)據(jù)
selector_1 = parsel.Selector(response.text) # 需要把獲取html字符串?dāng)?shù)據(jù)轉(zhuǎn)成selector對象
# print(selector)
# 復(fù)制下來僅僅只是定位到標簽, 我獲取標簽里面title屬性
try:
# body > div.sellDetailHeader > div > div > div.title > h1
title = selector_1.css('.main::text').get() # 標題
selling_point = selector_1.css('.sub::text').get() # 賣點
price = selector_1.css('.price .total::text').get() # 總價
unitPrice = selector_1.css('.unitPrice .unitPriceValue::text').get() # 單價
house_type = selector_1.css('.room .mainInfo::text').get() # 戶型
subInfo = selector_1.css('.room .subInfo::text').get().split('/') # 樓層
floor = subInfo[0] # 樓層
num = re.findall('\d+', subInfo[1])[0] # 共有樓層數(shù)
furnish = selector_1.css('.type .subInfo::text').get().split('/')[-1] # 裝修
face = selector_1.css('.type .mainInfo::text').get() # 朝向
date = re.findall('\d+', selector_1.css('.area .subInfo::text').get()) # 建造時間
if len(date) == 0:
date = '0'
更多源碼尚氛、解答诀诊、教程資料加群:832157862免費領(lǐng)取哦~
else:
date = date[0]
area = selector_1.css('.area .mainInfo::text').get().replace('平米', '') # 面積
community = selector_1.css('.communityName .info::text').get() # 小區(qū)
areaName_info = selector_1.css('.areaName .info a::text').getall() # 區(qū)域
areaName = areaName_info[0] # 所屬區(qū)
region = areaName_info[1] # 區(qū)域
scale = selector_1.css('div.content ul li:nth-child(10)::text').get() # 梯戶比例
elevator = selector_1.css('div.content ul li:nth-child(11)::text').get() # 是否有電梯
houseProperty = selector_1.css('div.content li:nth-child(2) span:nth-child(2)::text').get() # 房屋屬性
dit = {
'標題': title,
'賣點': selling_point,
'總價': price,
'單價': unitPrice,
'戶型': house_type,
'樓層': floor,
'共有樓層數(shù)': num,
'裝修': furnish,
'朝向': face,
'建造時間': date,
'面積': area,
'小區(qū)': community,
'區(qū)域': region,
'所屬區(qū)': areaName,
'梯戶比例': scale,
'是否有電梯': elevator,
'房屋屬性': houseProperty,
'詳情頁': link,
}
csv_writer.writerow(dit)
print(
title, selling_point, price, unitPrice, house_type, subInfo, furnish, face,
date, area, community, region, scale, elevator, houseProperty, link
)
except:
pass
二、可視化代碼
在pycharm里面打開的阅嘶,效果圖大家隨便看看就可以啦啊属瓣,沒有在ipynb里面打開的好看~
2.1 折線圖
# 繪制各區(qū)二手房總價折線圖,是否有電梯作為評定標準
plt.figure(figsize=(12,6))
# Add title
plt.title("各區(qū)二手房總價排名")
sns.lineplot(x="所屬區(qū)", y="總價", data=data,hue=data['是否有電梯'])
# 一般有電梯的房子價格會高于無電梯的房子讯柔,但是下圖中青羊區(qū)抡蛙、金牛區(qū)是例外。
# 此圖也可解釋后面的熱力圖中顯示“共有樓層數(shù)”與“單價”有一定的關(guān)系魂迄,因為有電梯就表示共有樓層數(shù)較高粗截。
2.1.1 效果圖
2.2 各區(qū)的戶型數(shù)量對比
# 各區(qū)的戶型數(shù)量對比
plt.figure(figsize=(16,6))
huxing_num = data.groupby([data['所屬區(qū)'],data['戶型']])['小區(qū)'].count().reset_index().rename(columns={'所屬區(qū)':'所屬區(qū)','戶型':'戶型','小區(qū)':'數(shù)量'})
# print(huxing_num)
sns.barplot(x="戶型", y="數(shù)量", data=huxing_num,order=sort,hue=huxing_num['所屬區(qū)'])
# 下圖中天府新區(qū)和高新區(qū)的“3室2廳”房源數(shù)量明顯多于其他區(qū),可以參考各區(qū)不同房型數(shù)量捣炬,針對性地篩選房源熊昌。
2.2.1 效果圖
2.3 房屋屬性與單價之間的條形圖
# 繪制房屋屬性與單價之間的條形圖
plt.figure(figsize=(12,6))
shuxing = data.groupby(data['房屋屬性'])['單價'].mean().reset_index()
sns.barplot(x='房屋屬性',y='單價',data=shuxing)
2.4 繪制熱力圖
# 繪制熱力圖,觀測其他數(shù)值型變量與單價之間的關(guān)系
import numpy as np
cols = data.corr().nlargest(10,'單價')['單價'].index#局部運行湿酸,一步一步索引
cm = np.corrcoef(data[cols].values.T)
plt.subplots(figsize=(12,6))
sns.heatmap(cm, vmax=0.9,annot=True,square=True,annot_kws={'size':10},xticklabels=cols.values,yticklabels=cols.values)
# 熱力圖展示出單價與總價婿屹、共有樓層數(shù)、建造時間推溃、面積有關(guān)系昂利,在以上的分析中也證實了這些關(guān)系
2.4.1 效果圖
2.5 制作詞云圖
# 繪制“房屋賣點”詞云圖
import jieba
from PIL import Image
import wordcloud
text = ("".join(i for i in data['賣點'])) #將列數(shù)據(jù)組合到一起形成一個字符串
# print(text)
cut = jieba.cut(text)
img = Image.open('1.png') #打開遮罩照片
img_array = np.array(img) #將圖片轉(zhuǎn)換為數(shù)組
#對詞云進行設(shè)置
wc = wordcloud.WordCloud(
background_color = 'white',
height = 800,
width = 400,#設(shè)置不同的像素,詞云圖各詞的位置也在發(fā)生變化
mask = img_array,
font_path = 'msyh.ttc' #字體所在位置:C:\Windows\Fonts
)
wc.generate_from_text(text)
plt.figure(figsize=(20,6)) #參數(shù)的設(shè)置會改變圖片詞語的排列
plt.imshow(wc) #將詞云放在遮罩圖片上
plt.axis('off') #是否顯示坐標軸
plt.show() #顯示生成的詞云圖片
# 詞云圖展示出能吸引購房者的房屋特點包括“戶型方正”美莫、“采光好”页眯、“中間樓層”、“精裝修”厢呵、“視野開闊”等