A Song of Python and Anaconda


  • Startseite

  • Archiv

  • Tags

HTML基础学习小结

Veröffentlicht am 2016-09-09

说明:以下内容学习自:http://www.w3school.com.cn/

1、
以下记录了一些常用的html元素,块,类,第一个是html和head,用来申明是html文件,以及head部分的代码:

2、
h1 定义标题的开始

3、
body 定义 HTML 文档的主体

4、
P表示段落

5、
table 定义 HTML 表格

6、
a 用来定义链接,如下代码

<a href="http://www.w3school.com.cn">This is a link</a>

7、

img 定义图像如下代码

<img src="w3school.jpg" width="104" height="142" />

8、

无序列表始于 ul 标签。每个列表项始于 li。代码和效果如下:

<ul>
  <li>咖啡</li>
  <li>茶</li>
  <li>牛奶</li>
</ul>

  • 咖啡

  • 茶

  • 牛奶

9、div是块级元素,它是可用于组合其他 HTML 元素的容器,浏览器通常会在 div 元素前后放置一个换行符。另一个常见的用途是文档布局。它取代了使用表格定义布局的老式方法,感觉可以理解成一个函数或集合。举例:

<div style="color:#00FF00">
<h3>This is a header</h3>
<p>This is a paragraph.</p>
</div>

This is a header


This is a paragraph.


10、 span 元素,然后对这个 span 元素的父元素,即 p 元素应用 class,这样就可以对这个类的子元素 span 应用相应的样式了。

<p class="tip"><span>提示:</span>... ... ...</p>

或者CSS:

p.tip span {
        font-weight:bold;
        color:#ff9955;
}

11、类的概念,以div的一段代码为例,可以发现,在head部分定义了一个cities的类,然后div引用了这个类,作用是把背景设置为黑色,字体为白色,margin和padding都设置为20px,另外类引用到span也是差不多的,形如:

<!DOCTYPE html>
<html>
<head>
<style>
.cities {
    background-color:black;
    color:white;
    margin:20px;
    padding:20px;
}    
</style>
</head>

<body>

<div class="cities">
<h2>London</h2>

<p>London is the capital city of England. It is the most populous city in the United Kingdom, with a metropolitan area of over 13 million inhabitants.</p>

<p>Standing on the River Thames, London has been a major settlement for two millennia, its history going back to its founding by the Romans, who named it Londinium.</p>
</div> 

</body>
</html>

12、布局,用一张图来体验下,其实就是一些文字+底色的布局,但是看上去有点大气,用到了#符号,以及
div id=”header”这样的形式,也就是css里的id选择器,具体代码参考这里【点我】

13、响应式设计,明显感觉Bootstrap的模式要好,所以省略。

14、框架:frameset 可以在同一个浏览器窗口中显示不止一个页面。

15、内联框架 iframe

16、背景,一个是背景颜色,形如:body bgcolor=”#000000” 一个是背景图,形如 body background=”http://www.w3school.com.cn/clouds.gif“

17、脚本:JavaScript 使 HTML 页面具有更强的动态和交互性。

18、实体,关于一些特殊符号在html的格式,参考此链接【点我】

19、颜色,列表出了一些常用颜色 ,其列出的一些配色,作为底色感觉不错,参考此链接【点我】 以及这个网址【点我】

Linux的历史和HTML学习的必要

Veröffentlicht am 2016-09-09

本来想看《鸟哥的Linux私房菜》,可一看要1774页,顿时伤感啊有木有。先看看开始部分吧,讲解了Unix系统的来龙去脉以及Linux的诞生历史等。写的还是挺详细的。那时候的系统界面看着真是古董,然后鼠标拖到最后,进入了现在的Linux的Shell界面,竟然有一丝激动。

这几天看了点爬虫的知识,感觉就是看别人的HTML分析部分很easy的样子,但自己看的总是有点云里雾里的。。。

