当前位置: 澳门新濠3559 > 编程 > 正文

包括下载Django进行安装.并且网站无需其它额外的

时间:2019-11-29 05:50来源:编程
项目:爬取房天下网站全国所有城市的新房和二手房信息 Django项目初步设置与部署 利用django-admin startproject website进行网站项目创建。 创建项目.png 进入website文件夹,在这里打开命令行

项目:爬取房天下网站全国所有城市的新房和二手房信息

Django项目初步设置与部署

利用django-admin startproject website进行网站项目创建。

澳门新濠3559 1

创建项目.png

进入website文件夹,在这里打开命令行。在命令行上输入manage.py startapp blog,这条命令说明我们需要建设一个真正的网站,该网站的名字为blog。

澳门新濠3559 2

创建blog项目

到此为止其实一个网站的基础已经搭建起来。我们可以看到里面的文件分别为: --init --.py、settings.py、urls.py、wsgi.py。

以前用织梦、discuz等网站程序搭建博客一个网站几分钟就搞定,这种网站开发简易但受限也比较多,对于要求不高的简单网站来说还是可以的,但要做一个符合要求又高效的网站似乎还是用框架开发比较合适。Django是一个公认的高效又好用的Web开发框架,故选之作为学习对象。

转自()

前面写了不少python程序,由于之前都是作为工具用,所以命令行就足够了,最近写的测试用例牵涉到了很多很多的交互,并且需要上传很多的数据才能进一步测试,用命令行不太合适,用其自带的UI觉得也不好,没有js那些通用,然后便来看Django,发现果如别人所说,写网页的话php还是最容易的,虽然这个也很简单.

测试通过,搭建第一个网站应该是十分钟以内的,包括下载Django进行安装.并且网站无需其它额外的东西,自身就可以作为网站服务器运行,这点比phpNb

本章我们将介绍Django 管理工具及如何使用 Django 来创建项目,第一个项目我们以 HelloWorld 来命令项目。


网站url分析

下面我们会对其一步步的深入:


Django 管理工具

安装 Django 之后,您现在应该已经有了可用的管理工具 django-admin.py。我们可以使用 django-admin.py 来创建一个项目:

我们可以来看下django-admin.py的命令介绍:

[root@solar ~]# django-admin.py
Usage: django-admin.py subcommand [options] [args]

Options:
  -v VERBOSITY, --verbosity=VERBOSITY
                        Verbosity level; 0=minimal output, 1=normal output,
                        2=verbose output, 3=very verbose output
  --settings=SETTINGS   The Python path to a settings module, e.g.
                        "myproject.settings.main". If this isn't provided, the
                        DJANGO_SETTINGS_MODULE environment variable will be
                        used.
  --pythonpath=PYTHONPATH
                        A directory to add to the Python path, e.g.
                        "/home/djangoprojects/myproject".
  --traceback           Raise on exception
  --version             show program's version number and exit
  -h, --help            show this help message and exit

Type 'django-admin.py help <subcommand>' for help on a specific subcommand.

Available subcommands:

[django]
    check
    cleanup
    compilemessages
    createcachetable
……省略部分……

1.获取所有城市url

   http://www.fang.com/SoufunFamily.htm

    例如:http://cq.fang.com/

2.新房url

  http://newhouse.sh.fang.com/house/s/

3.二手房url

  http://esf.sh.fang.com/

4.北京新房和二手房url规则不同

   http://newhouse.fang.com/house/s/

   http://esf.fang.com/

1.对setting文件进行修改

  • 包括下载Django进行安装.并且网站无需其它额外的东西,在命令行上输入manage.py startapp。修改地区语种
