目錄
1 序言
1.1 生存壓力帶來的哲思
1.2 買房&房奴
2 爬蟲
2.1 基本概念
2.2 爬蟲的基本流程
3 爬取成都房價并寫入表格
3.1 結果展示
3.2 代碼實作(Python)
1 序言
1.1 生存壓力帶來的哲思
馬爾薩斯最早發現,生物按照幾何級數高度增殖的天賦能力,總是大于他們的實際生存能力或現實生存群量,依次推想,生物的種内競争一定是極端殘酷且無可避免。姑且不論馬爾薩斯是否有必要給人類提出相應的警告,僅是這一現象中隐含的一系列基礎問題,譬如,生物的超量繁殖能力的自然限度何在?種内競争的幸存者依靠什麼優勢來取勝?以及這些所謂的優勢群體如何将自己引向何方?等等,就足以引起任何一位有思想的人不能不怵然(恐懼)深思。
後來,達爾文在他的那部劃時代的《物種起源》一書的緒論中,特意提及馬爾薩斯學說的科學貢獻和啟迪作用,可見要成為那個馬老教士的知音,并不是一般人夠資格的!
1.2 買房&房奴
現在結婚,女方一般要求男方有房有車,其實也不能怪人家女孩子,在社會社會高度發展、動蕩的今天,這個要求确實不高。奈何改革開放以來,階級固化,吾輩難矣!先看看貴陽房價
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SN0EDN0gTYwYWNxYTZ3IWMzYzX5QjN1EDMwEzLclDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
不能被時代淘汰了,不能總唉聲歎氣的,白手起家的的大資本家寥寥無幾,人家劉強東就是一個。偶像歸偶像,回到現實中來吧,農村孩子,可能買了房,就可能是一輩子的房奴,回到農村,表面光鮮亮麗的被别人崇拜着,心裡的苦和委屈隻有自己知道。鑒于此,我個人不想做房奴車奴,快樂是自己的,生活是自己的,活出自己的精彩,不是活給别人看的,我想讓自己命運的旖旎風景絢麗多姿,現階段要做的是提升自己能力,不想做房奴!
心血澎湃,感歎完了,該回到今天的主題。何不把這些資料弄到一個文檔表格裡面分析分析,說幹就幹,就用爬蟲爬取吧,然後寫入文檔。
2 爬蟲
2.1 基本概念
網絡爬蟲(Crawler):又稱網絡蜘蛛,或者網絡機器人(Robots). 它是一種按照一定的規則,自動地抓取網際網路資訊的程式或者腳本。換句話來說,它可以根據網頁的連結位址自動擷取網頁内容。如果把網際網路比做一個大蜘蛛網,它裡面有許許多多的網頁,網絡蜘蛛可以擷取所有網頁的内容。
爬蟲是一個模拟人類請求網站行為, 并批量下載下傳網站資源的一種程式或自動化腳本。
爬蟲:使用任何技術手段,批量擷取網站資訊的一種方式。關鍵在于批量。
反爬蟲:使用任何技術手段,阻止别人批量擷取自己網站資訊的一種方式。關鍵也在于批量。
誤傷:在反爬蟲的過程中,錯誤的将普通使用者識别為爬蟲。誤傷率高的反爬蟲政策,效果再好也不能用。
攔截:成功地阻止爬蟲通路。這裡會有攔截率的概念。通常來說,攔截率越高的反爬蟲政策,誤傷的可能性就越高。是以需要做個權衡。
資源:機器成本與人力成本的總和。
2.2 爬蟲的基本流程
(1)請求網頁:
通過 HTTP 庫向目标站點發起請求,即發送一個 Request,請求可以包含額外的 headers 等
資訊,等待伺服器響應!
(2)獲得相應内容:
如果伺服器能正常響應,會得到一個 Response,Response 的内容便是所要擷取的頁面内容,類型可能有 HTML,Json 字元串,二進制資料(如圖檔視訊)等類型。
(3)解析内容:
得到的内容可能是 HTML,可以用正規表達式、網頁解析庫進行解析。可能是 Json,可以
直接轉為 Json 對象解析,可能是二進制資料,可以做儲存或者進一步的處理。
(4)存儲解析的資料:
儲存形式多樣,可以存為文本,也可以儲存至資料庫,或者儲存特定格式的檔案
測試案例:
代碼 實作: 爬取貴陽房價的頁面資料
#==========導 包=============
import requests
#=====step_1 : 指 定 url=========
url = 'https://gy.fang.lianjia.com/ /'
#=====step_2 : 發 起 請 求 :======
#使 用 get 方 法 發 起 get 請 求 , 該 方 法 會 返 回 一 個 響 應 對 象 。 參 數 url 表 示 請 求 對 應 的 url
response = requests . get ( url = url )
#=====step_3 : 獲 取 響 應 數 據 :===
#通 過 調 用 響 應 對 象 的 text 屬 性 , 返 回 響 應 對 象 中 存 儲 的 字 符 串 形 式 的 響 應 數 據 ( 頁 面 源 碼數 據 )
page_text = response . text
#====step_4 : 持 久 化 存 儲=======
with open ('貴陽房價 . html ','w', encoding ='utf -8') as fp:
fp.write ( page_text )
print (' 爬 取 數 據 完 畢 !!!')
爬 取 數 據 完 畢 !!!
Process finished with exit code 0
3 爬取成都房價并寫入表格
3.1 結果展示
3.2 代碼實作(Python)
#==================導入相關庫==================================
from bs4 import BeautifulSoup
import numpy as np
import requests
from requests.exceptions import RequestException
import pandas as pd
#=============讀取網頁=========================================
def craw(url,page):
try:
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}
html1 = requests.request("GET", url, headers=headers,timeout=10)
html1.encoding ='utf-8' # 加編碼,重要!轉換為字元串編碼,read()得到的是byte格式的
html=html1.text
return html
except RequestException:#其他問題
print('第{0}讀取網頁失敗'.format(page))
return None
#==========解析網頁并儲存資料到表格======================
def pase_page(url,page):
html=craw(url,page)
html = str(html)
if html is not None:
soup = BeautifulSoup(html, 'lxml')
"--先确定房子資訊,即li标簽清單--"
houses=soup.select('.resblock-list-wrapper li')#房子清單
"--再确定每個房子的資訊--"
for j in range(len(houses)):#周遊每一個房子
house=houses[j]
"名字"
recommend_project=house.select('.resblock-name a.name')
recommend_project=[i.get_text()for i in recommend_project]#名字 英華天元,斌鑫江南禦府...
recommend_project=' '.join(recommend_project)
#print(recommend_project)
"類型"
house_type=house.select('.resblock-name span.resblock-type')
house_type=[i.get_text()for i in house_type]#寫字樓,底商...
house_type=' '.join(house_type)
#print(house_type)
"銷售狀态"
sale_status = house.select('.resblock-name span.sale-status')
sale_status=[i.get_text()for i in sale_status]#在售,在售,售罄,在售...
sale_status=' '.join(sale_status)
#print(sale_status)
"大位址"
big_address=house.select('.resblock-location span')
big_address=[i.get_text()for i in big_address]#
big_address=''.join(big_address)
#print(big_address)
"具體位址"
small_address=house.select('.resblock-location a')
small_address=[i.get_text()for i in small_address]#
small_address=' '.join(small_address)
#print(small_address)
"優勢。"
advantage=house.select('.resblock-tag span')
advantage=[i.get_text()for i in advantage]#
advantage=' '.join(advantage)
#print(advantage)
"均價:多少1平"
average_price=house.select('.resblock-price .main-price .number')
average_price=[i.get_text()for i in average_price]#16000,25000,價格待定..
average_price=' '.join(average_price)
#print(average_price)
"總價,機關萬"
total_price=house.select('.resblock-price .second')
total_price=[i.get_text()for i in total_price]#總價400萬/套,總價100萬/套'...
total_price=' '.join(total_price)
#print(total_price)
#=====================寫入表格=================================================
information = [recommend_project, house_type, sale_status,big_address,small_address,advantage,average_price,total_price]
information = np.array(information)
information = information.reshape(-1, 8)
information = pd.DataFrame(information, columns=['名稱', '類型', '銷售狀态','大位址','具體位址','優勢','均價','總價'])
information.to_csv('成都房價.csv', mode='a+', index=False, header=False) # mode='a+'追加寫入
print('第{0}頁存儲資料成功'.format(page))
else:
print('解析失敗')
#==================雙線程=====================================
import threading
for i in range(1,100,2):#周遊網頁1-101
url1="https://cd.fang.lianjia.com/loupan/pg"+str(i)+"/"
url2 = "https://cd.fang.lianjia.com/loupan/pg" + str(i+1) + "/"
t1 = threading.Thread(target=pase_page, args=(url1,i))#線程1
t2 = threading.Thread(target=pase_page, args=(url2,i+1))#線程2
t1.start()
t2.start()