欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Django:Python 爬虫抓取上海二手房信息,将其存储到数据库中,并在前端显示。

最编程 2024-06-28 21:17:03
...

好久没写Django实战教程了,小编我今天就带你把它与Python爬虫结合做出个有趣的东西吧。我们将开发这样一个应用,前端用户可以根据行政区划,房厅数和价格区间选择需要爬取的二手房房源信息,后台Python开始爬取数据。爬取数据完成后,通过Django将爬来的数据存入数据库并通过网页显示给用户。通过本文,你将学会:

  • Django如何与Python爬虫结合与交互

  • 如何利用split方法和正则表达式从字符串中提取我们所需要信息

 

开发环境

使用venv或PyCharm新建一个项目,安装本项目所需要的python第三方库。后面3个库都是python爬虫常用的库。我们将使用Django 2.1 + Python 3.X + SQLite开发。

  • pip install django

  • pip install bs4

  • pip install requests

  • pip install fake-useragent

新建项目与项目设置

使用django-admin startproject home_spider创建一个名为home_spider的django项目, 然后cd home_spider进入项目文件夹,使用python manage.py startapp homelink创建一个名为homelink的APP,让后把它加入到settings.py的INSTALLED_APP里去。

#home_spider/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'homelink',
]

 

因为美化我们的网需要用到静态文件如css和js,我们需要在settings.py里设置STATIC_URL。

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, "static"), ]

除此以外我们还要把app的urls加到项目里去, 如下所示。

#home_spider/urls.py

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/', include('allauth.urls')),
    path('homelink/', include('homelink.urls')),
] 

模型

我们的模型非常简单,主要用于存储二手房相关信息,如小区,房厅,朝向,总价和单价。模型的各个字段与我们即将从链家网上爬取的信息是逐一对应的。

#homelink/models.py

from django.db import models

# Create your models here.


class HouseInfo(models.Model):
    title = models.CharField(max_length=256, verbose_name='标题')
    house = models.CharField(max_length=20, verbose_name='小区')
    bedroom = models.CharField(max_length=20, verbose_name='房厅')
    area = models.CharField(max_length=20, verbose_name='面积')
    direction = models.CharField(max_length=20, verbose_name='朝向')
    floor = models.CharField(max_length=60, verbose_name='朝向')
    year = models.CharField(max_length=10, verbose_name='年份')
    location = models.CharField(max_length=10, verbose_name='位置')
    total_price = models.IntegerField(verbose_name='总结(万元)')
    unit_price = models.IntegerField(verbose_name='单价(元/平方米)')

    add_date = models.DateTimeField(auto_now_add=True, verbose_name="创建日期")
    mod_date = models.DateTimeField(auto_now=True, verbose_name="修改日期")

    def __str__(self):
        return "{}-{}-{}".format(self.house,self.bedroom, self.total_price)

    class Meta:
        verbose_name = "二手房"

在本例中我们对于面积和年份字段使用了C