![](https://upload-images.jianshu.io/upload_images/3960436-2cbd6cb52b2d3381.png)

地区 语种修改
  • 增加blog网站

澳门新濠3559 3

增加blog

闲话少说,进入正题!在Window上Django安装方法:直接pip django进行Django框架安装,整个过程大概数分钟。安装好Django后创建一个网站项目cmd下将要放项目的文件路径cd进命令里,再输入命令:python  django startproject对应项目文件夹里就创建好一个项目所需的文件。里面的重要的几个文件有url.py  manage.py,其中大部分命令是manage.py在负责,url.py里则存放网站所有的url信息。创建app,在Pycharm中,输入命令python manage.py startapp +对应的app名字,即在项目文件夹里有了创建app所需的文件,其中重要的文件有,views.py、models.py  ,models.py,admin.py负责与数据库打交道,在model里创建类代码如下:

创建第一个项目

使用 django-admin.py 来创建 HelloWorld 项目:

django-admin.py startproject HelloWorld

创建完成后我们可以查看下项目的目录结构:

[root@solar ~]# cd HelloWorld/
[root@solar HelloWorld]# tree
.
|-- HelloWorld
|   |-- __init__.py
|   |-- settings.py
|   |-- urls.py
|   `-- wsgi.py
`-- manage.py

目录说明:

  • HelloWorld: 项目的容器。
  • manage.py: 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。
  • HelloWorld/__init__.py: 一个空文件,告诉 Python 该目录是一个 Python 包。
  • HelloWorld/settings.py: 该 Django 项目的设置/配置。
  • HelloWorld/urls.py: 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"。
  • HelloWorld/wsgi.py: 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。

接下来我们进入 HelloWorld 目录输入以下命令,启动服务器:

python manage.py runserver 0.0.0.0:8000

0.0.0.0让其它电脑可连接到开发服务器,8000为端口号。如果不说明,那么端口号默认为8000。

在浏览器输入你服务器的ip及端口号,如果正常启动,输出结果如下:

澳门新濠3559 4

创建项目

2.我们进入urls.py进行修改:

澳门新濠3559 5

urls.py初始界面

我们再次增加一条代码。

url(r'^blog/index/$','blog.views.index'),

(这是一个正则表达式,是为了我们在浏览器中输入地址进行匹配的。具体的正则表达式抽时间再进行整理)

澳门新濠3559 6

urls.py

class people models.Modle:

视图和 URL 配置

在先前创建的 HelloWorld 目录下的 HelloWorld 目录新建一个 view.py 文件,并输入代码:

from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hello world ! ")

接着,绑定 URL 与视图函数。打开 urls.py 文件,删除原来代码,将以下代码复制粘贴到 urls.py 文件中:

from django.conf.urls import *
from HelloWorld.view import hello

urlpatterns = patterns("",
    ('^hello/$', hello),
)

整个目录结构如下:

[root@solar HelloWorld]# tree
.
|-- HelloWorld
|   |-- __init__.py
|   |-- __init__.pyc
|   |-- settings.py
|   |-- settings.pyc
|   |-- urls.py              # url 配置
|   |-- urls.pyc
|   |-- view.py              # 添加的视图文件
|   |-- view.pyc             # 编译后的视图文件
|   |-- wsgi.py
|   `-- wsgi.pyc
`-- manage.py

完成后,启动 Django 开发服务器,并在浏览器访问打开浏览器并访问:

澳门新濠3559 7

注意:项目中如果代码有改动,服务器会自动监测代码的改动并自动重新载入,所以如果你已经启动了服务器则不需手动重启。

scrapy startproject fang

scrapy genspider sfw_spider "fang.com"

3.已经定义好了urls.py后,我们从刚的式子可以看出我们用一个正则表达式匹配了浏览器输入的地址,后接受这个请求需要返回'blog.views.index'这个视图函数。所以我们在views.py中进行定义一个index。

修改过过程为:

# Create your views here.
from django.http import HttpResponse
from django.template import loader,Context

#creat the function index:
def index(request):
    t = loader.get_template("index.html")//接受请求后返回index.html
    c = Context({})//在这里进行设置器html页面规定的模板变量
    return HttpResponse(t.render(c))//通过渲染后进行返回

        name=models.CharF**()

sfw_spider.py

4.创建了模板模式,blog/templates/index.html

我们在blog文件下创建templates文件夹,这个文件夹保存需要返回的模板网页。我们创建相应的index.html。

我们输入一句测试语句:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <h1>hello {{name}}!</h1>
</body>
</html>

在这里我们可以看到{{name}},在两个花括号里的就是一个模板变量,下面我们会详细讲解
在views.py我们进行模板变量的赋值:

def index(request):
    t = loader.get_template("index.html")
    name ='world'
    c = Context({"name":name})
    return HttpResponse(t.render(c))

一个类对应数据库里的一张表,在类下创建的实例就是数据库中表的字段

# -*- coding: utf-8 -*-
import scrapy
import re
from fang.items import NewHouseItem,ESFHouseItem

class SfwSpiderSpider(scrapy.Spider):
    name = 'sfw_spider'
    allowed_domains = ['fang.com']
    start_urls = ['http://www.fang.com/SoufunFamily.htm']

    def parse(self, response):
        trs = response.xpath("//div[@class='outCont']//tr")
        provice = None
        for tr in trs:
            #排除掉第一个td,两个第二个和第三个td标签
            tds = tr.xpath(".//td[not(@class)]")
            provice_td = tds[0]
            provice_text = provice_td.xpath(".//text()").get()
            #如果第二个td里面是空值,则使用上个td的省份的值
            provice_text = re.sub(r"s","",provice_text)
            if provice_text:
                provice = provice_text
            #排除海外城市
            if provice == '其它':
                continue

            city_td = tds[1]
            city_links = city_td.xpath(".//a")
            for city_link in city_links:
                city = city_link.xpath(".//text()").get()
                city_url = city_link.xpath(".//@href").get()
                # print("省份:",provice)
                # print("城市:",city)
                # print("城市链接:",city_url)
                #下面通过获取的city_url拼接出新房和二手房的url链接
                #城市url:http://cq.fang.com/
                #新房url:http://newhouse.cq.fang.com/house/s/
                #二手房:http://esf.cq.fang.com/
                url_module = city_url.split("//")
                scheme = url_module[0]     #http:
                domain = url_module[1]     #cq.fang.com/
                if 'bj' in domain:
                    newhouse_url = ' http://newhouse.fang.com/house/s/'
                    esf_url = ' http://esf.fang.com/'
                else:
                    #新房url
                    newhouse_url = scheme + '//' + "newhouse." + domain + "house/s/"
                    #二手房url
                    esf_url = scheme + '//' + "esf." + domain + "house/s/"
                # print("新房链接:",newhouse_url)
                # print("二手房链接:",esf_url)

                #meta里面可以携带一些参数信息放到Request里面,在callback函数里面通过response获取
                yield scrapy.Request(url=newhouse_url,
                                     callback=self.parse_newhouse,
                                     meta = {'info':(provice,city)}
                                     )

                yield scrapy.Request(url=esf_url,
                                     callback=self.parse_esf,
                                     meta={'info': (provice, city)})


    def parse_newhouse(self,response):
        #新房
        provice,city = response.meta.get('info')
        lis = response.xpath("//div[contains(@class,'nl_con')]/ul/li")
        for li in lis:
            name = li.xpath(".//div[contains(@class,'house_value')]//div[@class='nlcd_name']/a/text()").get()
            if name:
                name = re.sub(r"s","",name)
                #居室
                house_type_list = li.xpath(".//div[contains(@class,'house_type')]/a/text()").getall()
                house_type_list = list(map(lambda x:re.sub(r"s","",x),house_type_list))
                rooms = list(filter(lambda x:x.endswith("居"),house_type_list))
                #面积
                area = "".join(li.xpath(".//div[contains(@class,'house_type')]/text()").getall())
                area = re.sub(r"s|-|/","",area)
                #地址
                address = li.xpath(".//div[@class='address']/a/@title").get()
                address = re.sub(r"[请选择]","",address)
                sale = li.xpath(".//div[contains(@class,'fangyuan')]/span/text()").get()
                price = "".join(li.xpath(".//div[@class='nhouse_price']//text()").getall())
                price = re.sub(r"s|广告","",price)
                #详情页url
                origin_url = li.xpath(".//div[@class='nlcd_name']/a/@href").get()

                item = NewHouseItem(
                    name=name,
                    rooms=rooms,
                    area=area,
                    address=address,
                    sale=sale,
                    price=price,
                    origin_url=origin_url,
                    provice=provice,
                    city=city
                )
                yield item

        #下一页
        next_url = response.xpath("//div[@class='page']//a[@class='next']/@href").get()
        if next_url:
            yield scrapy.Request(url=response.urljoin(next_url),
                                 callback=self.parse_newhouse,
                                 meta={'info': (provice, city)}
                                 )


    def parse_esf(self,response):
        #二手房
        provice, city = response.meta.get('info')
        dls = response.xpath("//div[@class='shop_list shop_list_4']/dl")
        for dl in dls:
            item = ESFHouseItem(provice=provice,city=city)
            name = dl.xpath(".//span[@class='tit_shop']/text()").get()
            if name:
                infos = dl.xpath(".//p[@class='tel_shop']/text()").getall()
                infos = list(map(lambda x:re.sub(r"s","",x),infos))
                for info in infos:
                    if "厅" in info:
                        item["rooms"] = info
                    elif '层' in info:
                        item["floor"] = info
                    elif '向' in info:
                        item['toward'] = info
                    elif '㎡' in info:
                        item['area'] = info
                    elif '年建' in info:
                        item['year'] = re.sub("年建","",info)
                item['address'] = dl.xpath(".//p[@class='add_shop']/span/text()").get()
                #总价
                item['price'] = "".join(dl.xpath(".//span[@class='red']//text()").getall())
                #单价
                item['unit'] = dl.xpath(".//dd[@class='price_right']/span[2]/text()").get()
                item['name'] = name
                detail = dl.xpath(".//h4[@class='clearfix']/a/@href").get()
                item['origin_url'] = response.urljoin(detail)
                yield item
        #下一页
        next_url = response.xpath("//div[@class='page_al']/p/a/@href").get()
        if next_url:
            yield scrapy.Request(url=response.urljoin(next_url),
                                 callback=self.parse_esf,
                                 meta={'info': (provice, city)}
                                 )

5.最后一步我们在命令行中输入 manage.py runserver,这行命令启动django内置的服务器,我们输入相应的网址可以进行对我们建设的网站进行访问。访问结果如下:

澳门新濠3559 8

澳门新濠3559,访问成功

数据模型很重要。。。

items.py

views.py负责接受前端用户提交的请求,并负责将数据回应给用户,基本的过程是接收一个request,返回一个respone,而一个过程中要接收请求后要对请求进行判断,不同的请求决定从数据库中调用不同的数据,进行上下文,并渲染到对应的模板里,渲染后的对象作为返回值。

# -*- coding: utf-8 -*-

import scrapy

class NewHouseItem(scrapy.Item):
    #省份
    provice = scrapy.Field()
    # 城市
    city = scrapy.Field()
    # 小区
    name = scrapy.Field()
    # 价格
    price = scrapy.Field()
    # 几居,是个列表
    rooms = scrapy.Field()
    # 面积
    area = scrapy.Field()
    # 地址
    address = scrapy.Field()
    # 是否在售
    sale = scrapy.Field()
    # 房天下详情页面的url
    origin_url = scrapy.Field()

class ESFHouseItem(scrapy.Item):
    # 省份
    provice = scrapy.Field()
    # 城市
    city = scrapy.Field()
    # 小区名字
    name = scrapy.Field()
    # 几室几厅
    rooms = scrapy.Field()
    # 层
    floor = scrapy.Field()
    # 朝向
    toward = scrapy.Field()
    # 年代
    year = scrapy.Field()
    # 地址
    address = scrapy.Field()
    # 建筑面积
    area = scrapy.Field()
    # 总价
    price = scrapy.Field()
    # 单价
    unit = scrapy.Field()
    # 详情页url
    origin_url = scrapy.Field()

模板层中几个要点:变量表示{{  }}  标签  {%  %} 过滤器{  |  }

pipelines.py

。。。。。

# -*- coding: utf-8 -*-

from scrapy.exporters import JsonLinesItemExporter

class FangPipeline(object):
    def __init__(self):
        self.newhouse_fp = open('newhouse.json','wb')
        self.esfhouse_fp = open('esfhouse.json','wb')
        self.newhouse_exporter = JsonLinesItemExporter(self.newhouse_fp,ensure_ascii=False)
        self.esfhouse_exporter = JsonLinesItemExporter(self.esfhouse_fp,ensure_ascii=False)

    def process_item(self, item, spider):
        self.newhouse_exporter.export_item(item)
        self.esfhouse_exporter.export_item(item)
        return item

    def close_spider(self,spider):
        self.newhouse_fp.close()
        self.esfhouse_fp.close()

middleware.py 设置随机User-Agent

# -*- coding: utf-8 -*-

import random

class UserAgentDownloadMiddleware(object):
    USER_AGENTS = [
        'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36',
        'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0 ',
        'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36',
        'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER',
    ]

    def process_request(self,request,spider):
        user_agent = random.choice(self.USER_AGENTS)
        request.headers['User-Agent'] = user_agent

settings.py

ROBOTSTXT_OBEY = False

DOWNLOAD_DELAY = 1

DOWNLOADER_MIDDLEWARES = {
   'fang.middlewares.UserAgentDownloadMiddleware': 543,
}

ITEM_PIPELINES = {
   'fang.pipelines.FangPipeline': 300,
}

start.py

from scrapy import cmdline

cmdline.execute("scrapy crawl sfw_spider".split())

 

编辑:编程 本文来源:包括下载Django进行安装.并且网站无需其它额外的

关键词: