2019年过去了,突然想看看外界一直在说的房价跌跌跌,到底跌成了啥样子,于是,花了点时间,把链家上北上广深杭这几个热门城市的二手房单价弄下来看看。
直接上代码了
(临近过年,懒了许多,代码写得很简单,各位看官可以跳到最后直接看房价情况即可)
import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
#把常用的定义成2个函数方便使用
def get_html(url):
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
res = requests.get(url,headers = headers)
code = res.status_code
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text,'lxml')
return soup,code
def get_data(soup,list_price):
items = soup.select('ul[class="sellListContent"] div[class="priceInfo"]')
#print(items)
for item in items:
try:
item.text
try:
list_price.append(item.select('div[class="unitPrice"]')[0].text[2:-4])
except:
continue
except:
continue
#广州
list_price = []
list_position = []
url1 = 'https://gz.lianjia.com/ershoufang/'
a = ['tianhe','yuexiu','liwan','haizhu','panyu','baiyun','huangpugz','conghua','zengcheng','huadou','nansha']
b = [100,100,100,100,100,100,100,47,100,100,69]
for i in range(0,11):
url2 = url1+a[i]
print("开始爬取"+a[i])
time.sleep(3.23422) #这里的暂停可要可不要,我比较善良,爬一个区就让它休息一下
for j in range(1,b[i]+1):
url = url2+'/pg%d/'%j
#print(url)
soup,code = get_html(url)
get_data(soup,list_price)
list_position = list_position + ([a[i]]*(len(list_price)-len(list_position)))
print('爬取完成第%d页'%j)
time.sleep(0.00593)
df = pd.DataFrame()
df['价格'] = list_price
df['区域'] = list_position
df['价格'] = df['价格'].astype(int)
print("全市均价:",df['价格'].mean())
print(df.groupby('区域')['价格'].mean().sort_values(ascending=False))
代码里我偷懒了好多地方,各个城市我都是直接按行政区划分取数了,代码里的a就是区域,b就是各个区域对应的页数(直接一个一个码上去了,没有去写获取),但是链家网有一个限制,一个选项只能展示100页(3000套房)的房源情况,所以有些区域本来有好几千套房的,但是我最多也就取了3000套(不管了,反正只是要看一下区域单价,只能取3000套就当是抽样了)。
如果是要完整获取所有房源的单价,可以先获取城市下各个区域的href(下图1),然后进行url拼接,再到各个区域中取出各个小板块的href(下图2),最终拼接成各个板块的url,最后一步,根据各个板块url最下方的页码栏,取出各个板块有多少页房源(下图3),(极大概率下,板块的房源不可能会超过3000套的,如果真的有,那你再在各个板块了根据价格细分就行了)。
最最重要的是,把各个城市的房价情况弄出来给大家看(我坚信大部分童鞋是不会自己去跑脚本看结果的)
看了一下,讲真这房价一点都不亲民,广州是四个一线城市中上车成本最低的,均价甚至不及二线城市杭州高。