所以奔着有问题解决问题先的思路,先暂停Linux书籍,而是先看HTML了。

那么,推荐下较有人气的W3school【点我】

beautiful soup+ Xpath的基础操作

Veröffentlicht am 2016-09-07

Beautiful Soup 是 python 的一个库,最主要的功能是从网页抓取数据,BS4是Beautiful Soup V4.x的简称。
为什么选用BS4呢? 可以尽可能的规避复杂的正则表达式RE。 而功能上,配合requests也是相当好的。

官方的中文教程可参考此链接【点我】

而另一篇博客写的更细致,可参考【转载请注明:静觅 » Python爬虫利器二之Beautiful Soup的用法

以下是分别通过BS4和Xpath方式得到的简书网的首页“热门”的20偏文章的标题

完整的代码如下:

#coding:utf-8

import re
import urllib
from bs4 import BeautifulSoup
import time
from lxml import etree

def getHtml(url):
    page = urllib.urlopen(url)
    html = page.read()
    return html

html = getHtml("http://www.jianshu.com")

#html 是爬取的网页源代码, 将一段文档传入BeautifulSoup 的构造方法,就能得到一个文档的对象
soup = BeautifulSoup(html,'html.parser',from_encoding='utf-8')
#查找所有的h4标签 
links = soup.find_all("h4")

for link in links:
    print link


time.sleep(5)



selector = etree.HTML(html)
links = selector.xpath('//h4/a/text()')
for link in links:
    print link

说明:其中需要会查阅HTML的基础技巧,用一个图动图(来自本文末尾的文章)来概括:

不过第一个方法,显示的是乱码,但是一开始就规定了UTF8格式,原因待定。如图:

参考:向右奔跑的文章【点我】

《Http权威指南》 完整版 书籍下载和推荐

Veröffentlicht am 2016-09-07

下载地址【点我】:

说明:全文主要目录:

可参考:百科地址【点我】

Win7安装Scrapy的一些坑

Veröffentlicht am 2016-09-07

症状:无论Win 7 还是Ubuntu,一开始安装都出错了。

提示一些安装包,需要安装VC++ 9.0 。

error: Microsoft Visual C++ 9.0 is required. Get it from http://aka.ms/vcpython27

意思是:Micorsoft Visual C++ Compiler for Python 2.7 到了微软官网,点了下载按钮,就进入界面死循环了。。。 想想微软也不至于这么坑,然后换了一个电脑可以下载了,似乎是第一个电脑的火狐浏览器没有对下载地址进行响应。

安装之后,又跳出了以下界面的错误:

make sure the development packages of libxml2 and libxslt are installed

*********************************************************************************
Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed?
*********************************************************************************
error: command 'C:\\Users\\Administrator.USER-20160103QG\\AppData\\Local\\Programs\\Common\\Microsoft\\Visual C++ for Python\\9.0\\VC\\Bin\\cl.exe' failed with exit status 2

----------------------------------------

Command “c:\python27\python.exe -u -c “import setuptools, tokenize;file=’c:\users\admini~1.use\appdata\local\temp\pip-build-u4tij9\lxml\setup.py’;exec(compile(getattr(tokenize, ‘open’, open)(file).read().replace(‘\r\n’, ‘\n’), file, ‘exec’))” install –record c:\users\admini~1.use\appdata\local\temp\pip-ywtnot-record\install-record.txt –single-version-externally-managed –compile” failed with error code 1 in c:\users\admini~1.use\appdata\local\temp\pip-build-u4tij9\lxml\

从上面的信息看:基于lxml的libxml2 and libxslt这两个包需要安装,但pip install lxml 也是错误提示,依然有需要安装VC++的提示,可刚不是装过了吗?。。。。 想了下 之前有装另外一个版本,所以刚是repair的方式,干脆卸载了重新装一次看看?结果一样错误。

