1 问题描述
二手房的信息往往在一个网页中以列表的形式展示多条信息,甚至存在多页的信息。
首先,我们先提取一个页面上的二手房信息,接在再采用循环语句来提取多页的二手房信息。
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等浏览器的"检查元素"功能。然后点击下图中红色区域图标!
之后鼠标移到需要提取信息的网页位置,浏览器会自动给出该内容的节点位置:a.VIEWDATA.CLICKDATA.maidian-detail
由于一个网页上有多个二手房的信息,如果只用find()函数,则只能提取第1个二手房的数据,为了将页面上所有二手房的信息提取,则需要使用find_all()函数。
housetitle=soup.find_all('a','VIEWDATA CLICKDATA maidian-detail')
for info in housetitle:
print(info.get_text().replace(" ",""))
说明:一个网页上有30条二手房数据,这里仅列出了前几项。
2.6 提取标题的链接
househref=soup.find_all('a','VIEWDATA CLICKDATA maidian-detail',href=True)
for info in househref:
print(info['href'])
2.7 查看二手房的具体信息
采用上面相同的方法,获取该内容的节点位置:div.address
housedetail=soup.find_all('div','address')
for info in housedetail:
print(info.get_text().strip().replace("\n","").replace(" ",""))
2.8 提取二手房的位置
采用上面相同的方法,获取该内容的节点位置:div.flood
houseflood=soup.find_all('div','flood')
for info in houseflood:
print(info.get_text().strip().replace("\n","").replace(" ",""))
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)
二手房的房屋状况数据整理:
采用上面相同的方法,获取该内容的节点位置: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)
二手房价格和房屋状况数据合并:
allinfo=pd.concat([House,Price],axis=1)
print(allinfo)
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条数据!