跟我一起0基础学习Python爬虫

1、实验环境Python3

2、Python基础语法

2.1注释

号可以注释一行

'''或""",注释多段内容

2.2标识符(标识某个东西的符号)

第一个字符为字符或下划线(不能为数字)

2.3数据类型

常见数据类型有数、字符串、列表(list)、元组(tuple)、集合(set)、字典(dictionary)
数:1234567890
字符串:a='abc',a="abc",a='''abc’‘’输出结果一样

a.split('w')#指定分隔符
a.strip())#默认去除两边的空格
a.replace('w','h')#w替换成h
'_'.join(a)#必须是字符串拼接h_t_t_p_:_/_/_w_w_w_._o_l_d_b_o_y_e_d_u_._c_o_m_/
a.upper()#所有小写转大写
a.lower()#所有大小转小写
a.find('h')#元素所在位置,没有的时候会返回-1
a.index('h')#元素所在位置,没有的时候会报错
a.startswith()#判断是否以xx开头,返回布尔值
a.endswith()#判断是否以xx结尾,返回布尔值
a.count('w')#判断指定元素出现的次
print(a.center(20, '*'))#不够50个字符用*填充

列表:存储多个元素的,x=[a,b,c,d],x[0]代表第一个元素a,列表里面的元素可以重新赋值,如a[0]='123'
元组:存储多个元素的,x=(a,b,c.d),x[0]代表第一个元素a,元组里面的元素不可以重新赋值
字典:{键:值,键:值...},d={"name":"zhang","sex":"man","job":"studen"},取值格式字典名["对应键名"],如d["name"]显示的是'zhang'
集合:可以去重、并集、差集等等,test1=set("aljfdlasjdasdfasf"),test2=set("aljsdfopiewenfv"),去重可以用test1 or(或-) test2,并集可以用test1 and test2等

2.4运算符

常见的有+、-、×、/、%等,优先级与数学中基本一致,优先执行需加()

2.5缩进

同一层次的代码,需要设置同样的缩进(一般4个空格或tab键为一级)

2.6循环

2.6.1三种控制流概述

控制流-程序的执行流程:顺序结构;条件分之结构;循环结构;

2.6.2if判断语句
a=10
b=1
if(a>9):
    pring(a)
    if(b<9):
        print(b)
elif(a>9 and a<=19):
    print("haha")
else:
    print("怎么可能")
2.6.3while循环语句
a=0
while(a<10):
    print("hello")
    a+=1
2.6.4for循环-遍历列表
a=["a","b","c"]
for i in a:
    print(i)
for i in range(0,10): 
#0,10为生成0-9的整数
    print("hello")
2.6.4中断语句

break:全部退出,直接中断

a=["a","b","c"]
for i in a:
    print(i)
    if(i=="b"):
        break

continue:中断(跳过)一次循环,继续下一次循环

a=["a","b","c"]
for i in a:
    print(i)
    if(i=="b"):
        continue
2.6.5乘法口诀表

正序

for i in range(1,10):
    for j in range(1,i+1):
        print(str(i)+str("*")+str(j)+"="+str(i*j),end="\t")
    print()
1*1=1   
2*1=2   2*2=4   
3*1=3   3*2=6     3*3=9 
4*1=4   4*2=8   4*3=12  4*4=16  
5*1=5   5*2=10  5*3=15  5*4=20  5*5=25  
6*1=6   6*2=12  6*3=18  6*4=24  6*5=30  6*6=36  
7*1=7   7*2=14  7*3=21  7*4=28  7*5=35  7*6=42  7*7=49  
8*1=8   8*2=16  8*3=24  8*4=32  8*5=40  8*6=48  8*7=56  8*8=64  
9*1=9   9*2=18  9*3=27  9*4=36  9*5=45  9*6=54  9*7=63  9*8=72  9*9=81

倒序

for i in range(9,0,-1):
    for j in range(i,0,-1):
        print(str(i)+str("*")+str(j)+"="+str(i*j),end="\t")
    print()
9*9=81  9*8=72  9*7=63  9*6=54  9*5=45  9*4=36  9*3=27  9*2=189*1=9 
8*8=64  8*7=56  8*6=48  8*5=40  8*4=32  8*3=24  8*2=16  8*1=8   
7*7=49  7*6=42  7*5=35  7*4=28  7*3=21  7*2=14  7*1=7   
6*6=36  6*5=30  6*4=24  6*3=18  6*2=12  6*1=6   
5*5=25  5*4=20  5*3=15  5*2=10  5*1=5   
4*4=16  4*3=12  4*2=8   4*1=4   
3*3=9     3*2=6   3*1=3 
2*2=4     2*1=2 
1*1=1