到知乎上:
深海鱼
77 人赞同
刚从这个大坑里爬出来:

  1. 安装wheel,命令行运行:
    pip install wheel
    2.在这里下载对应的.whl文件,注意别改文件名! http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml
  2. 进入.whl所在的文件夹,执行命令即可完成安装
    pip install 带后缀的完整文件名

对应操作,结果也失败了,如下:

attempt to call a nil value
C:\Python27\Scripts>pip install lxml-3.6.4-cp27-cp27m-win_amd64.whl
Processing lxml-3.6.4-cp27-cp27m-win_amd64.whl
error: Couldn't find a setup script in C:\Python27\Scripts\lxml-3.6.4-cp27-cp27m-win_amd64.whl

这错误提示需要一个安装脚本,可下载的是一个单独的whl文件,这。。。

后来我换了一个路径,把whl文件放到了C盘根目录,测试:

attempt to call a nil value
C:\>pip install lxml-3.6.4-cp27-cp27m-win_amd64.whl
lxml-3.6.4-cp27-cp27m-win_amd64.whl is not a supported wheel on this platform.

此时的提示是:此平台不支持这个whl文件。

那么思考:下载的是64位的whl,系统也是Win7 64位的,但是等等,Python是32位的? 果然经过核对,原来这个Python版本是老早刚学的时候一直用的32位的,于是,马上更换下载 lxml-3.6.4-cp27-cp27m-win32.whl,然后继续安装,得到ok的结果,如下:

attempt to call a nil value
C:\>pip install lxml-3.6.4-cp27-cp27m-win32.whl
Processing c:\lxml-3.6.4-cp27-cp27m-win32.whl
Installing collected packages: lxml
Successfully installed lxml-3.6.4

然后继续运行安装scrapy 搞定!

总结:
1、后来查了lxml的官网,http://lxml.de/installation.html 上面也有说道win系统的安装错误的非官方方案,其实就是知乎上的那个方案,不过官网上没写whl文件怎么安装,但可以搜索到。

2、64位还是32位?
因为系统是64位的,所以一般情况下载都已经习惯找64位的下,本篇开头就是。但是针对python安装的第三方库,需要根据python是32位还是64位来,而本篇恰巧是32位的python,以后注意。

推荐Tornado的中文教程

Veröffentlicht am 2016-09-06

查阅地址为:【点我】

这份教程讲解的比较详细,可以看看。

引入模块

import tornado.httpserver

import tornado.ioloop

import tornado.options

import tornado.web

这四个都是Tornado的模块。它们四个在一般的网站开发中,都要用到,基本作用分别是:

  • tornado.httpserver:这个模块就是用来解决web服务器的http协议问题,它提供了不少属性方法,实现客户端和服务器端的互通。Tornado的非阻塞、单线程的特点在这个模块中体现。
  • tornado.ioloop:这个也非常重要,能够实现非阻塞socket循环,不能互通一次就结束。
  • tornado.options:这是命令行解析模块,也常用到。
  • tornado.web:这是必不可少的模块,它提供了一个简单的Web框架与异步功能,从而使其扩展到大量打开的连接,使其成为理想的长轮询。

一些知识点:

1、class IndexHandler():

这个类是请求处理程序类,那么就最好用Handler结尾,这样在名称上很明确,是干什么的。

2、前端后端的数据连接:通过ajax提交到了后端,后端借助于get_argument()方法得到了所提交的数据(用户名和密码)。

Hexo模版一个bug的发现和记录

Veröffentlicht am 2016-09-05

上图中我在文章中输入的,竟然引发了Hexo的 Hexo g 命令的异常报错:

FATAL [Line xx, Column yy]
unknown block tag: load

在Hexo官网上,现在也没找到到底如何解决,以及具体的原因,只能猜测是引发了内置函数的冲突。

在数千字的文章中定位找到这个bug ,也是花了点时间。 不过好在定位出来了。 这是第一次遇到在文章中,而非源代码,也能引发bug,一开始没想到会这样,后来想了下其原理应该是在内容更新前,Hexo会扫描发布内容中所含有的代码类,这一次很不幸引发了冲突。

