爬取北京链家二手房数据

利用python爬取了北京链家主页的二手房数据,爬取时间为2020年1月8日。由于链家只显示了100页、每页30条,因此只能爬取3000条数据。

后续将爬取各区的小区名,对每个小区的在售二手房数据进行收集,这样能获得更多数据。

以下为程序代码,其最终生成houseinfo.csv文件,包含3000条在售二手房的各类数据。

# -*- coding: utf-8 -*-
# 爬取链家二手房数据

from bs4 import BeautifulSoup
import requests
import pandas as pd
import re

def get_urls(n):
    urllist=[]
    for i in range(n):
        url='https://bj.lianjia.com/ershoufang/pg'+str(i+1)
        urllist.append(url)
    return urllist

def get_info(url):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                             'Chrome/63.0.3239.132 Safari/537.36'}
    response = requests.get(url=url, headers=headers)   #获取网页编码数据
    content = response.content.decode() #将数据解码
    soup = BeautifulSoup(content, features='lxml')  #用lxml方式解析
    infos = soup.find_all('div', {'class': 'info clear'})   #找到div标签的,class值为info clear的元素
    result = {}
    # 设置DataFrame的列名,为后续添加字典数据做准备,不设置列名,字典无法直接添加
    df=pd.DataFrame(columns=('total_price','unit_price','roomtype','height','direction','decorate','area','age'
                             ,'garden','district','id'))
    for info in infos:
        url=info.find('a').get('href')  #用get()方法获取<a>标签中的href属性,get方法可实现对标签中特定属性的获取
        doc=requests.get(url=url,headers=headers)
        decontent=doc.content.decode()
        soups=BeautifulSoup(decontent,features='lxml')
        #获取房屋名、总价和单价
        #用select方法找出括号中对应的类型名,括号中用.+单词来表示class类型名
        result['total_price']=soups.select('.total')[0].text+'万'
        result['unit_price']=soups.select('.unitPriceValue')[0].text
        #获取房屋信息,如房型、层高、朝向、装修情况、面积、楼龄
        result['roomtype']=soups.select('.mainInfo')[0].text
        result['height']=soups.select('.subInfo')[0].text
        result['direction']=soups.select('.mainInfo')[1].text
        result['decorate']=soups.select('.subInfo')[1].text
        result['area']=soups.select('.mainInfo')[2].text
        result['age']=re.sub("\D","",soups.select('.subInfo')[2].text)
        #获取房源所在小区、地区、环线等信息
        result['garden']=soups.select('.info')[0].text
        result['district']=soups.select('.info a')[0].text
        #获取房源编号
        result['id']=re.sub("\D","",soups.select('.houseRecord')[0].text)   #通过正则方式把字符串中的数字提取出来
        # 用append方法向DataFrame中添加字典数据,注意在未设置DataFrame列名的情况下不能直接添加字典数据,会报错
        df=df.append(result,ignore_index=True)
    return df

def write_data(urls):
    dflist=[]
    for url in urls:
        dflist.append(get_info(url))    #生成由DataFrame组成的列表
    result=pd.concat(dflist)    #用concat方法将列表中的DataFrame元素组合起来成为一个大DataFrame
    result=result.reset_index(drop=True)
    result.to_csv('houseinfo.csv')  #将DataFrame数据写入CSV文件中

urllist=get_urls(100)
write_data(urllist)
print('success')

 

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值