3、Python函数与模块

函数的本质就是功能的封装,可以提高效率和可读性;

3.1局部变量和局部变量

变量生效范围称为作用域,作用域为全局就是全局变量,作用域为局部就为局部变量;

3.2函数
3.2.1定义函数方法

函数定义格式:

def 函数名(参数):
    函数体
def abc():
    print("abcde")
3.2.2调用函数

函数调用格式:

函数名(参数):
acb()
3.2.2函数参数使用详解

参数:与外界沟通的接口,分为形参和实参,一般在函数定义的时候使用的参数是形参,一般在函数调用的时候使用的参数是实参;

def bjdx(a,b):
    if(a>b):
        print("a比b大")
    else:
        print("b比a大或相等")
bjdx(4,5)
定义形参a.b,调用时输入a.b实参4,5进行比较,结果b比a大或相等;
3.3模块

模块组成:程序段组合-->功能块(函数)组合-->模块

3.3.1模块导入方式

我们可以使用一下两种方式导入模块:

import 模块名 
或者
from ... import ...
3.3.2模块导入使用
import cgi
cgi.closelog()
--------------
from cgi import closelog

两种方式使用调用模块并使用模块方法

3.3.3第三方模块的安装
模块的来源:

自带模块;
第三方模块;
自定义模块;

安装第三方模块:

pip方式(网络安装);
whl下载安装的方式(下载安装);
whl下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs,安装直接使用pip install whl文件全名(pip install Cython‑0.29.11‑cp38‑cp38m‑win32.whl)
直接复制的方式;
anaconda安装模块;

3.3.4自定义模块

只要你把*.py文件放到模块文件目录(一般在软件安装目录lib下),他就是一个模块了,可以被调用;

4、文件操作

打开文件使用open(文件地址,操作形式)
w :写入(类似重定向>,先清空在写入)
r :读取
b :二进制
a+:追加
读取:
a=open("文件地址","参数(r)")
a.read()-读取全部内容
a.readline()-一行一行读取
a.close()

>>> a=open("/root/test1.txt","r")
>>> a.read()
'测试文本111111\n'
>>> a.close()

写入:
a=open("文件地址","参数(w)")
a.write("123123")-清空后再写入,追加写入参数要用a+
a.close()

>>> a=open("/root/test2.txt","w")
>>> a.write("测试写入功能!")
>>> a.close()
[root@test ~]# cat test2.txt 
测试写入功能!

5、异常处理

容错机制,提高程序容错性!

异常处理格式
try:
    程序
except Exception as 异常名称:
    异常处理部分
事例1(出现异常显示异常):
try:
    for i in range(0,10):
        print(i)
        if(i==4):
            print(jsd)
    print("hello")
except Exception as errors:
    print(errors)
   #pass 也可以使用pass什么都不显示
事例2(出现异常跳过继续执行):
for i in range(0,10):
    try:
        print(i)
        if(i==4):
            print(jsd)
    except Exception as errors:
       #pass 也可以使用pass什么都不显示
        print(errors)
print("hello")

6、Python面向对象编程*

6.1面向对象变成概述

面向对象编程即OOP编程,区别于面向过程编程,面向对象编程比较适合开发大项目(面向过程编程适合中小项目),会以更接近人类的思维的角度去写程序;

6.2类和对象

类:具有某种特征的失误的集合(群体);
对象:群体(类)里面的个体;

类是抽象的,对象是具体的。
创建类格式:
class 类名:
      类里面的内容
事例1:
#创建一个类
class cl1:
    pass
>>> cl1
<class '__main__.cl1'>
#实例化一个类
>>> a=cl1()
>>> a
<__main__.cl1 object at 0x7fd798e95be0>
6.3构造函数(构造方法)

类在实例化的时候自动首先触发的方法,构造出一个对象的时候就首先出发的方法;
self:在类中的方法必须加上self参数
构造函数:init(self,参数)
构造函数实际意义:初始化

class cl2:
    def __init__(self):
        print("I an cl2 self!")
>>> b=cl2()
I an cl2 self!
>>> b
<__main__.cl2 object at 0x7fd798e95dd8>
6.4给类加上参数(给构造方法加上参数)
class cl3:
    def __init__(self,name,job):
        print(" My name is "+name+" My job is "+job)
