目标:使用Python编写爬虫,获取链家青岛站的房产信息,然后对爬取的房产信息进行分析。
环境:win10+python3.8+pycharm
Python库:
1 import requests 2 import bs4 3 from bs4 import BeautifulSoup 4 import lxml 5 import re 6 import xlrd 7 import xlwt 8 import xlutils.copy 9 import time
目标分析:
1、编写爬虫爬取链家青岛站的房产信息
①分析目标链接
第一页:https://qd.fang.lianjia.com/loupan/pg/pg1
第二页:https://qd.fang.lianjia.com/loupan/pg/pg2
由上面的链接可以看出来,不同网页是使用最后的pgx来进行变化的
所以将链接分为两部分,使用字符串拼接获得所有的房产网页链接
1 WebDiZhi = [] 2 for i in range(1,85): 3 UrlHTML = Url + str(i) 4 WebDiZhi.append(UrlHTML)
使用遍历获得所有的链接并保存为列表
②分析网页结构
1 #获取目标网页的html代码并进行解析 2 Xu = 0 3 Shuliang = len(WebDiZhi) 4 while Xu in range(Shuliang):#循环整个列表 5 6 Web = requests.get(WebDiZhi[Xu]) 7 WebText = Web.text 8 9 #第一步、粗筛选目标信息所在的html代码,去除大部分无效信息代码 10 soup_One = BeautifulSoup(WebText,'html.parser') 11 XinXi_One = soup_One.find_all(class_="resblock-list-wrapper") 12 13 #第二步、进一步筛选目标信息所在html代码,去除无效信息代码 14 soup_Two = BeautifulSoup(str(XinXi_One),'lxml') 15 XinXi_Two = soup_Two.find_all(class_="resblock-desc-wrapper")
通过两步简单的筛选将房产信息所对应的html代码筛选出来
方便进一步分析html网页标签获取不同的房产信息
③针对不同的房产信息定义不同的函数,通过调用函数来获取不同的房产信息并保存到目标文件中
1 print("-----------------开始写入第{}页-------------".format(Xu)) 2 Name = GetName(XinXi_Two) # 获取小区名称 3 Write_File(Name, 0,Xu) 4 print("---------小区名称写入成功---------") 5 time.sleep(3) #延时 6 Nature = NatureHouse(XinXi_Two) # 获取小区住宅性质(住宅、商业性) 7 Write_File(Nature, 1,Xu) 8 print("---------小区性质写入成功---------") 9 time.sleep(3) 10 Status = StatusHouse(XinXi_Two) # 获取小区状态(在售) 11 Write_File(Status, 2,Xu) 12 print("---------小区状态写入成功---------") 13 time.sleep(3) 14 Address = AddressHouse(XinXi_Two) # 获取小区地址 15 Write_File(Address, 3,Xu) 16 print("---------小区地址写入成功---------") 17 time.sleep(3) 18 Area = AreaHouse(XinXi_Two) # 获取小区房屋面积 19 Write_File(Area, 4,Xu) 20 print("---------小区面积写入成功---------") 21 time.sleep(3) 22 Average = AveragePriceHouse(XinXi_Two) # 均价 23 Write_File(Average, 5,Xu) 24 print("---------小区均价写入成功---------") 25 time.sleep(3) 26 Total = TotalPriceHouse(XinXi_Two) # 总价 27 Write_File(Total, 6,Xu) 28 print("---------小区总价写入成功---------") 29 time.sleep(3)
各房产信息函数
1 def Write_File(Data, lei,Hang): 2 data = xlrd.open_workbook(r"F:\实例\Python实例\爬虫\111.xls") 3 ws = xlutils.copy.copy(data) 4 table = ws.get_sheet(0) 5 Shu = Hang * 10 6 for i in range(len(Data)): 7 table.write(i + 1 + Shu, lei, Data[i]) 8 print("----第{}项写入成功----".format(i)) 9 ws.save(r"F:\实例\Python实例\爬虫\111.xls") 10 11 12 def GetName(XinXi): 13 """ 14 @param XinXi: 传入GetHTML函数第二步中筛选出的div标签下的html代码以及目标信息 15 @return: 返回小区名称,列表类型 16 """ 17 Nmae_list = [] 18 # 获取小区名称 19 Obtain_Name_One = BeautifulSoup(str(XinXi), 'lxml') 20 Name_One = Obtain_Name_One.findAll(class_="name") 21 for i in Name_One: 22 Get_A = BeautifulSoup(str(i), 'lxml') 23 Nmae_list.append(Get_A.string) 24 return Nmae_list 25 26 """ 27 代码以及目标信息均已获取,通过不同函数将html代码在对应函数中逐一进行解析获取函数对应信息并保存即可 28 以下为部分函数,其他函数未定义 29 30 """ 31 def NatureHouse(Nature): 32 """房屋性质""" 33 Nature_list = [] 34 Obtain_Nature = BeautifulSoup(str(Nature), 'lxml') 35 Nature_one = Obtain_Nature.find_all(class_='resblock-type') 36 for i in Nature_one: 37 Get_Span = BeautifulSoup(str(i), 'lxml') 38 Nature_list.append(Get_Span.string) 39 return Nature_list 40 41 def StatusHouse(Status): 42 """房屋状态""" 43 Status_list = [] 44 Obtain_Nature = BeautifulSoup(str(Status), 'lxml') 45 Status_one = Obtain_Nature.find_all(class_='sale-status') 46 for i in Status_one: 47 Get_Span = BeautifulSoup(str(i), 'lxml') 48 Status_list.append(Get_Span.string) 49 return Status_list 50 51 def AddressHouse(Area): 52 """ 53 54 55 @param Area:传入GetHTML函数第二步中筛选出的div标签下的html代码以及目标信息 56 @return: 57 Analysis_Label_xxx:分析标签,xxx:代表第几次分析 58 Target_Information_xxx:目标信息,xxx:代表第几个信息部分,总共分为两部分,以及一个整体信息存储列表Target_Information_list 59 """ 60 #获取标签 61 Target_Information_list = [] 62 Analysis_Label_One = BeautifulSoup(str(Area), 'lxml') 63 # 获取div标签,calss=resblock-location 64 Get_label_One = Analysis_Label_One.find_all(class_='resblock-location') 65 #解析标签并获得span标签 66 Analysis_Label_Two = BeautifulSoup(str(Get_label_One), 'lxml') 67 Get_label_Two = Analysis_Label_Two.find_all(name='span') 68 69 70 #获取span标签里面的文字内容并保存在列表内 71 72 #第一个 73 Target_Information_One = [] 74 for i in Get_label_Two: 75 #使用正则表达式取出内部信息并保存在列表中 76 Information_Str = re.sub(r'<.*?>','',str(i)) 77 Target_Information_One.append(Information_Str) 78 #将列表内相同小区的地址进行合并,使用循环嵌套获取内容、合并最后保存在列表内 79 i = 1 80 a = 0 81 82 #第二个,第二个信息是在第一个信息的基础上合并列表内的元素得来 83 Target_Inform