查看原文
其他

西安租房哪里房源最多?python可视化爬虫告诉你!

是沐沐呀 GOGO数据 2022-08-01
毕业了,想在本地城市发展。租房就是我面临的头等大事,哪里房源多?哪里的房价最便宜?我要面朝南向的,我还要高层的。。。。
没问题,爬虫搞定!

首先我们打开链家租房首页,可以看到在租的房源有61363套,这么多的房源肯定有我心仪的那一套。


我们想要获取的信息有房源的名称、房子的位置、房子的朝向、房子面积、房子布局、和最重要的一点就是房子的价格!


1.首先我们来获取网页链接:

https://xa.lianjia.com/zufang/pg1/https://xa.lianjia.com/zufang/pg5/https://xa.lianjia.com/zufang/pg8/

可以发现翻页的是由page参数决定的。


2.再加上以下3个参数模拟浏览器访问。

url = f'https://xa.lianjia.com/zufang/pg{page}/'
        # 模拟浏览器
        headers = {
            'Referer':f'https://xa.lianjia.com/zufang/pg{page}/',
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4484.7 Safari/537.36',
            'Cookie':'select_city=610100; lianjia_uuid=0026697d-0b4b-404a-9700-6ffdee75e3be; _smt_uid=60928372.2a8cb08f; UM_distinctid=1793c51792a47d-0751bdbf625319-71153641-1fa400-1793c51792ba23; _jzqckmp=1; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%221793c517f2b1-0931efe9a56ec3-71153641-2073600-1793c517f2c463%22%2C%22%24device_id%22%3A%221793c517f2b1-0931efe9a56ec3-71153641-2073600-1793c517f2c463%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E4%BB%98%E8%B4%B9%E5%B9%BF%E5%91%8A%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22https%3A%2F%2Fwww.baidu.com%2Fother.php%22%2C%22%24latest_referrer_host%22%3A%22www.baidu.com%22%2C%22%24latest_search_keyword%22%3A%22%E9%93%BE%E5%AE%B6%22%2C%22%24latest_utm_source%22%3A%22baidu%22%2C%22%24latest_utm_medium%22%3A%22pinzhuan%22%2C%22%24latest_utm_campaign%22%3A%22wyxian%22%2C%22%24latest_utm_content%22%3A%22biaotimiaoshu%22%2C%22%24latest_utm_term%22%3A%22biaoti%22%7D%7D; _ga=GA1.2.1228540593.1620214646; _gid=GA1.2.1956937792.1620214646; Hm_lvt_9152f8221cb6243a53c83b956842be8a=1620214650; digv_extends=%7B%22utmTrackId%22%3A%2221583074%22%7D; lianjia_ssid=5b2db515-b320-4c75-b676-e28e8b35d4ec; CNZZDATA1255849580=598881228-1620209949-https%253A%252F%252Fwww.baidu.com%252F%7C1620296334; CNZZDATA1254525948=1027467720-1620211125-https%253A%252F%252Fwww.baidu.com%252F%7C1620296930; CNZZDATA1255633284=1302951133-1620212328-https%253A%252F%252Fwww.baidu.com%252F%7C1620297661; CNZZDATA1255604082=1771052689-1620212893-https%253A%252F%252Fwww.baidu.com%252F%7C1620294612; _jzqa=1.3096002108450772000.1620214643.1620214643.1620299994.2; _jzqc=1; _jzqy=1.1620214643.1620299994.1.jzqsr=baidu|jzqct=%E9%93%BE%E5%AE%B6.-; _qzja=1.2112865692.1620214644413.1620214644413.1620299994647.1620214650759.1620299994647.0.0.0.3.2; _qzjc=1; _qzjto=1.1.0; _jzqb=1.1.10.1620299994.1; _qzjb=1.1620299994647.1.0.0.0; srcid=eyJ0Ijoie1wiZGF0YVwiOlwiNGE0Y2E5MmE5MTFiMjhjODMyNTIxMDdkM2VjMDU2NGQzY2I0ZGQzMDlhZDY2Y2MwY2FjZWJjOWVmNmY1NWRlYzIwNDYwZDY3ZmZiZTZmODM5Yzc3MWFmMzNkMmI0NDI5ZWFkMTFhYzY4YWU0Y2Q3ZTlhYWZhMzk4MTc0MjcwNTZiZTg3MTc1MWI5YWQzMDUxNzk4Y2MwZDJmMTA5YzgzOWMxZjUyZTVhMmI0NDVmYzNkN2NjNjI2NjZiYTRiYzI2YTZmNGNlMzViMTZkMTc3NTA4ZGE0YzkxMDAzZDkwYmIwNTM0NGU1OTY3OThlZWNiN2YyNjIxZjQ5YzRiOGY5NWY3Zjc5NWM2YzIzNmNkOGI0NjQ2ZWNmNjczNzk0MzBhZWRjODdjYjg4MWNkOWFjYjFhMWVkYTllOTc2NzYxMTgyZmU1MjljYjdlNWNiZmZjZDY5ZDA5YTEwZGM5OTcxNlwiLFwia2V5X2lkXCI6XCIxXCIsXCJzaWduXCI6XCJkMWZhZDhjYlwifSIsInIiOiJodHRwczovL3hhLmxpYW5qaWEuY29tL3p1ZmFuZy9wZzEvIiwib3MiOiJ3ZWIiLCJ2IjoiMC4xIn0='
        }
        # 发送网络请求
        try:
            resp = requests.get(url, headers = headers)
        except:
            print('something wrong!')


