小组分工:李鹏博 代码;刘晨 项目说明报告; 钱增 展示
总体思路:分别编写函数来获取楼房信息:区域名、楼盘名称、具体地址、类型、售卖状态、房屋户型特点,评分、评价数、价格以及联系电话。最后再调用以上函数将其信息存于csv文件。
首先应项目要求,我们需要用到requests库于请求网页,csv库于保存信息于文件,bs4库于解析标签代码。
import requests import csv from bs4 import BeautifulSoup
随后以函数的形式来进行程序的编写。
Part1:获取区域名
def Quyuname(url):
"""
获取所在省市的各区域名
:param url:
:return quyunamelist:
"""
response = requests.get(url)
page = BeautifulSoup(response.text,"html.parser")
mainpart = page.find("li", id="quyu_name")
quyuname = mainpart.find_all("a")[1:]
quyunamelist = {}
for h in quyuname:
quyunamelist[h.text] = []
return quyunamelist
首先调用requests库向网页发起请求并将内容存为response;接着调用bs4库将上述获得的名为response.text的文档进行解析,这里的html.parser是解析文档时所用的解析器。然后运用bs4中的find()语法匹配指定标签为“li”框架下属性为id=“quyu_name”的内容存于mainpart。接着用find_all()匹配“a”标签并将其后的区域名存入quyuname(find_all自动返回列表类型)。最后遍历quyuname将其存入字典中。
Part2:获取各楼盘所在区域和具体地址
def addrs(i):
"""
获取单一楼盘所在区域和具体地址
:param i:
:return address,Address:
"""
addrerss = i.find("div", class_="address").find("a")
try:
address = addrerss.find("span",class_="sngrey").text.replace("t","").replace("n","").strip("[").strip("]")
Address = addrerss["title"]
except:
Address = addrerss["title"]
address = addrerss.text.replace("t","").split("]")[0].replace("t","").replace("n","").strip("[").strip("]")
address1 = [address, Address]
print(address1)
return address1
首先查询属性class_= “address”的标签“div”,嵌套find()查找标签“a”生成列表addrerss。关于这里为什么要用try except,是因为该网站关于房源地址的源代码有多种书写格式,有些文本需要用另一套方法去修改才能得到一致的文本排版格式。最后将得到的房源所在的区域名和具体地址存入列表。
Part3:获取楼盘名称
def names(i):
"""
获取楼盘名
:param i:
:return Name:
"""
name = i.find("div", class_="nlcd_name")
Name = name.text.strip()
return Name
与前几个步骤相同,find()获取对应信息并提取,然后用strip()去除文本前后空格。
Part4:获取楼盘类型
def types(i):
"""
获取楼盘类型
:param i:
:return Type:
"""
type = i.find("div", class_="house_type clearfix")
Type = type.text.replace("t", "").replace("n", "")
return Type
find()获取对应信息并提取,然后再按照所需格式对文本进行修改,如上述将一些提取到的文本中含空格或换行的字符替换。
Part5:获取楼盘状态
def situations(i):
"""
获取楼盘状态
:param i:
:return Situation:
"""
situtation = i.find("div", class_="fangyuan").find("span").text
Situtation = situtation.replace("t", "").replace("n", "")
return Situtation
find()获取相应信息,再对文本进行修改处理。
Part6:获取楼盘特点
def charas(i):
"""
获取楼盘特点
:param i:
:return Chara:
"""
Chara = []
chara = i.find("div", class_="fangyuan").find_all("a")
for n in chara:
Chara.append(n.text)
if len(Chara) == 0:
Chara = "无相关信息"
return Chara
find()获取相应信息,在对文本进行修改处理。由于某些房源此处没有信息,所以添加一个if条件,当无房源特点时,输出“无相关信息”。
Part7:获取楼盘评分
def rates(i):
"""
获取楼盘评分
:param i:
:return Rate:
"""
rate1 = len(i.find("ul", class_="star_group").find_all("li", class_="orange-star"))
rate2 = len(i.find("ul", class_="star_group").find_all("li", class_="half-star"))
rate = 0.5 * rate2 + rate1
Rate = "评分:" + str(rate)
return Rate
获取网页信息后,如上图网页源代码中的绿色字体所述,按照这个公式对房源进行一个评分。
Part8:获取楼盘价格
def prices(i):
"""
获取楼盘价格
:param i:
:return Price:
"""
try:
Price = i.find("div", class_="nhouse_price").text.replace("t", "").replace("n", "")
except:
Price = i.find("div", class_="kanesf").text.replace("t", "").replace("n", "")
return Price
ps:有些楼盘无价格或未取得预售证。
Part9:获取楼盘联系方式
def tels(i):
"""
获取楼盘联系方式
:param i:
:return Tel:
"""
try:
Tel = i.find("div", class_="tel").text.replace("t", "").replace("n", "")
except:
Tel = "无电话号码"
return Tel
获取后对于文本进行修改处理。由于部分房源没有联系电话,所以当没有电话时返回“无电话号码”。
Part10:获取评论数
def coms(i):
"""
获取评论数
:param i,quyu:
:return Comment:
"""
Comment = i.find("span", class_="value_num").text.replace("t", "").replace("n", "")
return Comment
Part11:房屋信息整合
def details(quyunamelist,Name, Address, Type, Situation, Chara, Rate, Comment, Price, Tel):
if Type == "":
detail = [Name, Address[1], "未知", Situation, Chara, Rate, Comment, Price, Tel]
else:
detail = [Name, Address[1], Type, Situation, Chara, Rate, Comment, Price, Tel]
try:
quyunamelist[Address[0]].append(detail)
except:
pass
此部分函数将上述函数的返回值整合起来并存入字典。由于某些房屋类型未知,此处用if else处理。Address默认为列表,Address[0]是区域,Address[1]是具体地址。运用try将其同一区域的房源放在一起,由于有些房源没有所属区域,直接跳过。
Part12:将房屋信息写入文件
def writecsv(file,quyu):
"""
写入csv文件当中
:param file:
:return:
"""
f = open(file, mode="w", encoding="utf-8")
csvwriter = csv.writer(f)
headerlist = ["区域", "楼盘名", "具体地址", "类型", "状态", "特点", "评分", "评价人数", "价格", "联系电话"]
csvwriter.writerow(headerlist)
for key, value in quyu.items():
if len(value) == 0:
csvwriter.writerow(
[key, "本地区没有相关信息", "本地区没有相关信息", "本地区没有相关信息", "本地区没有相关信息", "本地区没有相关信息", "本地区没有相关信息", "本地区没有相关信息",
"本地区没有相关信息", "本地区没有相关信息"])
else:
for o in value:
csvwriter.writerow([key, o[0], o[1], o[2], o[3], o[4], o[5], o[6], o[7], o[8]])
f.close()
此处编写函数将房源信息存于csv文件。用到csv库相关语法进行书写。
Part13:调用上述函数
def main():
"""
爬取楼盘主要信息
:return:
"""
quyu = Quyuname(url)
for k in range(1, 39):
newurl = "https://newhouse.fang.com/house/s/b9" + str(k)
response1 = requests.get(newurl)
page1 = BeautifulSoup(response1.text, "html.parser")
mainpart1 = page1.find_all("div", class_="nlc_details")
for i in mainpart1:
details(quyu,names(i),addrs(i), types(i), situations(i), charas(i), rates(i), coms(i), prices(i), tels(i))
writecsv(file,quyu)
file = '北京各区楼盘信息.csv'
url = "https://newhouse.fang.com/house/s/"
main()
print("scrapying is over")
最有编写主程序main()调用上述函数。将1-38页的房源信息一一遍历处理写入文件。
最后结果:



