python爬虫之爬取链家658家二手房源

继上次爬取简单的链家二手房信息后,这次爬取稍微复杂一点的链家二手房房源,通过链家的过滤选择,共筛选出658家的房源,本次进行爬取。

步骤和上一次简单爬取的差不多,可参考:
链家简单爬取

本次的爬取就是在之前的基础上,进入详情页进行爬取,提取相关信息。
完整代码如下:

'''
爬取链家郑州二七二手房的信息
'''
# 导入第三方库
import csv
import time
import requests
from lxml import etree
from fake_useragent import UserAgent

# 随机请求头
ua = UserAgent()


# 定义翻页爬取链家的类
class FeLianJia():
    # 初始化对象
    def __init__(self):
        # 初始化url
        self.start_url = "https://zz.lianjia.com/ershoufang/erqi/pg{}l2a2p2/"
        self.headers = {"User-Agent": ua.random}

    # 定义得到html文本的方法
    def get_html(self, url):
        time.sleep(0.5)
        html = requests.get(url, headers=self.headers).content.decode()
        return html

    # 定义解析详情页的url的方法
    def paser_url(self, html):
        e = etree.HTML(html)
        href = e.xpath('//div[@class="info clear"]/div[@class="title"]/a/@href')
        return href

    # 定义解析html文本和保存提取信息的方法
    def paser_save_html(self, href):
        for href in href:
            data = {}
            time.sleep(0.5)
            r = requests.get(url=href, headers=self.headers).content.decode()
            e = etree.HTML(r)
            # 提取单价
            un_price = e.xpath('//div[@class="unitPrice"]/span[@class="unitPriceValue"]/text()')
            un_price = [i + "元/平米" for i in un_price]
            data["单价"] = un_price[0]
            # 提取总价
            total_price = e.xpath('//div[@class="price "]/span/text()')
            total_price = [i + "万" for i in total_price]
            data["总价"] = total_price[0]
            # 提取房屋
            room = e.xpath('//div[@class="room"]/div[@class="mainInfo"]/text()')
            data["类型"] = room[0]
            # 提取房屋类型
            type1 = e.xpath('//div[@class="type"]/div[@class="mainInfo"]/text()')
            data["朝向"] = type1[0]
            # 提取房屋面积
            area1 = e.xpath('//div[@class="area"]/div[@class="mainInfo"]/text()')
            data["面积"] = area1[0]
            # 提取房屋所在小区
            cname1 = e.xpath('//div[@class="communityName"]/a[1]/text()')
            data["所在小区"] = cname1[0]
            # 提取交通条件
            content = e.xpath('//div[@class="introContent showbasemore"]/div[2]/div[@class="content"]/text()')
            if len(content) == 0:
                continue
            data["周边"] = content[0].rstrip()
            # 写入提取内容
            with open("lianjia.csv", 'a', newline='') as f:
                for key, value in data.items(): 
                    f.write(key + ',' + value + ',')
                    f.write('\n')

    # 定义运行方法,实现主要逻辑
    def run(self):
        # 构造url
        for i in range(1, 23):
            url = self.start_url.format(i)
            html = self.get_html(url)
            href = self.paser_url(html)
            self.paser_save_html(href)


# 程序运行接口
if __name__ == '__main__':
    FeLJ_spider = FeLianJia()
    FeLJ_spider.run()

最后写入csv,但还不知道字典如何一行一行横向写入csv,所以本次的存储不是想要的结果,后续学习pandas之后再重新爬取写入,代码仅作参考
爬取结果如下:
在这里插入图片描述

发布了44 篇原创文章 · 获赞 16 · 访问量 2385

猜你喜欢

转载自blog.csdn.net/qq_46292926/article/details/105081691