Python使用爬蟲(chóng)爬取貴陽(yáng)房?jī)r(jià)的方法詳解
1 序言
1.1 生存壓力帶來(lái)的哲思
馬爾薩斯最早發(fā)現(xiàn),生物按照幾何級(jí)數(shù)高度增殖的天賦能力,總是大于他們的實(shí)際生存能力或現(xiàn)實(shí)生存群量,依次推想,生物的種內(nèi)競(jìng)爭(zhēng)一定是極端殘酷且無(wú)可避免。姑且不論馬爾薩斯是否有必要給人類提出相應(yīng)的警告,僅是這一現(xiàn)象中隱含的一系列基礎(chǔ)問(wèn)題,譬如,生物的超量繁殖能力的自然限度何在?種內(nèi)競(jìng)爭(zhēng)的幸存者依靠什么優(yōu)勢(shì)來(lái)取勝?以及這些所謂的優(yōu)勢(shì)群體如何將自己引向何方?等等,就足以引起任何一位有思想的人不能不怵然(恐懼)深思。
后來(lái),達(dá)爾文在他的那部劃時(shí)代的《物種起源》一書(shū)的緒論中,特意提及馬爾薩斯學(xué)說(shuō)的科學(xué)貢獻(xiàn)和啟迪作用,可見(jiàn)要成為那個(gè)馬老教士的知音,并不是一般人夠資格的!
1.2 買(mǎi)房&房奴
現(xiàn)在結(jié)婚,女方一般要求男方有房有車(chē),其實(shí)也不能怪人家女孩子,在社會(huì)社會(huì)高度發(fā)展、動(dòng)蕩的今天,這個(gè)要求確實(shí)不高。奈何改革開(kāi)放以來(lái),階級(jí)固化,吾輩難矣!先看看貴陽(yáng)房?jī)r(jià)(鏈家新房:https://gy.fang.lianjia.com/)
不能被時(shí)代淘汰了,不能總唉聲嘆氣的,白手起家的的大資本家寥寥無(wú)幾,人家劉強(qiáng)東就是一個(gè)。偶像歸偶像,回到現(xiàn)實(shí)中來(lái)吧,農(nóng)村孩子,可能買(mǎi)了房,就可能是一輩子的房奴,回到農(nóng)村,表面光鮮亮麗的被別人崇拜著,心里的苦和委屈只有自己知道。鑒于此,我個(gè)人不想做房奴車(chē)奴,快樂(lè)是自己的,生活是自己的,活出自己的精彩,不是活給別人看的,我想讓自己命運(yùn)的旖旎風(fēng)景絢麗多姿,現(xiàn)階段要做的是提升自己能力,不想做房奴!
心血澎湃,感嘆完了,該回到今天的主題。何不把這些數(shù)據(jù)弄到一個(gè)文檔表格里面分析分析,說(shuō)干就干,就用爬蟲(chóng)爬取吧,然后寫(xiě)入文檔。
2 爬蟲(chóng)
2.1 基本概念
網(wǎng)絡(luò)爬蟲(chóng)(Crawler):又稱網(wǎng)絡(luò)蜘蛛,或者網(wǎng)絡(luò)機(jī)器人(Robots). 它是一種按照一定的規(guī)則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或者腳本。換句話來(lái)說(shuō),它可以根據(jù)網(wǎng)頁(yè)的鏈接地址自動(dòng)獲取網(wǎng)頁(yè)內(nèi)容。如果把互聯(lián)網(wǎng)比做一個(gè)大蜘蛛網(wǎng),它里面有許許多多的網(wǎng)頁(yè),網(wǎng)絡(luò)蜘蛛可以獲取所有網(wǎng)頁(yè)的內(nèi)容。
爬蟲(chóng)是一個(gè)模擬人類請(qǐng)求網(wǎng)站行為, 并批量下載網(wǎng)站資源的一種程序或自動(dòng)化腳本。
- 爬蟲(chóng):使用任何技術(shù)手段,批量獲取網(wǎng)站信息的一種方式。關(guān)鍵在于批量。
- 反爬蟲(chóng):使用任何技術(shù)手段,阻止別人批量獲取自己網(wǎng)站信息的一種方式。關(guān)鍵也在于批量。
- 誤傷:在反爬蟲(chóng)的過(guò)程中,錯(cuò)誤的將普通用戶識(shí)別為爬蟲(chóng)。誤傷率高的反爬蟲(chóng)策略,效果再好也不能用。
- 攔截:成功地阻止爬蟲(chóng)訪問(wèn)。這里會(huì)有攔截率的概念。通常來(lái)說(shuō),攔截率越高的反爬蟲(chóng)策略,誤傷的可能性就越高。因此需要做個(gè)權(quán)衡。
- 資源:機(jī)器成本與人力成本的總和。
2.2 爬蟲(chóng)的基本流程
(1)請(qǐng)求網(wǎng)頁(yè):通過(guò) HTTP 庫(kù)向目標(biāo)站點(diǎn)發(fā)起請(qǐng)求,即發(fā)送一個(gè) Request,請(qǐng)求可以包含額外的 headers 等
信息,等待服務(wù)器響應(yīng)!
(2)獲得相應(yīng)內(nèi)容:如果服務(wù)器能正常響應(yīng),會(huì)得到一個(gè) Response,Response 的內(nèi)容便是所要獲取的頁(yè)面內(nèi)容,類型可能有 HTML,Json 字符串,二進(jìn)制數(shù)據(jù)(如圖片視頻)等類型。
(3)解析內(nèi)容:得到的內(nèi)容可能是 HTML,可以用正則表達(dá)式、網(wǎng)頁(yè)解析庫(kù)進(jìn)行解析??赡苁?Json,可以
直接轉(zhuǎn)為 Json 對(duì)象解析,可能是二進(jìn)制數(shù)據(jù),可以做保存或者進(jìn)一步的處理。
(4)存儲(chǔ)解析的數(shù)據(jù):保存形式多樣,可以存為文本,也可以保存至數(shù)據(jù)庫(kù),或者保存特定格式的文件
測(cè)試案例:代碼 實(shí)現(xiàn): 爬取貴陽(yáng)房?jī)r(jià)的頁(yè)面數(shù)據(jù)
#==========導(dǎo) 包============= import requests #=====step_1 : 指 定 url========= url = 'https://gy.fang.lianjia.com/ /' #=====step_2 : 發(fā) 起 請(qǐng) 求 :====== #使 用 get 方 法 發(fā) 起 get 請(qǐng) 求 , 該 方 法 會(huì) 返 回 一 個(gè) 響 應(yīng) 對(duì) 象 。 參 數(shù) url 表 示 請(qǐng) 求 對(duì) 應(yīng) 的 url response = requests . get ( url = url ) #=====step_3 : 獲 取 響 應(yīng) 數(shù) 據(jù) :=== #通 過(guò) 調(diào) 用 響 應(yīng) 對(duì) 象 的 text 屬 性 , 返 回 響 應(yīng) 對(duì) 象 中 存 儲(chǔ) 的 字 符 串 形 式 的 響 應(yīng) 數(shù) 據(jù) ( 頁(yè) 面 源 碼數(shù) 據(jù) ) page_text = response . text #====step_4 : 持 久 化 存 儲(chǔ)======= with open ('貴陽(yáng)房?jī)r(jià) . html ','w', encoding ='utf -8') as fp: fp.write ( page_text ) print (' 爬 取 數(shù) 據(jù) 完 畢 !!!')
爬 取 數(shù) 據(jù) 完 畢 !!! Process finished with exit code 0
3 爬取貴陽(yáng)房?jī)r(jià)并寫(xiě)入表格
3.1 結(jié)果展示
3.2 代碼實(shí)現(xiàn)(Python)
#==================導(dǎo)入相關(guān)庫(kù)================================== from bs4 import BeautifulSoup import numpy as np import requests from requests.exceptions import RequestException import pandas as pd #=============讀取網(wǎng)頁(yè)========================================= 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' # 加編碼,重要!轉(zhuǎn)換為字符串編碼,read()得到的是byte格式的 html=html1.text return html except RequestException:#其他問(wèn)題 print('第{0}讀取網(wǎng)頁(yè)失敗'.format(page)) return None #==========解析網(wǎng)頁(yè)并保存數(shù)據(jù)到表格====================== def pase_page(url,page): html=craw(url,page) html = str(html) if html is not None: soup = BeautifulSoup(html, 'lxml') "--先確定房子信息,即li標(biāo)簽列表--" houses=soup.select('.resblock-list-wrapper li')#房子列表 "--再確定每個(gè)房子的信息--" for j in range(len(houses)):#遍歷每一個(gè)房子 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]#寫(xiě)字樓,底商... house_type=' '.join(house_type) #print(house_type) "銷售狀態(tài)" 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) "優(yōu)勢(shì)。" advantage=house.select('.resblock-tag span') advantage=[i.get_text()for i in advantage]# advantage=' '.join(advantage) #print(advantage) "均價(jià):多少1平" average_price=house.select('.resblock-price .main-price .number') average_price=[i.get_text()for i in average_price]#16000,25000,價(jià)格待定.. average_price=' '.join(average_price) #print(average_price) "總價(jià),單位萬(wàn)" total_price=house.select('.resblock-price .second') total_price=[i.get_text()for i in total_price]#總價(jià)400萬(wàn)/套,總價(jià)100萬(wàn)/套'... total_price=' '.join(total_price) #print(total_price) #=====================寫(xiě)入表格================================================= 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=['名稱', '類型', '銷售狀態(tài)','大地址','具體地址','優(yōu)勢(shì)','均價(jià)','總價(jià)']) information.to_csv('貴陽(yáng)房?jī)r(jià).csv', mode='a+', index=False, header=False) # mode='a+'追加寫(xiě)入 print('第{0}頁(yè)存儲(chǔ)數(shù)據(jù)成功'.format(page)) else: print('解析失敗') #==================雙線程===================================== import threading for i in range(1,100,2):#遍歷網(wǎng)頁(yè)1-101 url1="https://gy.fang.lianjia.com/loupan/pg"+str(i)+"/" url2 = "https://gy.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()v
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
爬蟲(chóng)使用IP來(lái)隱藏真實(shí)地址的過(guò)程(python示例)
這篇文章主要為大家介紹了爬蟲(chóng)使用IP來(lái)隱藏真實(shí)地址的過(guò)程(python示例)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12Python入門(mén):認(rèn)識(shí)列表和元組
這篇文章主要介紹了簡(jiǎn)單了解python列表和元組的入門(mén),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-10-10python 讀寫(xiě)excel文件操作示例【附源碼下載】
這篇文章主要介紹了python 讀寫(xiě)excel文件操作,結(jié)合實(shí)例形式分析了Python基于xlutils導(dǎo)入xlrd,xlwt庫(kù)操作Excel相關(guān)實(shí)現(xiàn)技巧,并附帶源碼供讀者下載參考,需要的朋友可以參考下2019-06-06pyqt5、qtdesigner安裝和環(huán)境設(shè)置教程
這篇文章主要介紹了pyqt5、qtdesigner安裝和環(huán)境設(shè)置方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09

教你如何使用Python快速爬取需要的數(shù)據(jù)

Python應(yīng)用實(shí)現(xiàn)雙指數(shù)函數(shù)及擬合代碼實(shí)例