Django:Python 爬虫抓取上海二手房信息,将其存储到数据库中,并在前端显示。
好久没写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