爬取二手房信息

Reads: 845 Edit

1 问题描述

二手房的信息往往在一个网页中以列表的形式展示多条信息,甚至存在多页的信息。

首先,我们先提取一个页面上的二手房信息,接在再采用循环语句来提取多页的二手房信息。

r-100

2 爬取一个页面上的二手房信息

2.1 导入所需模块

#-*- coding:utf-8 -*-
from urllib.request import Request,urlopen
import pandas as pd
from bs4 import BeautifulSoup
import importlib,sys
importlib.reload(sys)

2.2 定义该网页的网址

# 定义网址
url='https://bj.ke.com/ershoufang/'

2.3 爬取解析网页

# header是模拟浏览器的参数,解决反爬虫问题,如果要爬取的网站没有反爬虫,可以不加hear!
header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.55'}
req = Request(url, headers=header)
html = urlopen(req).read().decode('utf-8')

2.4 解析保存的网页内容

soup = BeautifulSoup(html, 'lxml')

2.5 提取二手房的标题

可以使用chrome等浏览器的"检查元素"功能。然后点击下图中红色区域图标!

r-101

之后鼠标移到需要提取信息的网页位置,浏览器会自动给出该内容的节点位置:a.VIEWDATA.CLICKDATA.maidian-detail

r-102

由于一个网页上有多个二手房的信息,如果只用find()函数,则只能提取第1个二手房的数据,为了将页面上所有二手房的信息提取,则需要使用find_all()函数。

housetitle=soup.find_all('a','VIEWDATA CLICKDATA maidian-detail')

for info in housetitle:
    print(info.get_text().replace(" ",""))

说明:一个网页上有30条二手房数据,这里仅列出了前几项。

pyt-155

2.6 提取标题的链接

househref=soup.find_all('a','VIEWDATA CLICKDATA maidian-detail',href=True)

for info in househref:
    print(info['href'])

pyt-156

2.7 查看二手房的具体信息

采用上面相同的方法,获取该内容的节点位置:div.address

housedetail=soup.find_all('div','address')
for info in housedetail:
    print(info.get_text().strip().replace("\n","").replace(" ",""))

pyt-157

2.8 提取二手房的位置

采用上面相同的方法,获取该内容的节点位置:div.flood

houseflood=soup.find_all('div','flood')
for info in houseflood:
    print(info.get_text().strip().replace("\n","").replace(" ",""))

pyt-158

2.9 将提取的二手房数据整理成表格形式

二手房的价格数据整理:

采用上面相同的方法,获取该内容的节点位置:div.priceInfo

提取价格信息后,将"万"和"元/平"去掉,只保留数据,并拆分成总价和单价。

price=[]
priceinfo=soup.find_all('div','priceInfo')
for item in priceinfo:
    info=item.get_text().strip().replace("\n","").replace(" ","").split('万')
    info[1]=info[1].replace(",","").replace("元/平","")
    price.append(info)
Price=pd.DataFrame(price,columns=['total_price','avg_price'])
print(Price)

pyt-159

二手房的房屋状况数据整理:

采用上面相同的方法,获取该内容的节点位置:div.houseInfo

有些二手房数据确实年份数据,这里我们直接将条目小于5的二手房数据设置为空值,不删除是因为后面还需要和价格数据匹配!

houseinfo=[]
housedata=soup.find_all('div','houseInfo')
for item in housedata:
    info = item.get_text().strip().replace("\n","").replace(" ","").split('|')
    if len(info)<5:
        houseinfo.append([" "," "," "," "," "])
        continue
    info[0]=info[0].split('(')[1].split(')')[0]
    info[1]=info[1][0:4]
    info[3]=info[3].replace("平米","")
    houseinfo.append(info)

House=pd.DataFrame(houseinfo,columns=['house_floor','house_age','house_type',' house_area',' house_orient'])
print(House)

pyt-160

二手房价格和房屋状况数据合并:

allinfo=pd.concat([House,Price],axis=1)
print(allinfo)

pyt-161

3 采用循环语句读取前n页的售房标题

从网页中可以看出,一共有100页的售房信息,我们这里只演示提取前5页的售房标题数据,爬取房屋信息数据的方法与之类似!

通过点击二手房下面的页面信息,可以发现每页的结尾是pg1,pg2,...。所以可以根据该规律构造多个页面并提取数据。

# muti-pages
urlbase='https://bj.ke.com/ershoufang/pg'
title_list=[]

for i in range(1,6):
    url = urlbase+str(i)
    print(url)

    req = Request(url)
    html = urlopen(req).read().decode('utf-8')
    # 解析保存的网页内容
    soup = BeautifulSoup(html, 'lxml')

    cc = soup.find_all('a', 'VIEWDATA CLICKDATA maidian-detail')

    for x in cc:
        title_list.append(x.get_text().replace(" ",""))

print(len(title_list))
print(title_list[0:10])

可以发现总共提取了150条数据!

pyt-162



获取案例数据和源代码,请关注微信公众号并回复:Python_dt30


Comments

Make a comment