Python爬蟲(chóng)之爬取二手房信息
前言
說(shuō)到二手房信息,不知道你們心里最先跳出來(lái)的公司(網(wǎng)站)是什么,反正我心里第一個(gè)跳出來(lái)的是網(wǎng)站是 58 同城。哎呦,我這暴脾氣,想到就趕緊去干。
但很顯然,我失敗了。說(shuō)顯然,而不是不幸,這是因?yàn)?58 同城是大公司,我這點(diǎn)本事爬不了數(shù)據(jù)是再正常不過(guò)的了。下面來(lái)看看 58 同城的反爬手段了。這是我爬取下來(lái)的網(wǎng)頁(yè)源碼。
我們看到爬取下來(lái)的源碼有很多英文大寫(xiě)字母和數(shù)字是網(wǎng)頁(yè)源碼中沒(méi)有的,后來(lái)我了解到 58 同城對(duì)自己的網(wǎng)站的源碼進(jìn)行了文本加密,所以就出現(xiàn)了我爬取到的情況。
爬取二手房信息
我打開(kāi) 58 同城的 robots 協(xié)議。
好家伙,不愧是大公司,所有的動(dòng)態(tài)網(wǎng)址都不讓爬取,打擾了。我只好轉(zhuǎn)頭離開(kāi),去尋找可以讓我這種小白爬取的二手房網(wǎng)站。于是我找到了c21網(wǎng)站,不知道是我的原因,還是別的原因,反正我是沒(méi)有找到這個(gè)網(wǎng)站的 robots 協(xié)議。不管了,既然沒(méi)找到,就默認(rèn)沒(méi)有吧,直接開(kāi)始爬取。
我本來(lái)打算通過(guò)二手房的目錄跳到一個(gè)具體信息,然后爬取二手房的一些基本信息和屬性。
像我紅筆圈起來(lái)的部分。但很可惜我失敗了,后來(lái)我看了看紅筆圈起來(lái)的部分的爬取到的源碼。
好家伙,還可以這樣。不過(guò)這怎么可以難倒機(jī)智的我?(其實(shí)我真不知道怎么解決它)。沒(méi)關(guān)系,之前的源碼里不是有類(lèi)似的信息嗎?我只好將就一下了。
然后是翻頁(yè)。翻頁(yè)問(wèn)題很好解決,我們很快就發(fā)現(xiàn)網(wǎng)頁(yè)都是 https://bj.c21.com.cn/ershoufang/pg2/。其中的頁(yè)數(shù)和 pg 后面的數(shù)字有關(guān)。
然后就是分析這些數(shù)據(jù)源碼的位置了。
首先,我們發(fā)現(xiàn)我們要爬取的數(shù)據(jù)全在 li 標(biāo)簽里,所以我們可以先獲得 li 標(biāo)簽的列表。偽代碼就像這樣。
form lxml import etree …… …… tree = etree.HTML(源碼) li_list = tree.xpath( li 標(biāo)簽的路徑)
這時(shí)候我們獲得的就是 li 標(biāo)簽的 etree 的類(lèi),可以繼續(xù)使用 etree 類(lèi)里的函數(shù)。然后我們就可以利用 for 循環(huán)提出不同房源的 li 標(biāo)簽,根據(jù)自己的需要獲取文本信息。
歐克,了解了這些(感覺(jué)源碼前前后后就是四個(gè)字 ”我是菜雞“ )我們就可以開(kāi)始寫(xiě)代碼了。
import requests from lxml import etree import re if __name__ == "__main__": # UA偽裝 header = { "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36" } for pg in range(1, 3): # 翻兩頁(yè) # 指定 url url = "https://bj.c21.com.cn/ershoufang/pg%s/" % str(pg) # 獲取網(wǎng)頁(yè)源碼 page = requests.get(url = url, headers = header).text # xpath 解析 tree = etree.HTML(page) li_list = tree.xpath('//ul[@id="availability"]/li') for li in li_list: title = li.xpath('div[2]/div/a/text()')[0] # 房子的名稱 # print(title[0]) # 測(cè)試 add = li.xpath('div[2]/div/p//a/text()') # 地址 add = add[-2: ] + add[0:1] # 地址范圍由大到小 # print(add) # 測(cè)試 div_list = li.xpath('div[2]/div[2]/div') # 具體信息 message_list = ["建筑面積", "房屋戶型", "房屋朝向", "所在樓層", "裝修情況", "建成時(shí)間"] for i in range(6): div = div_list[i] message = div.xpath('span/text()')[0] message = re.sub("\s", "", str(message)) # 因?yàn)榘l(fā)現(xiàn)獲取的文本有很多換行符和空格,所以需要去掉 message = re.sub("\\n", "", str(message)) message_list[i] = message_list[i] + ":" + message # print(message_list) # 測(cè)試 # 交通情況 traffic = li.xpath('div[2]/div[4]//text()') # print(traffic) # 測(cè)試 # 價(jià)格情況 price = li.xpath('div[2]/div[3]//text()') price = price[0] + price[1] # print(price) # 測(cè)試 with open("C:\\Users\\ASUS\\Desktop\\CSDN\\數(shù)據(jù)解析\\xpath\\二手房\\" + "二手房.txt", "a", encoding = "utf-8") as fp: fp.write(title + "\n") for message in message_list: fp.write(message + "\n") if traffic == []: fp.write("交通情況:無(wú)介紹" + "\n") else: fp.write("交通情況:" + traffic[0] + "\n") fp.write("價(jià)格:" + price + "\n\n") print(title, "下載完成!??!") print("over!!!")
爬取結(jié)果
最后的運(yùn)行結(jié)果就像這樣
到此這篇關(guān)于Python爬蟲(chóng)之爬取二手房信息的文章就介紹到這了,更多相關(guān)Python爬取二手房信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解sklearn?Preprocessing?數(shù)據(jù)預(yù)處理功能
這篇文章主要介紹了sklearn?Preprocessing?數(shù)據(jù)預(yù)處理功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08PyTorch如何搭建一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)
這篇文章主要介紹了PyTorch如何搭建一個(gè)簡(jiǎn)單的網(wǎng)絡(luò),幫助大家更好的理解和學(xué)習(xí)PyTorch,感興趣的朋友可以了解下2020-08-08python通過(guò)字典dict判斷指定鍵值是否存在的方法
這篇文章主要介紹了python通過(guò)字典dict判斷指定鍵值是否存在的方法,實(shí)例分析了Python中使用has_key及in判斷指定鍵值是否存在的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03python?groupby函數(shù)實(shí)現(xiàn)分組選取最大值與最小值
這篇文章主要介紹了python?groupby函數(shù)實(shí)現(xiàn)分組選取最大值與最小值,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08Python爬蟲(chóng)包BeautifulSoup異常處理(二)
這篇文章主要為大家詳細(xì)介紹了Python爬蟲(chóng)包BeautifulSoup的異常處理,具有一定的參考價(jià)值,感興趣的朋友可以參考一下2018-06-06Python學(xué)習(xí)筆記之集合的概念和簡(jiǎn)單使用示例
這篇文章主要介紹了Python學(xué)習(xí)筆記之集合的概念和簡(jiǎn)單使用,涉及Python集合的定義、查找、添加、刪除等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-08-08Python實(shí)現(xiàn)socket非阻塞通訊功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)socket非阻塞通訊功能,結(jié)合實(shí)例形式分析了Python使用socket模塊進(jìn)行非阻塞通訊的原理、多線程及客戶端、服務(wù)器端相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-11-11Python中獲取網(wǎng)頁(yè)狀態(tài)碼的兩個(gè)方法
這篇文章主要介紹了Python中獲取網(wǎng)頁(yè)狀態(tài)碼的兩個(gè)方法,分別使用urllib模塊和requests模塊實(shí)現(xiàn),需要的朋友可以參考下2014-11-11