Advertisement

Python爬取链家租房信息

阅读量:

今天,我决定用Python爬虫技术来提取链家网站石家庄市开发区的租房信息。经过仔细研究和实践,我完成了以下内容:
目标网站:链家的租房信息页面,链接为https://sjz.lianjia.com/zufang/kaifaqu1/
爬虫思路:

  • 使用BeautifulSoup解析HTML内容。
  • 遍历页面中的每个房源,提取名称、价格、地址、面积、朝向、房型、楼层和优势信息。
  • 处理可能的异常情况,如页面加载失败或信息缺失。
    代码实现:
  • getHTMLText(url):获取网页的HTML内容。
  • fillList(url, roomlist):填充房源信息到列表。
  • save(roomlist, path):将提取到的信息保存到本地文件。
    结果展示:
  • 提取的信息被保存到石 宴 开发区 租房 信息.txt文件中。
  • 可以通过Excel将文件按制表符分列,方便进一步分析和处理。
    通过这次练习,我不仅熟悉了链家网站的结构,还掌握了使用BeautifulSoup处理静态网页的方法,以及如何处理常见的异常情况。这为我未来更复杂的爬虫项目打下了坚实的基础。

Python爬取链家租房信息

兴趣点:

继续加强实战能力,选取石家庄市开发区作为案例,筛选链家平台的租赁房屋数据。这种静态网页我已经练习过,已经得心应手了。

目标网站:

传送门:https://sjz.lianjia.com/zufang/kaifaqu1/

爬虫大体思路与方法:

大体思路:

(1)识别翻页规则(链家作为静态网页,其页面结构在浏览器顶端的链接区域呈现固定分布模式)
(2)收集目标出租房的相关信息,如房源信息、面积大小、具体地址等,系统性地汇总至列表中
(3)将数据系统性地存储在本地服务器中

方法:

(1)getHTMLText(url):从指定URL提取页面内容
(2)fillList(url,roomlist):将来自指定URL的出租房信息填充至数据存储结构中
(3)save(roomlist,path):解析来自指定URL的列表内容并生成本地文件系统中的TXT格式文件

参数介绍:

(1)roomlist:存放出租房各种信息的列表
(2)path:本地存储路径

部分细节讲解:

(1)获取house_name的写法:
为什么不直接用 find 方法找a标签?如下:

复制代码
    house_name = house.find("a",class_ = "twoline").get_text().strip()

这样写无法获取相关信息,我对这一问题也不太清楚,也不是第一次遇到类似的问题,可能与a标签的特性有关。

所以改成了下面这样:

复制代码
    house_name = house.find("p",class_ = "content__list--item--title").find("a").get_text().strip()

(2)为了使获取的内容更加整洁,再次提醒大家注意去除前后空格。**str.strip()**的作用是删除字符串前后多余的空格,非常实用。**str.replace(“旧字符”,“新字符”)**的功能是将指定的旧字符替换为新字符,特别适用于替换字符串内部的空格、制表符和换行符。

少数出租房未提供部分信息可能导致爬虫中断:在循环中添加try-except块以捕获并处理异常。

复制代码
    try:
    	for house in soup.find_all("div",class_ = "content__list--item"):
    		......
    		......
    except:	        
    	print("部分信息缺失,爬取失败*************************")

完整代码:

复制代码
    import requests
    import re
    import os
    from bs4 import BeautifulSoup
    
    def getHTMLText(url):
    try:
        kv = {"user-agent":"Mozilla/5.0"}
        r = requests.get(url,headers = kv)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print("getHTMLText失败!")
        return ""
    
    def fillList(url,roomlist):
    for i in range(1,55):
    		page_url = url + "pg{}".format(i)
    		html = getHTMLText(page_url)
    		soup = BeautifulSoup(html,"html.parser")
    		try:
    		    for house in soup.find_all("div",class_ = "content__list--item"):
    		        house_name = house.find("p",class_ = "content__list--item--title").find("a").get_text().strip()
    		        house_price = house.find("span",class_ = "content__list--item-price").get_text().strip()
    		        des = house.find("p",class_ = "content__list--item--des").get_text()
    		        deslist = des.split("/")
    		        house_address = deslist[0].strip()
    	                house_area = deslist[1].strip()
    		        house_towards = deslist[2].strip()
    		        house_roomtype = deslist[3].strip()
    		        house_floor = deslist[4].strip().replace(" ","").replace("\t","")
    		        house_tips = house.find("p",class_ = "content__list--item--bottom oneline").get_text().strip().replace("\n","").replace("\t","")
    		        roomlist.append([house_name, house_price, house_address, house_area, house_towards, house_roomtype, house_floor, house_tips])
    		        print(house_address + "爬取成功!")
    		except:
    	    	print("部分信息缺失,爬取失败*************************")
                
    def save(roomlist,path):
    with open (path,'a',encoding = 'utf-8') as f:
        f.write("房源"+"\t"+"价格"+"\t"+"具体地址"+"\t"+"面积"+"\t"+"朝向"+"\t"+"房型"+"\t"+"层数"+"\t"+"其他优势"+"\n")
        for room in roomlist:
            f.write(
                room[0] + "\t" +
                room[1] + "\t" +
                room[2] + "\t" +
                room[3] + "\t" +
                room[4] + "\t" +
                room[5] + "\t" +
                room[6] + "\t" +
                room[7] + "\n")
            print(room[2] + "存储成功!")
    f.close()
    
    def main():
    url = "https://sjz.lianjia.com/zufang/kaifaqu1/"
    roomlist = []
    path = "石家庄开发区租房信息.txt"
    fillList(url,roomlist)
    save(roomlist,path)
    
    main()

爬取结果展示:

直接将数据输入到Excel工作表中确实较为繁琐,我更倾向于将数据先保存为文本文件,再通过制表符分列功能导入Excel。对于使用Excel进行制表符分列的操作,大家普遍认为较为熟悉。若有不清楚的地方,建议进一步交流探讨。

txt显示
Excel显示

全部评论 (0)

还没有任何评论哟~