python爬取链家网的房屋数据

本文介绍了一个针对链家网北京二手房数据的爬虫项目,详细讲解了爬虫的设计思路、实现方法及数据抓取过程。通过组合不同搜索条件,爬虫能够抓取大量房源信息,包括房屋URL、具体详情等。文章还提供了完整的Python代码示例,涵盖了从获取房屋列表到抓取详细信息的全过程。

爬取内容

爬取源网站

北京二手房 https://bj.lianjia.com/chengjiao/

爬取内容

在这里插入图片描述
在这里插入图片描述

爬取思路

  • 通过不同的条件组合,来尽量获取多的数据(因为有100页的限制)
    在这里插入图片描述
  • 获取当前页的房屋url
    在这里插入图片描述
  • 翻页保存每一页的房屋url,并把url写到本地
  • 读取房屋url,爬取每个房屋的具体信息

爬取的数据

在这里插入图片描述

代码

获取房屋url

import urllib.request
import ssl
from lxml import etree
import re
import threading

# 全局取消证书验证
ssl._create_default_https_context = ssl._create_unverified_context


# 获取页面
def get_page(url):
    page = urllib.request.urlopen(url)
    html = page.read().decode('utf-8')
    return html


# 获取当前的总页数
def get_page_num(url):
    try:
        html = get_page(url)
        pagenum = re.findall(r'"totalPage":(.+?),"curPage"', html)[0]
    except:
        pagenum = 0
    pagenum = int(pagenum)
    return pagenum


# 获取当前页所有房子的url
def get_house_url_current_page(url):
    flag = ''
    list_house_url_current_page = []
    try:
        html = get_page(url)
        selector = etree.HTML(html)
        # 获取成交时间
        deal_date = selector.xpath('/html/body/div[5]/div[1]/ul/li[last()]/div/div[2]/div[2]/text()')[0]
        # print(deal_date)
        # 获取年份
        deal_year = deal_date[:4]
        if deal_year == '近30天':
            pass
        elif deal_year == '2018':
            house_url_list_li = selector.xpath('/html/body/div[5]/div[1]/ul/li')
            for li in house_url_list_li:
                house_url = li.xpath('div/div[1]/a/@href')[0]
                # print(house_url)
                list_house_url_current_page.append(house_url)
        else:
            flag = 'yearError'
    except:
        pass
    # print(list_house_url_current_page)
    return list_house_url_current_page, flag


# 获取某个区所有的房屋url
def get_house_url_current_district(district_url_list):
    list_house_url = []
    for district_url in district_url_list:
        # print(district_url)
        pagenum = get_page_num(district_url)
        if pagenum == 0:
            print('-------')
            pagenum = get_page_num(district_url)
            print(pagenum)
            print(district_url)
            print('+++')
        for i in range(1, pagenum+1):
            url = district_url + 'pg' + str(i)
            print(url)
            list_house_url_current_page, flag = get_house_url_current_page(url)
            if flag == 'yearError':
                break
            list_house_url.append(list_house_url_current_page)
    # print(list_house_url)

    # 把所有的url拼接成字符串,便于写入本地
    str_url = ''
    for row in list_house_url:
        for url in row:
            str_url += url + '\n'
    return str_url


# 把url写到本地
def write_house_url(write_str, district):
    path_file = "./data_url/house/" + district + ".txt"
    with open(path_file, 'w') as file:
        file.write(write_str)</
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值