2022年 11月 4日

Python 学习指南(持续更新中)

文章目录

    • 第一章 Python 基础
    • 第二章 Python requests 模块
    • 第三章 Python 数据分析

第一章 Python 基础

代码注释分单行 和 多行注释
1、单行注释用# 号 快捷键 ctrl + /
2、多行注释可以用三对 双引号 “”” ‘’’

第一个python 程序
print(“hello world”)

变量命名规则
1、见名知其意
2、变量名的第一个字符不能是数字
3、变量名只能是字母、数字或下划线的任意组合(区分大小写)

下划线 age_of_dahai = 18
驼峰体 AgeOfDahai = 18

常量(全部写大写):就是不变的量 可以改,告诉别人不能改
NAME = ‘小孩’

1、id 相对于内存中的位置或地址 print(id(name))
2、类型 print(type(name))
print(‘my name is “大海”’)

字符串
str = ‘Hello World!’
print str # 输出完整字符串
print str[0] # 输出字符串中的第一个字符
print str[2:5] # 输出字符串中第三个至第六个之间的字符串
print str[2:] # 输出从第三个字符开始的字符串
print str * 2 # 输出字符串两次
print str + “TEST” # 输出连接的字符串

与用户进行交互,用input 输入信息
name = input(’>>>’)
print(name)

格式化输出
print(‘my name is %s’%name)

算术运算符
加减乘除
地板除 //
取余 %
乘方 **

比较运算符
等于 ==
不等于 !=
大于 > 大于或等于 >=
小于 < 小于或等于 <=

复数类型
x = 1 – 2j 代表一个坐标 (1, -2)
<class ‘complex’>

列表类型 list
L = [‘大海’, 1, 1.2, [1.22, ‘xiaohai’]]
print(L[0])
print(L[3][0])
=>大海
=>1.22

a = 10
list = [1, 2, 3, 4, 5 ];
 
if ( a in list ):
  print('1 - 变量 a 在给定的列表中 list 中')
elif ( a not in list ):
	print('1 - 变量 a 不在给定的列表中 list 中')
else:
  print("error")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

字典类型dict key:value
info = {‘name’:‘dahai’, ‘age’:18}
print(info[‘name’])
=>dahai

元组类型 tuple(不能更改,不能添加) 与列表类似
t = (1, 2, ‘大海’,(2, 3), [‘红海’, 2 , 3])

集合类型 set (无序)
s = {1, “xiaohai”, 2.5, ‘大海’}
s1 = {‘a’, ‘b’, ‘c’}
s2 = {‘a’, ‘c’, ‘d’}
print(s1 & s2) =>{‘a’, ‘c’}
print(s1 | s2) =>{‘d’, ‘b’, ‘a’, ‘c’}
print(s1 – s2) =>{‘b’}

#流程控制
username = "lili"
password = "admin"
username = input("username:")
password = input("password:")
if username == "lili" and password =="admin"
  print ("welcome %s to my home! %username ")
else:
  print ("wrong username or password")

#循环语句
i = 1
while i < 10:   
    i += 1
    if i%2 > 0:     # 非双数时跳过输出
        continue
    print i         # 输出双数2、4、6、8、10

for letter in 'Python':     # 第一个实例
   print("当前字母: %s" % letter)

#函数
#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
#可写函数说明
def printinfo( name, age = 35 ):
   "打印任何传入的字符串"
   print "Name: ", name
   print "Age ", age
   return
 
#调用printinfo函数
printinfo( age=50, name="miki" )
printinfo( name="miki" )

输入结果:
Name:  miki
Age  50
Name:  miki
Age  35

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
# 可写函数说明
def sum( arg1, arg2 ):
   # 返回2个参数的和."
   total = arg1 + arg2
   print "函数内 : ", total
   return total
 
# 调用sum函数
total = sum( 10, 20 )

输出结果:30

#类

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
class Employee:
   '所有员工的基类'
   empCount = 0
 
   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount
 
   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary
 
"创建 Employee 类的第一个对象"
emp1 = Employee("Zara", 2000)
"创建 Employee 类的第二个对象"
emp2 = Employee("Manni", 5000)
emp1.displayEmployee()
emp2.displayEmployee()
print "Total Employee %d" % Employee.empCount

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85

第二章 Python requests 模块

http 协议 概念: 就是服务器和客户端进行数据交互的一种形式
常用请求头信息
User-Agent:请求载体的身份标识
Connection:请求完毕后,是断开连接还是保持连接
常用响应头消息
content-type:服务器响应回客户端的数据类型

https 协议 概念:安全的超文本传输协议

加密方式

  • 对称密钥加密
  • 非对称密钥加密
  • 证书密钥加密

requests 模块
-urllib 模块
-requests 模块

requests 模块:python 中原生的一款基于网络请求的模块,功能非常强大,简单便捷,效率极高。
作用:模拟浏览器发请求。

如何使用:
–指定url
–基于request 模块发起请求
–获取响应对象中的数据值
–持久化存储

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 需求:爬取搜狗首页的页面数据

import requests

if __name__ == "__main__":
    # --指定url
    url = 'https://www.sogou.com/'

    # --基于request 模块发起请求
    response = requests.get(url=url)

    # --获取响应对象中的数据值
    page_text = response.text

    # --持久化存储
    with open('./sogou.html', 'w', encoding='utf-8') as fp:
        fp.write(page_text)
    print('爬取数据完毕!!!')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

实战巩固

#!/usr/bin/python
# -*- coding:utf-8 -*-
# 需求:爬虫搜狗指定词条对应的搜索结果页面(简易网页采集器)

# UA : User-Agent(请求载体的身份标识)
# UA 检测:门户网站的服务器会检测对应请求的载体身份标识,
# 如果检测到请求的载体身份标识为某一款浏览器,说明该请求
# 是一个正常的请求,但是,如果检测到请求的载体身份标识不
# 是基于某一款浏览器的,则表示该为不正常的请求(爬虫),
# 则服务器端就很有可能拒绝该次请求。

#UA伪装:让爬虫对应的请求在台身份标识伪装成某一浏览器
import requests
if __name__ == "__main__":
    headers = {
        'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0'
    }

    # --指定url
    url = 'https://www.sogou.com/web'
    # 处理url 携带的参数:封装到字典中
    kw = input('enter a word:')
    param = {
        'query' : kw
    }

    # --基于request 模块发起请求
    response = requests.get(url=url, params=param, headers=headers)

    # --获取响应对象中的数据值
    page_text = response.text

    # --持久化存储
    with open('./sogou.html', 'w', encoding='utf-8') as fp:
        fp.write(page_text)
    print('爬取数据完毕!!!')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
#!/usr/bin/python
# -*- coding:utf-8 -*-
# 需求:破解百度翻译
import requests
import json
if __name__ == "__main__":
	  # 通过网页指定url
    post_url = 'https://fanyi.baidu.com/sug'
		
	  # 添加伪装
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0'
    }

    word = input('enter a word:')
    data = {
        'kw' : word
    }
    # 基于request 模块发起post请求
    response = requests.post(url=post_url, data=data, headers=headers)

    # --获取响应对象中的数据值 json 串
    dic_obj = response.json()

    fileName = word + '.json'
    fp = open(fileName, 'w', encoding='utf-8')
    json.dump(dic_obj, fp=fp, ensure_ascii=False)
    print('Over!!!')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
#!/usr/bin/python
# -*- coding:utf-8 -*-
# 需求:爬取豆瓣电影分类排行榜
import requests
import json

if __name__ == "__main__":
    url = 'https://movie.douban.com/j/chart/top_list'
    param = {
        'type': '24',
        'interval_id': '100:90',
        'action': '',
        'start': '0',
        'limit': '20'
    }
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0'
    }
    response = requests.get(url=url, params=param, headers=headers)

    list_data = response.json()

    fp = open('./douban.json', 'w', encoding='utf-8')
    json.dump(list_data, fp=fp, ensure_ascii=False)
    print('Over!!!')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
#!/usr/bin/python
# -*- coding:utf-8 -*-
# 需求:爬取药监总局相关数据 : http://scxk.nmpa.gov.cn:81/xk/

import requests
import json
if __name__ == "__main__":
    post_url = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsList'

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:96.0) Gecko/20100101 Firefox/96.0'
    }

    all_data_list = []
    id_list = []
    for index in range(1, 6):
        page = str(index)
        data = {
            'on' : 'true',
            'page' : page,
            'pageSize' : '15',
            'productName' : '',
            'conditionType' : '1',
            'applyname' : '',
            'applysn' : ''
        }
        response = requests.post(url=post_url, data=data, headers=headers)

        # --获取响应对象中的数据值 json 串
        dic_obj = response.json()
        for dic in dic_obj['list']:
            id_list.append(dic["ID"])

    post_url1 = 'http://scxk.nmpa.gov.cn:81/xk/itownet/portalAction.do?method=getXkzsById'

    for nid in id_list:
        data1 = {
            'id' : nid
        }
        detail_json = requests.post(url=post_url1, data=data1, headers=headers).json()
        all_data_list.append(detail_json)
        print(detail_json, '----------ending-------')

    fp = open('./yao.json', 'w', encoding='utf-8')
    json.dump(all_data_list, fp=fp, ensure_ascii=False)
    print('Over!!!')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

第三章 Python 数据分析

聚焦爬虫:爬取页面中指定的页面内容

数据解析分类:

  • 正则
  • bs4
  • xpath(***)

数据解析原理概述:
– 解析的局部的文件内容都会在标签之间或者标签对应的属性中进行存储
– 进行指定标签的定位
– 标签或者标签对应的属性中存储的数据值进行提取(解析)

#正则表达式
import re
key = 'javapythonc++php'
ret = re.findall('python', key)[0]
print(ret)

key = '<html><h1>hello world<h1></html>'
ret = re.findall('<h1>(.*)<h1>', key)[0]
print(ret)

str = '这桌子长度120'
ret = re.findall('\d+', str)
print(ret)

key = 'http://www.baidu.com and https://boob.com'
ret = re.findall('http?://', key)
print(ret)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17