看我如何抓取最新房价数据
經過前幾年一輪房價大漲,到現在因為國家大力調控等原因,市場已經褪去熱度,正在慢慢變得穩定,價格也相較最高時下降了些。那現在房價到底怎樣?接下來又會是怎樣的發展的趨勢?這里我們就可以通過 Python 把最近的房價數據抓取下來進行分析。
模塊安裝
這里需要安裝以下模塊,當然如果已安裝就不用再裝了:
# 安裝引用模塊pip3 install bs4pip3 install requestspip3 install lxmlpip3 install numpypip3 install pandas配置請求頭
一般我們在抓取網站時,為了應對網站的反爬機制,我們會把請求的頭信息進行封裝處理,以下是最簡單的處理,就是將請求客戶端信息進行隨機選擇并使用,代碼如下:
# 代理客戶端列表USER_AGENTS = [ "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)", "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)", "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)", "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20", "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",] # 創建請求頭信息def create_headers(): headers = dict() headers["User-Agent"] = random.choice(USER_AGENTS) headers["Referer"] = "http://www.ke.com" return headers配置代理IP
除了上面配置請求頭外,如果你用相同的 IP 大量請求抓取時,很可能會被封 IP,被封后再用這個 IP 請求網站時,會提示你請求超時,為避免被封最好我們通過代理 IP 去抓取,怎樣才能找到能用的代理 IP?
# 引入模塊from bs4 import BeautifulSoupimport requestsfrom lib.request.headers import create_headers # 定義變量proxys_src = []proxys = [] # 請求獲取代理地址def spider_proxyip(num=10): try: url = 'http://www.xicidaili.com/nt/1' # 獲取代理 IP 列表 req = requests.get(url, headers=create_headers()) source_code = req.content # 解析返回的 html soup = BeautifulSoup(source_code, 'lxml') # 獲取列表行 ips = soup.findAll('tr') # 循環遍歷列表 for x in range(1, len(ips)): ip = ips[x] tds = ip.findAll("td") proxy_host = "{0}://".format(tds[5].contents[0]) + tds[1].contents[0] + ":" + tds[2].contents[0] proxy_temp = {tds[5].contents[0]: proxy_host} # 添加到代理池 proxys_src.append(proxy_temp) if x >= num: break except Exception as e: print("獲取代理地址異常:") print(e)房價數據對象
在這里我們將新房的房價信息,創建成一個對象,后續我們只要將獲取到的數據保存成對象,再處理就會方便很多。NewHouse?對象代碼如下所示:
# 新房對象class NewHouse(object): def __init__(self, xiaoqu, price, total): self.xiaoqu = xiaoqu self.price = price self.total = total def text(self): return self.xiaoqu + "," + \ self.price + "," + \ self.total獲取房價信息并保存
好了,做好以上準備,下面我們就以貝殼為例,批量爬取其北京地區新房數據,并保存到本地。其實只要能抓取到數據,想保存成什么格式都可以,當然也可以保存到數據庫。這里我主要想說的是如何抓取數據,所以這里就保存成最簡單的?txt?文本格式。
# 創建文件準備寫入with open("newhouse.txt", "w", encoding='utf-8') as f: # 獲得需要的新房數據 total_page = 1 loupan_list = list() page = 'http://bj.fang.ke.com/loupan/' # 調用請求頭 headers = create_headers() # 請求 url 并返回結果 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.fang.ke.com/loupan/pg{0}'.format(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_="resblock-list") # 循環遍歷獲取想要的元素 for house_elem in house_elements: price = house_elem.find('span', class_="number") desc = house_elem.find('span', class_="desc") total = house_elem.find('div', class_="second") loupan = house_elem.find('a', class_='name') # 開始清理數據 try: price = price.text.strip() + desc.text.strip() except Exception as e: price = '0' loupan = loupan.text.replace("\n", "") # 繼續清理數據 try: total = total.text.strip().replace(u'總價', '') total = total.replace(u'/套起', '') except Exception as e: total = '0' # 作為對象保存到變量 loupan = NewHouse(loupan, price, total) print(loupan.text()) # 將新房信息加入列表 loupan_list.append(loupan) # 循環獲取的數據并寫入到文件中 for loupan in loupan_list: f.write(loupan.text() + "\n")代碼寫好了,現在我們就可以通過命令?python newhouse.py?運行代碼進行數據抓取了。抓取的結果如下圖所示:
總結
本文為大家介紹了如何通過 Python 將房產網上的新房數據批量抓取下來,然后就可以將每天抓取的結果跟歷史數據進行對比分析,來判斷樓市的大概趨勢。其中涉及到了用?BeautifulSoup?進行?html?解析,整個代碼來看實現方式并不難,希望通過這個過程可以為你提供一些幫助。
?在學編程,學Python的小伙伴們,一個人摸黑學會很難,博主也是過來人, 這里新建了一個扣群:1020465983,給大家準備了學習資源、好玩的項目,歡迎大家加入一起交流。
總結
以上是生活随笔為你收集整理的看我如何抓取最新房价数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 推荐一位AI技术人
- 下一篇: 十分钟让你明白AIDL