第一部分:數據的獲取—爬蟲
1.爬取目標:北京地區二手房房價:https://bj.5i5j.com/ershoufang/;
2.需要用到的模塊:requests,re,random,time,csv,pandas.
3.開發環境vs2017,使用語言python,版本3.6.
4.開發流程
1) 對目標網站的反扒進行試探,識別其反扒機制。(爬取網站是要看一下網站的robots協議,不要爬取網站禁止爬取的內容,否則會面臨被起訴的危險)
1.首先在瀏覽器內啟動web開發者查看器。進入網絡欄,點擊XHR,刷新頁面,查看是否有ajax請求。如圖所示並未出現ajax請求:
2.進入交互式環境,查看爬取網站是否存在需要模擬瀏覽器,或者模擬登錄的情況。
如圖所示此網站反扒機制較為容易:
2).設計爬蟲大體的功能實現:
get_text()函數獲取爬取網站的html源代碼,這裡應該考慮使用requests獲取響應出現異常的情況。在後續的爬取過程中出現了ip禁封的情況,在這裡,有兩種方法可以解決,1:運用ip代理池(但由於對免費的ip代理網站爬取後試驗時,發現大都不能使用,所以放棄了這一條路線)2:利用隨機數使爬蟲爬取網頁的時候,進行不定時的sleep,來防止ip被封。3:後來看了一些博客,有前輩說,可以建一個headers列表,來隨機使用,從而防止ip被封的情況。(有待嘗試)
2.get_useful函數利用正則表達式,獲取html中的有效數據。
3.get_next():由於爬取網站需要不同的url,所以應該觀察url的變化,利用函數構造下一個將要爬取的網頁url.
4.數據的存儲,由於要進行可視化處理,所以要對存儲的數據類型做好處理,便於可視化時的文本調用,這裡運用csv模塊,將數據存儲為csv文件。
3)源碼展示
#coding:utf-8
import re
import requests
import random
import time
import sys
import csv
import pandas
def get_text(url):
try:
n = random.uniform(1,2)
time.sleep(n)
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3381.1 Safari/537.36"}
res = requests.get(url,headers = headers,timeout = 3)
res.raise_for_status()
res.encoding = res.apparent_encoding
return res.text
except:
print("出現異常")
return None
def get_useful(text):
pattern = r'
(\d+).*?.*?.*?.*?.*?
單價(.*?)元/m²
.*?.*?
pattern = re.compile(pattern,re.S)
data = re.findall(pattern,text)
return data
def get_next(url):
try:
for i in range(1,101):
url = url + "n" + str(i)
text = get_text(url)
pre_data = get_useful(text)
data = []
for num in pre_data:
num = list(num)
data.append(num)
name = url.split('/')[-2]
filename = r"F:/" +name+ ".csv"
file = open(filename,"a",newline = '')
writer = csv.writer(file,dialect='excel')
writer.writerows(data)
file.close()
data =[]
print("第%d頁已爬取成功"%i)
except:
print("出現異常")
return None
def main():
area = ["tongzhouqu/","changpingqu/","daxingqu/","shunyiqu/","fangshanqu/","beijingzhoubian/"]
for i in area:
url = "https://bj.5i5j.com/ershoufang/"
url = url+str(i)
print("爬取網址:%s"%url)
get_next(url)
if __name__=="__main__":
main()
第二部分:數據可視化—pandas和pygal的使用
可視化之前比較了一下, matplotlib和pygal(雖然pygal也是基於matplotlib的),感覺pygal更加便於使用,而且直接保存為svg的格式,這樣可以讓用flask時導入圖片更加方便,減少了我自己寫html的工作量。
可視化較為簡單,所以這裡就不詳細介紹了。貼一段代碼;
import pygal
import pandas as pd
#設置全北京的數據列表
all_zj = []
all_dj = []
#朝陽區
file = open(r"F:/chaoyangqu.csv",'r')#打開文件
data = pd.read_csv(file)#讀入csv文件
pre_zj = data.iloc[:,0]#將每棟房子的總價提取
zj = []
for i in pre_zj:
zj.append(i)
all_zj+=zj#存入彙總的列表,用於全北京的可視化處理,下同
pre_dj = data.iloc[:,1]#將每棟房子的每平米單價提取
dj =[]
for i in pre_dj:
dj.append(i)
all_dj+=dj
#總價分析
y_list = [0,0,0,0,0,0,0,0,0,0]
for i in zj:
if i <= 300:
y_list[0]+=1
if i <=400:
y_list[1]+=1
if i <=500:
y_list[2]+=1
if i <=600:
y_list[3]+=1
if i <=700:
y_list[4]+=1
if i <=800:
y_list[5]+=1
if i <=900:
y_list[6]+=1
if i <=1000:
y_list[7]+=1
if i <=1100:
y_list[8]+=1
if i <=1200:
y_list[9]+=1
cyq = pygal.Bar()
cyq.title = "朝陽區二手房數據統計"
cyq.x_labels = [250,350,450,550,650,750,850,950,1050,1150] #X軸數據
cyq.x_title = "房屋總價"
cyq.y_title = "房屋數量"
cyq.add('朝陽區',y_list)
cyq.render_to_file("F:/cyqzj.svg")
#單價分析
dj_max = max(dj)
dj_min = min(dj)
fg = (dj_max-dj_min)/10
x_list = [0,0,0,0,0,0,0,0,0,0]
for i in range(0,10):
x_list[i] += dj_min+fg*i
y_list = [0,0,0,0,0,0,0,0,0,0]
for i in dj:
if i
<= x_list[0]:y_list[0]+=1
if i <= x_list[1]:
y_list[1]+=1
if i <= x_list[2]:
y_list[2]+=1
if i <= x_list[3]:
y_list[3]+=1
if i <= x_list[4]:
y_list[4]+=1
if i <= x_list[5]:
y_list[5]+=1
if i <= x_list[6]:
y_list[6]+=1
if i <= x_list[7]:
y_list[7]+=1
if i <= x_list[8]:
y_list[8]+=1
if i <= dj_max:
y_list[9]+=1
cyq = pygal.Bar()
cyq.title = "朝陽區二手房每平米單價數據統計"
cyq.x_labels = x_list#X軸數據
cyq.x_title = "房屋每平米單價"
cyq.y_title = "數量"
cyq.add('朝陽區',y_list)
cyq.render_to_file("F:/cyqdj.svg")#存儲為svg文件
第三部分:flask框架的使用
1.由於前兩部分皆在windows環境下開發,但我在烏班圖環境下使用flask框架,需要一個方式,將我做完的svg圖片傳入烏班圖,可以在虛擬機可主機之間創建一個共享文件夾,以便文件的傳輸。
具體方法:
下載Vmware Tool文件,在根目錄創建文件夾VmwareTool,將其解壓在此目錄下,然後關機,在虛擬機設置裡找到共享文件夾,進行設置即可。
2.Falsk框架目錄結構:
1.falsk框架的大體結構
1) 主文件
這裡利用route()裝飾器來設置路由,其中第一個返回可以個html文檔,第二個返回了一個svg圖像。
2)
由於使用的是虛擬機,所以寫完的flask框架只能夠本地訪問,但可以改變虛擬機的網絡聯接方式(將net連接改為自定義橋接),從而實現校園網內可以自由訪問,並且需要設置靜態ip,使程序不用連一次網,就要改一次host.
3.)templates目錄下存放著使用jinjia2模版引擎寫的html文件,在主文件中可以使用render_template()進行調用。
4)static目錄下存放了css文件和網頁背景等一些靜態文件。
5)效果圖: