学习编程过程中学会的道理

1.机器不会错,如果错了,一定是人的问题

2.思维定势,让人对错误视若无睹,比如:

1.page = request.GET.get('page',1)
写成get, Get,尤其是Get ,还完全意识不到自己的错误。
2.在使用爬虫时, 把 soup = Beautiful( *.text, 'lxml') 写成 *.txt,意识不到自己的错误。
把 web_data, 写成 wb_data, 意识不到自己的错误。

眼睁睁的看着实例都能写错,可见思维定势的强大。
那日常生活中,工作中,学习中,有多少是因为思维定势,而让你错失了了解真相的机会呢?

下图是一个很明显的例子。


少女或老妇?

为什么会这样?
在心理学上,定势又称心向,是指主体对一定活动的预先的特殊准备状态。具体地说,人们当前的活动常受前面从事的活动的影响,倾向于带有前面活动的特点。当这种影响发生在知觉过程中时,产生的就是知觉定势。

因此,你对现有事物的认知和反应,依据于你过往对类似事务的认知和经验。
当你去认知新事物的时候,是无法知道自己错在哪里了的。正如你不能提着自己的衣领把自己举起来。

怎么破?
结识和你有不同背景,具有高度自知之明的人,通过和他们的互相探讨,来逐步拼凑出事情更完整的面貌。

3-对于高门槛的新技能,付钱学习是最便宜高效的入门方法

Python 其实我15年初九嚷嚷在学,学到年底,也不过可以编一些计算类的(比如汉诺塔什么的)小程序自娱自乐。
11月份报了实战计划的爬虫入门班,包括过年,产品更新迭代上新版等等,到目前4个多月时间,我已经能够用Django搭建自己的简单网站,展示自己爬取的简单数据(搜狗数据还是不行,js控制的数据有部分不行),并从中受益。

如果早知道,我会早去花钱学习。而不是自己茫然地在网上导出寻找免费资料,浪费了近1年的时间。

为什么呢?
在入门的时候,我们其实还没有掌握寻找问题的方法,更不用说怎么去解决。而高门槛的新技能一般有复杂的初始要求,比如说配置电脑环境:python3.X升级, pip的安装,pycharm的安装,mongdo的安装,这些问题,随便一个都能让尚未入门的小白折腾一天,然后发现自己连生产工作都搞不定,更不要说学习生产了,只好绝望放弃。

所谓师傅领入门,是让你在碰到这些问题的时候,指导你该如何去寻找解决的办法。
然后,才有可能自学。

  1. 刚需,是战胜任何困难的第一推动力

学习爬虫有个很关键的目标,是想做一个自己的信息搜集器。
把和客栈相关的所有信息,能够搜集到一个地方,自己每天可以阅读。
这是我作为产品的刚需:了解市场,了解竞品。

因此每次遇到困难的时候,也只能咬咬牙,然后到处查资料问人,知道最后完成。
如果只是玩玩而已的话,早放弃了。

  1. 先整理思路框架,再开干

写程序的时候,先想清楚要干什么,比马上开始干重要。

比如我写36氪的爬虫的时候,第一次只想爬文章标题,链接。
爬完之后发现不够,于是改数据库,加上了品类;之后发现需要时间否则排序有问题,又改数据库,加上了时间。而在写知乎的时候,吸取之前的经验,一开始把所有需要的内容都整理列出来,然后再写,效率明显提高。

写完36氪一个品类的爬虫之后,写第二个品类的爬虫写到一半才意识到自己可以把品类作为参数每次输入,爬虫本身是一样的。
于是标准化了爬虫,增加了参数输入。

当然,这些问题其实都很菜鸟,通过这些菜鸟的步骤,我们才能慢慢学习成长。

  1. 集中地长时间的反复练习,才有可能前进

年后因为要准备3.0新版的事情,忙到经常一周才学习一次,每次有60%的时间都在回顾之前学到哪里了,怎么做的。40%的时间来往前走一小步。对于学习而言,是效率很低的方式。

315这周,3.0上线了,于是恢复了早上学习1个小时,周末花半天学习的习惯。速度明显加快,第一版半成品的客栈舆情网也做出来了。

一般的编程(不涉及到高级的算法什么的),其实是门手艺活,熟能生巧。因此,手熟很重要。

  1. 照抄课程的代码,运行出错:

pymongo.errors.OperationFailure: command SON([('aggregate', 'item_info1'), ('pipeline', [{'$match': {'$and': [{'pub_date': {'$lte': '2015.12.27', '$gte': '2015.12.25'}}, {'area': {'$all': ['朝阳']}}]}}, {'$group': {'_id': {'$slice': ['$cates', 2, 1]}, 'counts': {'$sum': 1}}}, {'$limit': 3}]), ('cursor', {})]) on namespace ganji.$cmd failed: First argument to $slice must be an Array, but is of type: String

原因是 'cates' 数据我之前已经整理过,不需要用$slice再整理一次。
查看了mongodb的文档发现没有slice这个方法,然后才意识到这是python自己的方法,用来做字符串操作的。核对了教程视频发现果然是这样。

