Python:入门到实现网络爬虫 Day1

来源:互联网 发布:救世主大教堂知乎 编辑:程序博客网 时间:2024/06/05 19:26

  发现周围很多同学,还有室友都在学Python,说怎么怎么方便,前段时间自认C++才是正道的我不屑于他们的吹捧,经历一段时间的学习后,我觉得每门语言都有自己的特点与优点,并不用比高下,多学一些知识并不是一件坏事,俗话说技多不压身,多学学新知识对自己是有帮助的,而且现在好像大多机器学习、深度学习都是在Python弄得,所以来尝尝鲜,Python是一门脚本语言,大一大二的时候学过Matlba,大三的时候学过R,都是用于数值计算,学数模的时候也听说过Lingo(没错就是听说,看过老师演示过,解线性规划很很很方便),那时候初学C,C++对脚本的风格不太习惯,于是不怎么学,于是乎该来的还是要来,该学的还是得补上。。。
  既然是学习语言,那就定一个小目标吧,以前想在C++上写一个爬虫的,但是对soket不是了解,对网络知识缺乏,所以就没做,所以本次学习就是以,做一个爬虫与学习Python的基础知识。

一、首先得安装一个Python
下载地址:https://www.python.org/downloads/,然后去百度如何配置Python的环境吧,很简单的,其实也就是在环境变量Path里加你按在Python的根目录,检验是否配置成功,可以在命令提示符下运行python,看是否弹出版本信息来判断。

二、实现一个Hello World
 使用VS2015或者更高,或者使用安装python后自带的交互式环境IDLE,就可以敲代码啦!来试一试输入print(‘Hello World’)然后回车试试。

>>> print('hello world')hello world  

三、数学操作符(只列举一些不同于C/C++的操作符)
在Python中,**代表指数运算,比如2**3,结果为8
      //代表整除/商的数取整 ,比如22//8,结果为2

四、变量的赋值与使用
  在Python中,声明一个变量,不用加变量类型(目前看书好像是不用),就如同C++11中的auto自动判断了类型,在使用字符串的时候,不能如下使用

>>> s='my age:'+14Traceback (most recent call last):  File "<pyshell#3>", line 1, in <module>    s='my age:'+14TypeError: must be str, not int

  就像C++中,你自己写了一个string类,但是没重载+号,所以无法识别,Java比较方便,可以直接加数字。
  那我们想在字符串中加数字该怎么办呢?使用Python里的str(参数),它会将数字转变为字符串,例如:

>>> s='my age'+str(14)>>> s'my age14'

  类似的函数有int(),float()函数,而len()函数则是获得字符串变量的长度,返回一个整形的值,input()函数则是获取用户输入键盘的值,它将会把用户输入的值转换为字符串。

五、控制流
  说到控制流,在C/C++中为 for、while、do while、if…等等,里面的条件表达式则根据里面的布尔值或者说是数值来判断程序是否进行下去,所以我们就先来说说,布尔值。
  在C++中,布尔值为true 、false,小写的,在Java中好像是大写的TRUE,FALSE,使用小写好像要导入一些包,而在Python中,为True、False,关系运算符==、!=…….这些就不说了,来看看逻辑运算符,也就是二元布尔操作符,and、or、not,且或非,在运算过程中,not的优先级>and>or,我们可以写一个小程序测试一下,如下:

>>> True or False and not TrueTrue

  运行结果为True,首先 or优先级比and低,则先判断and,再and比not低,则先not,所以and的结果为False,而True and False就为True。
  在控制流中,有如下规则:
    1.缩进增加时,代码块开始
    2.代码块可以镶嵌代码块
    3.缩进为0或者为外圈的缩进的时候,该代码块就结束了
例如:

if语句:

name=input()if name=='Yh':    print('its me')else:    print('what???')

  发现else if用不了,只能使用elif来代替,还有要注意的就是缩进,与控制语句后面加:,如果你的程序else没放在与if对齐,则识别不了,编译器会报错,还有一个问题,是在VS上写的时候,使用input(),你直接输入,如name应该等于’abs’这个字符串,在IDLE里面直接输入abs即可,而在VS上就不同了,你必须输入’abs’,否则不识别你输入的是什么类型,有些不方便。
大体格式为:

if 条件表达式 :   ......elif 条件表达式 :   ......else :   ......

while 语句:
  格式为:

while 条件表达式:    循环体

  判断条件表达式中的值是否为真,真则继续执行,假着进入elif或者else
  可以用break来打破循环,只要在如上代码的循环体下面加一个break即可,continue(到下一个循环)也如break的用法,直接加进去即可,从代码外部终止循环可以按Crtl+C,或者是从菜单中选择shell->restart shell,即可立马停止。
(在条件表达式中,0,0.0,”被认为False,其他值为True)

for语句
  格式为:

for 变量名 in range():   #range()最多传入3个参数    方法
for i in range(2):     print(i)  #i为0,1,即range()是从0开始算起的

  上面说到range()可以接受至多三个参数,则我们来看看其他的参数吧,当range()中填入两个参数,如range(10,12),则数字就从10开始到12,类似于我们在C++中重载了range()这个函数,
而range(10,12,1),则为从10开始,到12的步伐为,2,则i就等于10,12.

六、导入模块
  就如同C++ #include加载头文件或者Java的import导入包,在Pyhton导入模块格式为:

import 模块名称(加载更多包用逗号隔开)

那么我们如何具体的使用模块呢?如下:
这里写图片描述
这里写图片描述
  其中 S文件为前面if语句所写的代码,通过import S,加载了S.py文件,从而执行里面的方法,若S中里面有用函数体的函数,例如S.py中有个函数为test(),则我们在A.py中import后,调用test()方法则为S.test(),若使用from 模块名称 import *,则调用的时候不需要加模块名,但是这样的话会影响到其他模块是否存在相同变量名称,所以一般使用import,有些与C++的namespace相同,分隔出不同的空间。

七、函数
  定义一个函数的格式为:

    def 函数名(参数):        函数体

  与所有或者说是大多数编程语言一样,函数体的参数,是局部变量,只能在函数内使用,用C++或者Java的话来说,就是按值传递,Java似乎是通过自定义的类型名来达到按引用传递,C++则是通过&来传递,Python目前不清楚,因为我写这篇文章的时候同时也在学习Python,如果我们要获取函数返回的值的话,就加一个关键字:

    return 值或者表达式

  说到返回值,则一定要看看返回空值是如何返回,在C++中是返回NULL,或者nullptr或者……,Java的话好像也差不多把,而我们的Python则是返回None,也可以直接 return而不加什么值,则代表返回空值,有点类似于返回False。
  在上面介绍for语句的时候,介绍了range()函数的用法,我们再来看看print()函数,print()函数每次调用的时候,若end参数未填的话,则默认为输出换行符,例如:

print('hello')print('world')输出helloworld

  如果设置end=”,则两个字符串输出是相连的,从这我们可以看出我们可以给函数的参数默认值,或者可以指定参数赋予一些特定的值,我们来看看print()有哪些参数可以写:
这里写图片描述
  我们可以看出里面的参数有sep,end,file,flush等等,sep为分隔符号默认为空字符串,若添加多个value值,则value之间都会通过sep说设定的字符分隔。而file,flush我还不太清楚,其中print()函数还可以类似于C语言的printf那样去使用,例如:
(%为说明符,可以按C的printf那样输出)
转换类型:
转换类型 含义
d,i 带符号的十进制整数
o 不带符号的八进制
u 不带符号的十进制
x 不带符号的十六进制(小写)
X 不带符号的十六进制(大写)
e 科学计数法表示的浮点数(小写)
E 科学计数法表示的浮点数(大写)
f,F 十进制浮点数
g 如果指数大于-4或者小于精度值则和e相同,其他情况和f相同
G 如果指数大于-4或者小于精度值则和E相同,其他情况和F相同
C 单字符(接受整数或者单字符字符串)
r 字符串(使用repr转换任意python对象)
s 字符串(使用str转换任意python对象)

