一直想按照某個小區(qū)按月統(tǒng)計二手房源的價格趨勢,雖然售房網(wǎng)站上點進去某個小區(qū)直接看得到,但是總感覺有問題浑侥,不如自己直接獲取數(shù)據(jù)來的踏實。如果要買房子晰绎,總是有自己的目標(biāo)范圍寓落,像之前我用R提取的房源數(shù)據(jù),按照一定特征進行了分類荞下,那么可以按照自己心儀的區(qū)域有選擇地關(guān)注某些小區(qū)的價格變動伶选。我關(guān)注了若干個小區(qū),從今年開始按月統(tǒng)計二手房源的價格尖昏。當(dāng)然最后統(tǒng)計出來的不可能精確仰税,但是房源價格的趨勢我倒是很感興趣,當(dāng)作未來的一個參考抽诉。
以【房地產(chǎn)門戶|房地產(chǎn)網(wǎng)】- 房天下為例陨簇。
首先找到感興趣的小區(qū)所在網(wǎng)頁,比如像中大未來城二手房出售信息-中大未來城小區(qū)網(wǎng)-昆山房天下迹淌。
網(wǎng)頁格式類似于“小區(qū)名.http://fang.com/chushou/”塞帐,前面的小區(qū)名可以用循環(huán)列表來處理。接下來需要獲得最大的頁碼巍沙。觀察最后的翻頁葵姥,有一個“末頁”可以定位。
獲取末頁所在的URL句携。
last_page = soup.find_all('a', id='PageControl1_hlk_last')
接著從末頁的頁面源碼獲得這一頁的頁碼數(shù)字榔幸。當(dāng)然可能有一頁或者多頁,需要用末頁URL是否存在來判斷矮嫉。
if len(last_page) != 0:? ??
????????last_url = last_page[0].attrs['href']? ??
????????response_last = requests.get(last_url, headers=headers)? ??
????????soup_last = BeautifulSoup(response_last.text, 'lxml')? ??
????????total_page = soup_last.find('a', class_='pageNow').get_text()
else:? ??
????????total_page = soup.find('a', class_='pageNow').get_text()
獲得頁碼最大數(shù)字后可以拼接得到新的URL列表削咆,也就是房源所在的所有頁面URL。
for page in range(1, int(total_page)+1):? ? ? ??
????????pageurl = 'http://' + u + '.fang.com/chushou/list/-h330-i3' + str(page) + '/'
從頁面中獲得房源詳細(xì)信息蠢笋,用bs4來解析源碼拨齐。
res = requests.get(pageurl, headers=headers, timeout=4)
s = BeautifulSoup(res.text, 'lxml')
links = s.find_all('div', class_='fangList')
for i in links:? ??
????????link = i.find('a')['href']? ??
????????each = BeautifulSoup(str(i), 'lxml')? ??
????????title = each.find('p', class_='fangTitle').get_text().replace(',', '').strip()? ??
????????mianji = each.find('li').get_text()[:-2]? ??
????????zongjia = each.find('span', class_='num').get_text()? ??
????????danjia = each.find('li', class_='update').get_text()[:-4]
直接按照每個小區(qū)建立一個Excel表,每過一個月直接增加一個sheet昨寞,這里需要用到xlwt瞻惋、xlrd厦滤、xlutils這三個庫,用來讀寫數(shù)據(jù)到Excel表歼狼。目前只能用xls格式的文件掏导。
rdbook = xlrd.open_workbook(xiaoqu + '.xls')
wtbook = copy(rdbook)
worksheet = wtbook.add_sheet('201802', cell_overwrite_ok=True)
count = 0
worksheet.write(count, 0, title, xlwt.easyxf('font: height 240, name SimSun'))
worksheet.write(count, 1, int(zongjia), xlwt.easyxf('font: height 240, name SimSun'))
worksheet.write(count, 2, int(mianji), xlwt.easyxf('font: height 240, name SimSun'))
worksheet.write(count, 3, int(danjia), xlwt.easyxf('font: height 240, name SimSun'))
worksheet.write(count, 4, link, xlwt.easyxf('font: height 240, name SimSun'))
count += 1
wtbook.save(xiaoqu + '.xls')
這里需要一個count,用來指定添加到sheet的哪一行羽峰。
這樣只要事先將小區(qū)名命名的Excel表在py同一個文件夾建立好趟咆,運行程序后可以直接導(dǎo)入sheet,一個月后把sheet名改成201803梅屉。
完整代碼如下:
import requests
from bs4 import BeautifulSoup
import random
import xlwt
import xlrd
from xlutils.copy import copy
ua_list = [
? ? ? ? "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
? ? ? ? "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
? ? ? ? "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
? ? ? ? "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
? ? ? ? ]
headers = {'User-agent': random.choice(ua_list)}
urls = ['bojuedadi0512', 'guanhuyihao0512', 'hefengyasong']
for u in urls:
? ? ? ? url = 'http://' + u + '.fang.com/chushou/'
? ? ? ? response = requests.get(url, headers=headers, timeout=4)
? ? ? ? soup = BeautifulSoup(response.text, 'lxml')
? ? ? ? xiaoqu = soup.find('a', class_='esfdetailName blueWord').get_text()
? ? ? ? #打開excel
? ? ? ? rdbook = xlrd.open_workbook(xiaoqu + '.xls')
? ? ? ? wtbook = copy(rdbook)
? ? ? ? #添加新sheet
? ? ? ? worksheet = wtbook.add_sheet('201803', cell_overwrite_ok=True)
? ? ? ? #找到最后一頁的頁碼
? ? ? ? last_page = soup.find_all('a', id='PageControl1_hlk_last')
? ? ? ? if len(last_page) != 0:
? ? ? ? ? ? last_url = last_page[0].attrs['href']
? ? ? ? ? ? response_last = requests.get(last_url, headers=headers)
? ? ? ? ? ? soup_last = BeautifulSoup(response_last.text, 'lxml')
? ? ? ? ? ? total_page = soup_last.find('a', class_='pageNow').get_text()
? ? ? ? else:
? ? ? ? ? ? total_page = soup.find('a', class_='pageNow').get_text()
? ? ? ? #開始提取
? ? ? ? count = 0
? ? ? ? for page in range(1, int(total_page)+1):
? ? ? ? ? ? ? ? pageurl = 'http://' + u + '.fang.com/chushou/list/-h330-i3' + str(page) + '/'
? ? ? ? ? ? ? ? res = requests.get(pageurl, headers=headers, timeout=4)
? ? ? ? ? ? ? ? s = BeautifulSoup(res.text, 'lxml')
? ? ? ? ? ? ? ? links = s.find_all('div', class_='fangList')
? ? ? ? ? ? ? ? for i in links:
? ? ? ? ? ? ? ? ? ? link = i.find('a')['href']
? ? ? ? ? ? ? ? ? ? each = BeautifulSoup(str(i), 'lxml')
? ? ? ? ? ? ? ? ? ? title = each.find('p', class_='fangTitle').get_text().replace(',', '').strip()
? ? ? ? ? ? ? ? ? ? mianji = each.find('li').get_text()[:-2]
? ? ? ? ? ? ? ? ? ? zongjia = each.find('span', class_='num').get_text()
? ? ? ? ? ? ? ? ? ? danjia = each.find('li', class_='update').get_text()[:-4]
? ? ? ? ? ? ? ? ? ? worksheet.write(count, 0, title)
? ? ? ? ? ? ? ? ? ? worksheet.write(count, 1, int(zongjia))
? ? ? ? ? ? ? ? ? ? worksheet.write(count, 2, int(mianji))
? ? ? ? ? ? ? ? ? ? worksheet.write(count, 3, int(danjia))
? ? ? ? ? ? ? ? ? ? worksheet.write(count, 4, link)
? ? ? ? ? ? ? ? ? ? count += 1
? ? ? ? ? ? ? ? ? ? print(count, title)
? ? ? ? wtbook.save(xiaoqu + '.xls')