Windows下Python+Django制作网站的方法(2)

Veröffentlicht am 2016-09-05

接上一篇【点我】

8、导入到数据库

在数据没有导入到数据库之前,的数据表是0,如下图:

所以我们需要把数据导入到数据库:
$ python manage.py migrate

然后刷新数据库,此时,数据表的数量更新到了10,表示数据导入了。

但是仔细看,发现这些都是系统自带的,我们自己定义的模型,怎么不显示呢?
原来,在导入数据库之前,虽然我们更新了models.py的代码,但是数据库还没记录,为此,还有一个命令,是需要把修改的模型,更新到blog migrations的文件夹里,然后再导入到数据库。

输入命令:
$ python manage.py makemigrations blog

其中,blog是定义的app的名字,发现C:\XXXX\django1\blog\migrations路径下,多了一个0001_initial的文件,如下图:

再次把更新后数据导入到数据库:
$ python manage.py migrate

再次刷新数据库,发现数据表从10变成了11,多了一个我们自己定义的article,那为何显示的是article,而不是blog呢?这是因为blog是定义的app的名字,而在数据库相关的代码中,在class Meta部分,定义的名字是article,对应的代码是:db_table = ‘article’。

基于以上经验,以后牵涉数据的操作,可考虑先运行makeigrations命令,再运行migrate命令。xxx表示对应app名字。
$ python manage.py makemigrations xxx
$ python manage.py migrate

9、修改首页和页面模版

之前我们打开本地首页,出现的是It works字样,是系统自带的。既然要做自己的站点如blog,那自然是需要修改的,以下是最简单的举例。
首先我们查看Django官网的关于views的说明,地址为:
https://docs.djangoproject.com/en/1.10/topics/http/views/
打开 C:\XXXX\django1\blog 路径下的views.py文件,修改代码为:

from django.shortcuts import render
from django.http import HttpResponse
import datetime

# Create your views here.
def home(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)`

由于打开url的时候,当views的改变也需要在url联动配置修改,故打开C:\XXXX\django1\django1 路径下的urls.py文件,修改代码为:
from django.conf.urls import url
from django.contrib import admin
from blog import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', views.home),
]`

注意到:上述修改的代码里,已经牵涉了HTML语言,当然这里很简单。
此时,在浏览器输入:http://localhost:8000/,如下图显示的是自定义的当前时间:

此时问题来了,怎么看都感觉HTML语言写起来比Python的代码要复杂,尤其是如果页面的内容繁多,那不是要写成马了?所以,我们需要用到模版功能。
到C:\XXXX\django1\blog 路径下,新建名为:templates的文件夹,注意这个名字是Django默认的,所以不要自定义其他名称。
关于模版,一种是引用别人的模版,一些优秀的模版用和看起来都很舒服。
这里演示自己创建一个简易模版。方法为:
在Sublime Text 的File中新建一个文件,把代码:

It is now, now or not?

复制进去,然后保存到C:\XXXX\django1\blog\templates 路径,Sublime Text会识别成后缀为html的文件,这样就是一个html语言的模版了,注意特意增加了:now or not?字样用于和之前的方法比对。
接下来,为了方便,我们可以使用render()函数。网址为:
https://docs.djangoproject.com/en/1.10/topics/http/shortcuts/

这样,views.py文件的home函数也修改成了:

def home(request):

    return render(request, 'home.html')

然后我们发现,本地首页跟着改变了:

Tips:一些调试错误的小技巧
views.py增加的函数,需要在urls.py进行导入和更新操作,模版制定后,为了尝试增加或者修改内容,可能引起意外的404错误,所以,最好单独备份一份正常的模版。

10、页面模板之Bootstrap