看文档的确很重要。

  1. 在 views层运行数据出错:

bson.errors.InvalidDocument: Cannot encode object:

原因:

{'$match':{'$and':[{'pub_data':{'$gte':date1,'$lte':date2}},{'area':{'$all':area}}]}},

其中把 该传入 area参数的部分,写成了all.

解释:BSON (Binary JSON)

BSON()是一种类json的一种二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型。
BSON可以做为网络数据交换的一种存储形式,这个有点类似于Google的Protocol Buffer,但是BSON是一种schema-less的存储形式,它的优点是灵活性高,但它的缺点是空间利用率不是很理想,
BSON有三个特点:轻量性、可遍历性、高效性
{"hello":"world"} 这是一个BSON的例子,其中"hello"是key name,它一般是cstring类型,字节表示是cstring::= (byte) "/x00" ,其中表示零个或多个byte字节,/x00表示结束符;后面的"world"是value值,它的类型一般是string,double,array,binarydata等类型。

MongoDB使用了BSON这种结构来存储数据和网络数据交换。把这种格式转化成一文档这个概念(Document),因为BSON是schema-free的,所以在MongoDB中所对应的文档也有这个特征,这里的一个Document也可以理解成关系数据库中的一条记录(Record),只是这里的Document的变化更丰富一些,如Document可以嵌套。
MongoDB以BSON做为其存储结构的一种重要原因是其可遍历性。

5.在pycharm 里面选择了运行 test.py, 但实际运行的是models.py, 这是怎么回事呢

因为test.py 需要引入models.py,在引用的同时启动models.py的运行。

  1. 在mongoengine下,针对class进行查询操作。

http://mongoengine-odm.readthedocs.org/guide/querying.html

文档首先说明了,db.objects是一个可循环的查询类数据类型,通过objects(查询条件)生成的也是同类型,需要用 item.key 来调用其中每个数据。

  1. 以下代码,传入参数时无法识别,直接写入参数时可以运行。
#传入参数data1,data2,area,limit , 无法运行
pipeline1 = [
     {'$match':{'$and':[{'pub_data':{'$gte':date1,'$lte':date2}},{'area':{'$all':area}}]}},
    {'$group':{'_id':'$cates','counts':{'$sum':2}}},
    {'$limit':limit},
    {'$sort':{'counts':-1}}
 ]
print('pipeline1')

#直接设置参数data1,data2,area,limit , 可以运行
pipeline1 = [    
    {'$match':{'$and':[{'pub_date':{'$gte':'2015.12.25','$lte':'2015.12.27'}},
{'area':{'$all':['朝阳']}}]}},    
{'$group':{'_id':'$cates','counts':{'$sum':1}}},    
{'$limit':3},     
{'$sort':{'counts':-1}}

解决办法:直接替换

8.替换完highchairs视图函数后,网页运行不出来,显示如下:

Uncaught ReferenceError: 
jQuery is not defined(anonymous function) @ semantic.js:497
semantic.css:11 Uncaught SyntaxError: Unexpected token ILLEGAL

什么都没展示:要在series 数据源后面加'|safe'
除了数据本身,什么都展示了,那就是数据格式问题。这次我忘了加'[]'.
highchairs 的数据要求加'[]'来区分。

9.在 pycharm 中,利用 pymongo 建立mongod数据库未成功。整理发现原因如下:

为了断点续爬的功能,设计了一个 判断语句判断数据库中是否已存在此条数据,但是语句语法写错:

错误的语法:

If collection.find({key:value}):
    pass
else:
    collection.insert_one{data}

正确的语法:

If collection.find({key:value}).count():
    pass
else:
    collection.insert_one{data}

原因:
MongoDB与python 不一样,.find()方法会返回一个类型,这个类型总是存在的,因此判断总是为真,数据从未被插入数据库,因此数据库从未被真实建立起来。

改为 collection.find().count(), 如果数据存在则计数大于1,数据不存在则计数为0,条件能够顺利进入“不存在”的判断,然后插入数据,因此才能创建 数据库。

MongoDB 建立数据库:
直接用 'use.DB'
此时数据库并未真正被建立起来,需要插入数据才被建立。

> db.users.save( {username:"mkyong"} )
> db.users.find()
{ "_id" : ObjectId("4dbac7bfea37068bd0987573"), "username" : "mkyong" }
  1. 在一个普通pycharm project里面做完了MTV,发现怎么都无法展现在网站上,检查文件的时候发现缺少settings, urls等关键配置文件。-一开始建立这个项目的时候就不是按照Django项目来建立的。我也是醉了。。。

  2. 在mongoengine环境下取得当前时间:

import datetime
class a(document):
date_time = DateTimeField(default=datetime.datetime.now)

  1. 对mongoengine 对象排序:

参考文章:http://www.jb51.net/article/64861.htm

实际操作:
date_time 是我的时间数据。

zhihu1 = wb_data_zhihu.objects.order_by('-date_time') #按照时间倒序来存储

你可能感兴趣的:(学习编程过程中学会的道理)