3. 分析网页,我们可以看到每一套房源的全部信息都在这个div里面,每页有30套房源信息,也就是有这样30个div。


所以我们的思路很简单,使用css先获取到这30的div的全部信息,再使用循环获取每一套房子里面的具体信息。


4.如下我们可以观察页面结构发现所有的房源div信息都在一个class名字为content__list的div内部。

所以我们先获取到所有的div

 divs = seletor.css('.content__list--item')  # 所有div标签


5.然后我们遍历所有的div获取其内部具体信息。

for d in divs:
   title = d.css('.content__list--item--title a::text').get().strip()  # 房子标题
   address = d.css('.content__list--item--des a::text').getall()
   address = '-'.join(address).strip()                                # 房子小区名称
   area = d.css('.content__list--item--des::text').getall()[4].strip()  # 房子面积
   toward = d.css('.content__list--item--des::text').getall()[5].strip()  # 房子朝向
   structure = d.css('.content__list--item--des::text').getall()[6].strip()  # 房子结构
   addinfo = d.css('.content__list--item--bottom i::text').getall()
   addinfo = '|'.join(addinfo)                                             # 房子其他信息
   maint = d.css('.content__list--item--time::text').get().strip()  # 房子维护详情
   price = d.css('.content__list--item-price em::text').get().strip() + '元/月' # 房子月租


6.然后我们将获取到的这些信息存入Excel方便后续pandas操作。

ws = op.Workbook()
wb = ws.create_sheet(index=0)

wb.cell(row=1, column=1, value='标题')
wb.cell(row=1, column=2, value='小区名称')
wb.cell(row=1, column=3, value='面积')
wb.cell(row=1, column=4, value='朝向')
wb.cell(row=1, column=5, value='结构')
wb.cell(row=1, column=6, value='附加信息')
wb.cell(row=1, column=7, value='维护情况')
wb.cell(row=1, column=8, value='月租')
ws.save('西安租房信息.xlsx')


7.获取到的Excel信息如下:


8.然后我们定个小目标,先获取100页的数据。也就是3000条的房源信息。


接下来我们简单可视化一下西安各个区域房源情况,看看哪个区域房源多,房源多了选择自然就多了。那价格自然...你懂!


1.我们先使用pandas读取excel然后获取所有的房源所在位置:

pd_data = pd.read_excel(r'./西安租房信息.xlsx')    # 读取excel
address = pd_data['小区名称']                      # 获取所有地址

因为我们只需前两位房源所在区域并且要知道每个区域的所有房源总数。而、无需其他信息所以还需进一步优化。

#获取地址前两位为区域名称
address_01 = []
for i in address:
    address_01.append(i[0:2])
#统计
data = []
address_01_set = set(address_01)
for item in address_01_set:
    data.append((item, address_01.count(item)))

#重新命名column
df = DataFrame(data)
df.columns = ('area''number')


接下来我们分别使用柱状图、饼图、折线图、漏斗图和仪表盘分别展示。

# 1、柱状图
def barPage() -> Bar:
    bar = (
        Bar()
        .add_xaxis(x_data)
        .add_yaxis("西安租房分布",y_data)
        .set_global_opts(
            title_opts=opts.TitleOpts(title="Bar-西安租房分布图"),
            legend_opts=opts.LegendOpts(is_show=False),)
    )
    return bar


将所有的可视化部分封装成函数展示出来。

page = (
    Page(layout=Page.DraggablePageLayout)
    .add(
        barPage(),
        piePage(),
        linePage(),
        funnelPage(),
        gaugePage())
)

page.render("page_demo.html")


一起来看看效果吧~~~






怎么样,比你在网页上一个一个查找强多了吧!比看Excel更加直观吧


更多爬虫和可视化资料关注公众号获取!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存