现在的页面模板其实是一个Python功能模块,里面的各种参数用Python语法加以逻辑处理,就可以做到一个html文件模板呈现出不同的内容。
但是和其他漂亮的网站比,虽然我们已经学会让网页上输出一些文字,但很空洞。
而且无论如何,即便后续在页面增加了一些文章,图片等,相对于在后端写代码来实现网页功能来说,对于前端的网页美观显示还是要额外花销很多时间,诸如如何排版布局、文字样式、图片增强效果等。好在有像Bootstrap这样的模版工具(推特的工程师制作),可以直接使用就有很好的效果。
当下载好Bootstrap之后,发现解压后只有1M大小,里面有3个文件夹,css、fonts和js。

到了这一步,我们就开始接触到css的概念。那么百科下:

http://baike.baidu.com/link?url=3MtvIxATwYtq7W77zMM0wEjiXUJ2MSONA38Qws-szl93UFSpmHSSa9r5QFae9Hfg7_0xFjueevoKAdgEAJ_Dvq4Drvs-_M2GRB1WWXgujjm

我们暂时有这个印象,网页技术的前端基本基于:html+css
在这里,需要强调下Django的setting.py文件的重要性,这相当于是他的系统设置核心,当我们要进行添加功能的时候,基本都要牵涉修改setting.py的代码,比如在第6部分中,我们修改了DATABASES 和INSTALLED_APPS部分的代码。
如果我们在setting.py搜索关键词:css,在代码的末尾,写到:

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.10/howto/static-files/

STATIC_URL = '/static/'

那么我们就打开他提供的网址,去看看官网的说明:

https://docs.djangoproject.com/en/1.10/howto/static-files/

官网提示,当牵涉urls的时候,需要修改如下图:

于是,我们可把2行import的代码添加到urls.py中,同时不要忘记urlpatterns部分的代码也要跟着改进。此时,我们的urls.py的代码为:

from django.conf.urls import url
from django.contrib import admin
from blog import views
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', views.home),`

] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

接下来,根据官网要求C:\XXXX\django1\blog\ 路径下,也就是在app的目录下建立static的文件夹,并把我们下载解压的Bootstrap的3个文件夹放到static路径。

并从网上下载一个Bootstrap的模版范例,把对应的images文件和xxx.html文件一起放到C:\xxxx\django1\blog\templates 路径。
首先直接双击打开里面的index.html,可以看到浏览器显示的地址是:file:///C:/xxx/mysite/blog/templates/index.html
现在想在localhost:8000下,也显示相同的内容。
首先打开views.py,把home改成index,因为我们一开始的主页名字定义为home,而现在模版的首页名字是index。但是当我们回车,发现界面如下:

并且,根据要求,我们把带有link href 后面的代码,根据上图都修改成形如下面的语句(红色加粗为添加的):

<link href="{% static "css/bootstrap.css" %}" rel="stylesheet" type="text/css" media="all">

最后,我们就得到了和直接双击index.html一样的效果,如下图(中文是我添加,为庆祝女排奥运夺冠):

也许你会说,这网页也不是很漂亮啊,其实这里主要是选了一个简单的网页模版,
用来示范操作的,可以谷歌到很多精彩的bootstrap的框架模版,但如果要修改成自己的,
也是需要在HTML里修改不少内容,再加上本身我对前端的知识也比较有限。
到这里,就完成了Python+Django实现网站的教程了。
当然要做一个内容较多的网站还是需要很多后续工作的。 ”——)

11 参考: fanhuaxiu.com

Windows下Python+Django制作网站的方法(1)

Veröffentlicht am 2016-09-05

简介:

Python是很不错的编程语言,Django是基于Python的web框架,Postgresql是数据库, Psycopg用来给Python和Postgresql的一个桥接的工具,Bootstrap是模版工具。全文需要英语基础。

Django应用是如何工作的?

