您好,登錄后才能下訂單哦!
這篇文章主要講解了“如何通過python抓取二手房價數據”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何通過python抓取二手房價數據”吧!
模塊安裝
同上次新房一樣,這里需要安裝以下模塊(當然如果已安裝就不用再裝了):
# 安裝引用模塊 pip3 install bs4 pip3 install requests pip3 install lxml pip3 install numpy pip3 install pandas
好了,安裝完成后,就可以開始寫代碼了。至于配置請求頭和代理IP地址的代碼,上次介紹新房已經說過了,這里不再贅述,下面直接上抓取代碼。
二手房價數據對象
在這里我們將二手房的房價信息,創建成一個對象,后續我們只要將獲取到的數據保存成對象,再處理就會方便很多。SecHouse 對象代碼如下所示:
# 二手房信息對象 class SecHouse(object): def __init__(self, district, area, name, price, desc, pic): self.district = district self.area = area self.price = price self.name = name self.desc = desc self.pic = pic def text(self): return self.district + "," + \ self.area + "," + \ self.name + "," + \ self.price + "," + \ self.desc + "," + \ self.pic
獲取二手房價信息并保存
準備好了,下面我們依然以貝殼為例,批量爬取其北京地區二手房數據,并保存到本地。這里我主要想說的是如何抓取數據過程,所以這里依然就保存成最簡單的 txt 文本格式。如果想保存到數據庫,可以自行修改代碼進行保存數據庫處理。
獲取區縣信息
我們在抓取二手房信息時,肯定想知道這個房源所在地區,所以這里我寫了個方法把北京市所有區縣信息抓取下來,并臨時保存至列表變量里,以備后續程序中使用,代碼如下:
# 獲取區縣信息 def get_districts(): # 請求 URL url = 'https://bj.ke.com/xiaoqu/' headers = create_headers() # 請求獲取數據 response = requests.get(url, timeout=10, headers=headers) html = response.content root = etree.HTML(html) # 處理數據 elements = root.xpath('///div[3]/div[1]/dl[2]/dd/div/div/a') en_names = list() ch_names = list() # 循環處理對象 for element in elements: link = element.attrib['href'] en_names.append(link.split('/')[-2]) ch_names.append(element.text) # 打印區縣英文和中文名列表 for index, name in enumerate(en_names): chinese_city_district_dict[name] = ch_names[index] return en_names
獲取地區板塊
除了上面要獲取區縣信息,我們還應該獲取比區縣更小的板塊區域信息,同樣的區縣內,不同板塊地區二手房的價格等信息肯定不一樣,所以板塊對于我們來說也很重要,具有一次參考價值。獲取板塊信息代碼如下:
# 獲取某個區縣下所有板塊信息 def get_areas(district): # 請求的 URL page = "http://bj.ke.com/xiaoqu/{0}".format(district) # 板塊列表定義 areas = list() try: headers = create_headers() response = requests.get(page, timeout=10, headers=headers) html = response.content root = etree.HTML(html) # 獲取標簽信息 links = root.xpath('//div[3]/div[1]/dl[2]/dd/div/div[2]/a') # 針對list進行處理 for link in links: relative_link = link.attrib['href'] # 最后"/"去掉 relative_link = relative_link[:-1] # 獲取最后一節信息 area = relative_link.split("/")[-1] # 去掉區縣名稱,以防止重復 if area != district: chinese_area = link.text chinese_area_dict[area] = chinese_area # 加入板塊信息列表 areas.append(area) return areas except Exception as e: print(e)
獲取二手房信息并保存
# 創建文件準備寫入 with open("sechouse.txt", "w", encoding='utf-8') as f: # 定義變量 total_page = 1 # 初始化 list sec_house_list = list() # 獲取所有區縣信息 districts = get_districts() # 循環處理區縣 for district in districts: # 獲取某一區縣下所有板塊信息 arealist = get_areas(district) # 循環遍歷所有板塊下的小區二手房信息 for area in arealist: # 中文區縣 chinese_district = chinese_city_district_dict.get(district, "") # 中文版塊 chinese_area = chinese_area_dict.get(area, "") # 請求地址 page = 'http://bj.ke.com/ershoufang/{0}/'.format(area) headers = create_headers() response = requests.get(page, timeout=10, headers=headers) html = response.content # 解析 HTML soup = BeautifulSoup(html, "lxml") # 獲取總頁數 try: page_box = soup.find_all('div', class_='page-box')[0] matches = re.search('.*data-total-count="(\d+)".*', str(page_box)) # 獲取總頁數 total_page = int(math.ceil(int(matches.group(1)) / 10)) except Exception as e: print(e) print(total_page) # 設置請求頭 headers = create_headers() # 從第一頁開始,遍歷到最后一頁 for i in range(1, total_page + 1): # 請求地址 page = 'http://bj.ke.com/ershoufang/{0}/pg{1}'.format(area,i) print(page) # 獲取返回內容 response = requests.get(page, timeout=10, headers=headers) html = response.content soup = BeautifulSoup(html, "lxml") # 獲得二手房查詢列表 house_elements = soup.find_all('li', class_="clear") # 遍歷每條信息 for house_elem in house_elements: # 價格 price = house_elem.find('div', class_="totalPrice") # 標題 name = house_elem.find('div', class_='title') # 描述 desc = house_elem.find('div', class_="houseInfo") # 圖片地址 pic = house_elem.find('a', class_="img").find('img', class_="lj-lazy") # 清洗數據 price = price.text.strip() name = name.text.replace("\n", "") desc = desc.text.replace("\n", "").strip() pic = pic.get('data-original').strip() # 保存二手房對象 sec_house = SecHouse(chinese_district, chinese_area, name, price, desc, pic) print(sec_house.text()) sec_house_list.append(sec_house) # 循環遍歷將信息寫入 txt for sec_house in sec_house_list: f.write(sec_house.text() + "\n")
到這里代碼就寫好了,現在我們就可以通過命令 python sechouse.py 運行代碼進行數據抓取了。抓取的結果我們可以打開當前目錄下 sechouse.txt 文件查看,結果如下圖所示:
感謝各位的閱讀,以上就是“如何通過python抓取二手房價數據”的內容了,經過本文的學習后,相信大家對如何通過python抓取二手房價數據這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。