>>> c=cl3("shuaige","teacher")
My name is shuaige My job is teacher
>>> c2=cl3("xiaoli","hah")
 My name is xiaoli My job is hah
6.5属性和方法

属性:静态的特征,如头发、手臂等,相当于类里面的变量;

属性调用方法:
class cl4:
    def __init__(self,name,job):
        self.myname=name
        self.myjob=job
>>> d=cl4("xiaobai","teacher")
>>> d
<__main__.cl4 object at 0x7fd798dfa198>
>>> d.myname
'xiaobai'
>>> d.myjob
'teacher'

方法:类里面的函数,def 方法(函数)名(self,参数)

class cl5:
    def myfunc1(self,name):
        print("hello"+name)
>>> f=cl5()
>>> f.myfunc1("shuai")
helloshuai
class cl6:
    def __init__(self,name):
        self.myname=name
    def myfunc1(self):
        print("hello"+self.myname)
>>> f=cl6("zhangshuai")
>>> f
<__main__.cl6 object at 0x7f817793acc0>
>>> f.myfunc1()
hellozhangshuai
6.6继承与重载

继承:把某一个或多个类(基类)的特征拿过来;
重载:在子类(派生类)里面对继承过来的特征重新定义;
父类:基类
子类:派生类

基类1(例如父亲有说的能力):
class father():
    def speak(self):
        print("I can speak!")
单继承(例如儿子继承父亲说的能力):
class son(father):
    pass
>>> s=son()
>>> s.speak()
I can speak!
基类2(例如母亲有写的能力):
class mother():
    def write(self):
        print("I can write!")
多继承(例如女儿继承了父亲说和母亲的写能力,自己还有听的能力)
class daughter(father,mother):
    def listen(self):
        print("I can listen!")
>>> h=daughter()
>>> h.speak()
I can speak!
>>> h.write()
I can write!
>>> h.listen()
I can listen!
重写(重载,可以将继承过来的能力进行覆盖):
class son2(father):
    def speak(self):
        print("I can speak 2!")
>>> j=son2()
>>> j.speak()
I can speak 2!

练习:
将多个excel文档合并(使用xlrd、xlwt、openpyxl、xlsxwriter模块)
xlwt和xlsxwriter不支持修改表,信息追加会比较麻烦

Excel结构:
         Workboot  工作薄(相当于一个类)
         Worksheet 标签(相当于一个属性、方法)
            title  标题
            row    行
            column 列
            cell   单元格
            value  值
         save()    存储行为
         add_sheet 增加一个表单
         write     在指定单元各写入数据
简单事例1:
>>> import openpyxl
>>> wb = openpyxl.Workbook()
>>> ws = wb.active
>>> ws
<Worksheet "Sheet">
>>> ws.title = "课程表"
>>> wb
<openpyxl.workbook.workbook.Workbook object at 0x7f254a558d68>
>>> ws["A1"].value = "帅哥的课"
>>> ws["A1"]
<Cell '课程表'.A1>
>>> ws["A1"].value
'帅哥的课'
>>> ws["C5"] = "帅哥开课了!"
>>> ws["C5"].value
'帅哥开课了!'
>>> wb.save(r"test.xlsx")
就创建了一个表格
简单事例2:
>>> import xlrd
>>> wb = xlrd.open_workbook("/usr/lib/python2.7/site-packages/test.xlsx")
>>> sheet = wb.sheet_by_index(0)
>>> print("该Excel文件有行数"+str(sheet.nrows))
该Excel文件有行数5
>>> values_line = sheet.row_values(0)
>>> print(values_line)
['帅哥的课', '', '']
简单事例2(显示表数据):
import xlrd
wb = xlrd.open_workbook("/usr/lib/python2.7/site-packages/test.xlsx")
sheet = wb.sheet_by_index(0)
print("该Excel文件有行数"+str(sheet.nrows))
该Excel文件有行数5
values_line = sheet.row_values(4)
print(values_line)
['帅哥的课', '', '']
显示全部内容:
for i in range(0,sheet.nrows):
    line = sheet.row_values(i)
    print("第%d行数据:"%i,end="")
    #%d为数字占位符,调用后面i的值
    print(line)
第0行数据:['帅哥的课', '', '']
第1行数据:['', '', '']
第2行数据:['', '', '']
第3行数据:['', '', '']
第4行数据:['', '', '帅哥开课了!']

持续更新中(我正在学习!!)


BTC:3LD8DBk5nZSwmGoF1mvM12Pp5YqNFEvfLA
ETH:0xAD765200e7Feb98a2AF262387A41F078e9F91eAc

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342