用户在浏览器中输入URL后回车, 浏览器会对URL进行检查, 首先判断协议,如果是http就按照 Web 来处理, 然互调用DNS查询, 将域名转换为IP地址, 然后经过网络传输到达对应Web服务器, 服务器对url进行解析后, 调用View中的逻辑(MTV中的V), 其中又涉及到Model(MTV中的M), 与数据库的进行交互, 将数据发到Template(MTV中的T)进行渲染, 然后发送到浏览器中, 浏览器以合适的方式呈现给用户
大致工作流程就是这样,从流程可以看出,我们需要做的就是:

  • 编写相应的 url
  • 编写数据库(Model
  • 编写处理 Http 请求的视图函数(View)
  • 编写需要渲染的模板(Template)

软件版本和官网:

  • Python V3.5.2 官网:www.python.org
  • Django V1.10 官网:www.djangoproject.com
  • Postgresql V9.5.4 官网: www.postgresql.org
  • Psycopg V2.6.2 官网:http://initd.org/psycopg/
  • Bootstrap V3.3.5 官网:http://www.bootcss.com/

说明:$开头的命令是在CMD窗口下,

>>>的命令表示Python在调试窗口的命令。

没有的开头符号的表示在.py文件里的代码 ##

1、 创建虚拟环境

为了防止后续Django版本升级带来的可能的兼容性问题,首先创建一个新的操作环境,其实就是一个单独的文件夹。打开CMD窗口,使用cd..命令退到C盘根目录,创建一个自定义名字的文件夹,这里以test1命名。可自定义其他名字,那样请在此文后续有test1的地方都替换成你的命名:
$ python –m venv test1
$ cd test1
$ cd Scripts
$ activate.bat

说明:
venv是Python V3版本后才有的,如果V2版本不支持。可以看到创建的test1文件夹里面有4个文件,其中一个是Scripts,代表Python的脚本文件。最后你的Dos路径前面会有(test1)的字样,表示虚拟环境创建成功。
也可用pip freeze 命令来检测当前路径下安装的库,可以和Python真实安装路径对比,当然这一步可忽略。

2、安装Django

$ pip install django

3、 创建工程

在test1文件夹路径下,输入:
$ django-admin startproject django1
这就创建了一个名字为django1的工程,其实就是一个网站,注意可自定义名字替换掉django1,但取名不要和python内置函数冲突。
如果在电脑里查看,则在test1文件夹里多了一个django1的文件夹,当打开django1文件夹,里面有一个manager.py和django1的文件夹,包含4个文件。

4、运行网站

$ cd django1
$ python manage.py runserver
到浏览器中输入 : localhost:8000 或者127.0.0.1:8000,当出现It worked!字样,则成功。从输入网址,到出现界面的这个角度,你已经有一个网站了,虽然里面没什么内容,也许你会说,这也叫网站?别着急,内容会在后续慢慢添加。

Tips:
Django官网的文档给出了详细的说明,英文,网址:https://docs.djangoproject.com/en/1.10/intro/tutorial01/

5、创建app

这里命名为blog,可自定义。
$ python manage.py startapp blog
可以看到会多了一个blog的文件夹,里面有一个migrations文件夹和一些py文件。
同时,我们应该修改setting.py文件的app部分的代码,放在第6部分讲解。

6、数据库使用

本文使用postgresql,同时,装好psycopg。但是要注意的是,由于本文使用的是虚拟环境,所以要把psycopy也装在虚拟路径,方法是形如:
(test1) C:> easy_install psycopg2-2.6.2.win-amd64-py3.5-pg9.5.3-release.exe
此时,用pip freeze可查看到除了之前唯一的安装的Django,现在多了psycopg,一共2个第三方库了。
但因为Django默认使用的数据库是sqlite,在我们的文件目录中也有db.sqlite3的文件。为了使得正常使用postgresql数据库,我们需要在setting.py文件中修改对应的数据库信息。
步骤:
A:使用Sublime Text打开setting.py,你也可以用Python shell或者类似Pycharm或者notepad++甚至记事本等工具来编辑。快键Ctrl+F: 搜索database,找到对应的代码部分。
B:查看关于database的原始代码,然后搜索官网关于setting的设置文档介绍,如地址:https://docs.djangoproject.com/en/1.10/ref/settings/
发现首先要修改成形如下图:

C:此时,发现我们需要在postgresql中先创建一个数据库,因此在win窗口按键—>“所有程序”中打开pgAdmin III如下图:

右键选“连接”

输入密码(如之前选择了保存密码的会跳过此步)
然后右键点数据库,选:新建数据库:

进行简单设置,“名称”根据我们的app名字对应为blog,“所有者”是下拉选项,只有一个postgres,然后确定,如下图:

D:然后左侧就出现了blog的空的数据库,接下来我们要修改下setting.py中关于database的代码,参考步骤(B)中的官方示范格式。
修改代码如下(注意密码我用XXX代替,填写你设置的postgres登录密码):
DATABASES = {
‘default’: {
‘ENGINE’: ‘django.db.backends.postgresql’,
‘NAME’: ‘blog’,
‘USER’: ‘postgres’,
‘PASSWORD’: ‘XXX’,
‘HOST’: ‘127.0.0.1’,
‘port’: ‘5432’
}
接下来还需要把blog的app添加到setting.py中。搜索关键字app,找到对应代码,增加你的app名字blog,而其他的是系统自带的,形如:
INSTALLED_APPS = [
‘blog’,
‘django.contrib.admin’,
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.messages’,
‘django.contrib.staticfiles’,
]
以上就完成了Django和数据库的关联。

7、修改model.py来创建数据模型

打开blog文件夹下的model.py文件,发现默认的除了一行带有import的代码外,其他是空的。
首先参考官网关于model部分的介绍和代码参考,地址:https://docs.djangoproject.com/en/1.10/topics/db/models/
以及
https://docs.djangoproject.com/en/1.10/ref/models/fields/#model-field-types

因为这是一个基于blog的模型,所以,我们可以设置:主题、作者、内容、发贴日期、修改日期等信息。根据规范,我们建立一个Python格式的class。增加代码如:
class Article(models.Model):
title = models.CharField(“Title”, max_length = 50)
author = models.CharField(“Author”, max_length = 50)
content = models.TextField()
created_date = models.DateField(“Created Date”, auto_now_add = True)
modified_date = models.DateField(“Modified Date”, auto_now = True)
is_show = models.BooleanField()

def __str__(self):
    return self.title

class Meta:
    db_table = 'article'

# 下一篇请看:【点我】#

大牛pluskid在09年的大作:Scrapy 轻松定制网络爬虫

Veröffentlicht am 2016-09-05

说明:只转载了前面几个章节,完整的请看原文【点我】


Scrapy 轻松定制网络爬虫
by pluskid, on 2009-08-14, in Develop 74 comments
Tachikoma网络爬虫(Web Crawler, Spider)就是一个在网络上乱爬的机器人。当然它通常并不是一个实体的机器人,因为网络本身也是虚拟的东西,所以这个“机器人”其实也就是一段程序,并且它也不是乱爬,而是有一定目的的,并且在爬行的时候会搜集一些信息。例如 Google 就有一大堆爬虫会在 Internet 上搜集网页内容以及它们之间的链接等信息;又比如一些别有用心的爬虫会在 Internet 上搜集诸如 foo@bar.com 或者 foo [at] bar [dot] com 之类的东西。除此之外,还有一些定制的爬虫,专门针对某一个网站,例如前一阵子 JavaEye 的 Robbin 就写了几篇专门对付恶意爬虫的 blog (原文链接似乎已经失效了,就不给了),还有诸如小众软件或者 LinuxToy 这样的网站也经常被整个站点 crawl 下来,换个名字挂出来。其实爬虫从基本原理上来讲很简单,只要能访问网络和分析 Web 页面即可,现在大部分语言都有方便的 Http 客户端库可以抓取 Web 页面,而 HTML 的分析最简单的可以直接用正则表达式来做,因此要做一个最简陋的网络爬虫实际上是一件很简单的事情。不过要实现一个高质量的 spider 却是非常难的。

爬虫的两部分,一是下载 Web 页面,有许多问题需要考虑,如何最大程度地利用本地带宽,如何调度针对不同站点的 Web 请求以减轻对方服务器的负担等。一个高性能的 Web Crawler 系统里,DNS 查询也会成为急需优化的瓶颈,另外,还有一些“行规”需要遵循(例如 robots.txt)。而获取了网页之后的分析过程也是非常复杂的,Internet 上的东西千奇百怪,各种错误百出的 HTML 页面都有,要想全部分析清楚几乎是不可能的事;另外,随着 AJAX 的流行,如何获取由 Javascript 动态生成的内容成了一大难题;除此之外,Internet 上还有有各种有意或无意出现的 Spider Trap ,如果盲目的跟踪超链接的话,就会陷入 Trap 中万劫不复了,例如这个网站,据说是之前 Google 宣称 Internet 上的 Unique URL 数目已经达到了 1 trillion 个,因此这个人 is proud to announce the second trillion 。 :D

不过,其实并没有多少人需要做像 Google 那样通用的 Crawler ,通常我们做一个 Crawler 就是为了去爬特定的某个或者某一类网站,所谓知己知彼,百战不殆,我们可以事先对需要爬的网站结构做一些分析,事情就变得容易多了。通过分析,选出有价值的链接进行跟踪,就可以避免很多不必要的链接或者 Spider Trap ,如果网站的结构允许选择一个合适的路径的话,我们可以按照一定顺序把感兴趣的东西爬一遍,这样以来,连 URL 重复的判断也可以省去。

举个例子,假如我们想把 pongba 的 blog mindhacks.cn 里面的 blog 文字爬下来,通过观察,很容易发现我们对其中的两种页面感兴趣:

文章列表页面,例如首页,或者 URL 是 /page/\d+/ 这样的页面,通过 Firebug 可以看到到每篇文章的链接都是在一个 h1 下的 a 标签里的(需要注意的是,在 Firebug 的 HTML 面板里看到的 HTML 代码和 View Source 所看到的也许会有些出入,如果网页中有 Javascript 动态修改 DOM 树的话,前者是被修改过的版本,并且经过 Firebug 规则化的,例如 attribute 都有引号扩起来等,而后者通常才是你的 spider 爬到的原始内容。如果是使用正则表达式对页面进行分析或者所用的 HTML Parser 和 Firefox 的有些出入的话,需要特别注意),另外,在一个 class 为 wp-pagenavi 的 div 里有到不同列表页面的链接。
文章内容页面,每篇 blog 有这样一个页面,例如 /2008/09/11/machine-learning-and-ai-resources/ ,包含了完整的文章内容,这是我们感兴趣的内容。
因此,我们从首页开始,通过 wp-pagenavi 里的链接来得到其他的文章列表页面,特别地,我们定义一个路径:只 follow Next Page 的链接,这样就可以从头到尾按顺序走一遍,免去了需要判断重复抓取的烦恼。另外,文章列表页面的那些到具体文章的链接所对应的页面就是我们真正要保存的数据页面了。

这样以来,其实用脚本语言写一个 ad hoc 的 Crawler 来完成这个任务也并不难,不过今天的主角是 Scrapy ,这是一个用 Python 写的 Crawler Framework ,简单轻巧,并且非常方便,并且官网上说已经在实际生产中在使用了,因此并不是一个玩具级别的东西。不过现在还没有 Release 版本,可以直接使用他们的 Mercurial 仓库里抓取源码进行安装。不过,这个东西也可以不安装直接使用,这样还方便随时更新,文档里说得很详细,我就不重复了。

以下内容请见原文【点我】。

1…5678
Van

Van

71 Artikel
© 2017 Van
Erstellt mit Hexo
Theme - NexT.Muse