num=1print('例子%d'%num)s='2'print('例子%s'%s)print('例子%s 和%d'%(s,num))输出:例子1例子2例子21

  至于file参数的话,百度看了一下,有点类似于传函数指针,百度上得用例是,写一个类A,然后声明一个变量赋值为这个A(),即构造函数,然后穿入print中,其中类A中似乎必须def一个函数为write(string),这似乎是对应这上面那张关于print参数的截图,默认为sys.stdout,也就是输出流,也就是这个和输出流相关,能写文件(输出到文件)。
找了个file例子,是用写入文件的:

with open('a.txt','w') as f: #读取a.txt文件,然后写入    print("a.txt内容为:",file=f) #将value写入f中,也就是写入a.txt

(关于输入输出流的理解,输入就是把外面的东西输入到我们的代码或者程序中,而输出,则是从我们程序中输出(写入)到外部文件中)
  flush参数的话,百度了一个很好理解的解释:
  “简单说就是将缓存里面的内容立即输出到标准输出流(这里是sys.stdout, 也就是默认的显示器),这个功能在客户端脚本几乎用不上, 大多用于服务器端
  比如反向Ajax里面就要用到flush, 举个例子: 在线web聊天页面会实时显示聊天的内容, 其实后台是一直在向服务器请求数据的, 正常情况下是请求完毕之后才会输出相应内容, 但是是即时聊天, 需要一有相应就得立即返回, flush也就起作用了”
  我理解这段话为立即返回stdout流的内容,如同这段话的末尾。
  扯了很多和print函数相关的用法,现在我们来说说函数相关的吧,在Python,上上上面我们所函数里面的变量是局部变量,当局部变量的名字和全局变量的名字相同的时候,函数会选择谁呢?答案是选择函数里面的局部变量,若要修改全局变量,则在函数里面定义这个变量为global的如:

    def test()        global egg        egg='zz'    egg='global'    test()    print(egg)    结果为:        zz

  当然这样的情况是变量名相同的时候,平常我们想改变一个变量的值,直接return 那个值赋予我们想改变的值即可

八、异常处理
  在C++中,异常处理为使用try{可能出错的语句}catch(异常类型),通过throw捕获异常,若在函数后面加throw(),无参数则表明该函数不会抛出异常,若标明异常类型则说明会throw相关类型的异常,若为参数为 … 则表示会抛出任何类型的异常。
例如:

void div(double &a,int b){    if(b==0)        throw "it's zero";    a=a/b;}int main(){    double a=0.0;    int b=0;    try{        cin>>a;        cin>>b;        div(a,b);        std::cout<<"The program is pass";    }    catch(char *str)    {        cout<<"Zz"    }    catch(...)    {        cout<<"All";    }    return 0;}

  从上例程序中,若异常(b=0)被捕获,则div()后面的语句不会执行,而是跳转到catch语句,检测异常类型,有个注意的地方就是,若捕获的类型是派生类或基类对象,则应该先写catch派生类的异常然后再写catch基类的异常,因为基类对象可以强制转换为派生类,所以把catch派生类放在前面。
  说了这么多的C++异常,是因为感觉异常处理方面相似,所以多说一下,而Python的异常处理格式如下:

    try:        异常语句    except 异常类型:        处理语句

  因为书上的介绍很少,好像是直接try:一些可能出现异常的函数,而不用如同C++在相关函数中throw异常。
   今天就学到这了,有学过其他语言的基础,理解起来很轻松不会很难,python也很适合初学者使用,毕竟目前我学到这,看似没有太多的类型转换,代码也很简洁易懂,有错误的地方大家请留言指出OvO

原创粉丝点击