Python实训笔记

Day One

1.编码和解码

Ⅰ.编码(encode)

 >>> '你好'.encode(encoding='utf-8')
 b'\xe4\xbd\xa0\xe5\xa5\xbd'

Ⅱ.解码(decode)

 >>> b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode(encoding='utf-8')
 你好

2.读写本地纯文本文件

  • 创建文本文档
  • 文件打开方法def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)(可通过PyCharm查询:按住Ctrl不放,将鼠标放在方法上可以显示详细内容)

文本打开格式:
‘r’ open for reading (default)
‘w’ open for writing, truncating the file first
‘x’ create a new file and open it for writing
‘a’ open for writing, appending to the end of the file if it exists
‘b’ binary mode
‘t’ text mode (default)
‘+’ open a disk file for updating (reading and writing)
‘U’ universal newline mode (deprecated)

Ⅰ.读方法

  • read():读取整个文件,返回字符串型数据
  • readline():读取文件中的一行,返回字符串型数据
  • readlines():读取整个文件,返回列表型数据
  • readable():判断文件是否可读,返回布尔值

Ⅱ.写方法

  • write():将字符串型信息写入文件
  • writelines():将列表型信息写入文件
  • writeable() :判断文件是否可写,返回布尔值

3.非纯文本文件的读写

Ⅰ.二进制编码

  • 图片也是以二进制形式存储每一个像素,以JPG方式进行编码,所以可以使用二进制读写来实现图片的读写
 open('./tupian.jpg',mode='wb')
 open('./tupian.jpg',mode='rb')

Ⅱ.Base64编码

  • Base64编码是ASCII码的子集
  • base64编码最终结果是以字符串的形式表示二进制
  • base64编码解码的过程是对二进制码进行加密,加密前后都是二进制形式
  • 图片也可以按照base64进行编码,然后写入文件

①编码

>>> a = 'hello'
>>> mi = base64.b64encode(a.encode(encoding='utf-8')) 
>>> ma = mi.decode(encoding='ascii')
>>> print(ma)
aGVsbG8=

②解码

>>> base64code = 'aGVsbG8='
>>> jie = base64.b64decode(base64code.encode(encoding='ascii'))
>>> da = jie.decode(encoding='utf-8')
>>> print(da)
hello

ps.相对路径
同级路径:’./’
父级路径:’…/’
Ctrl+ ’ / ':对选中内容快速注释
编码方式:
ASCII 1字节
GBK(GB2312)2字节
UTF-8 3字节
Unicode(万国码) 4字节
Tab键可以增加一个缩进(四个空格)
Shift+Tab可以减少一个缩进
Alt+Shift+鼠标左键拖动可以进入列编辑模式
Code > Reformat Code 可以将代码以相应语言风格格式化
导包时,习惯性把内置库写在最上面,三方库第二,from导入语句在最后

Day Two

1.HTTP协议

2.Google Chrom

Ⅰ.Ctrl+Shift+I打开检查
Ⅱ.在右侧Elements中可以查看整个页面的源代码
Ⅲ.Network中可以记录网页所有请求与响应的详细信息

3.pip包的管理

  • 包/库:已经写好的代码,可以直接引用,含有_ _init_ _.py文件
  • 内置库,在python解释器位置的**/lib** 目录下
  • 三方库:PyPI.org上有各种各样功能的开源库
  • pip安装的第三方库位置: 解释器目录\lib\site-packages

Ⅰ.pip包管理工具

pip常用方法 :
pip -v :查看pip版本号
pip search requests :搜索requests包信息
pip install requests :安装第三方库
pip uninstall requests :删除已安装的的第三方库
pip list :展示已安装过的所有库
pip freeze > ok.txt :将库中内容导入ok.txt

Ⅱ.pip换源

  • 因为外网的限制导致某些库下载速度很慢,所以需要切换到国内的源

国内常用源:
豆瓣
https://pypi.doubanio.com/simple/
阿里云
https://mirrors.aliyun.com/pypi/simple/
清华大学
https://pypi.tuna.tsinghua.edu.cn/simple/
https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/

①.临时换源

 pip install requests - i https://pypi.douban.com/simple/

②.永久换源
通过配置pip文件中的pip.conf文件,写入配置

pip install pip -U  #将pip升级为最新版本
pip config set global.index-url https://pypi.douban.com/simple/

③.通过PyCharm换源

  • 步骤:File>Settings>Project>Python Interpreter>点击右边加号>Manage Repositories>右边加号添加新源
    Python实训笔记_第1张图片

  • 新源添加完成后,只需切换源即可

4.调试运行模式

Ⅰ.打断点
Ⅱ.以Debug模式运行
Ⅲ.向下单步执行,观察变量值

5.BeautifulSoup库

Ⅰ.bs库只适合Python2时代,适合Python3时代的是bs4库
Ⅱ.BeautifulSoup4库的的名字是bs4,包的名字和包元信息名不一样,素以在导入时要注意库名

from bs4 import BeautifulSoup

6.XPath表达式

Ⅰ.XPath语句符号与含义

  • ’ / '表示下一层级 /la/b/of/k
  • ’ // '表示忽略任意父级目录
  • ’ @herf '表示取herf标签的属性
  • ‘ text() ’表示取标签中间的内容
  • ‘ [ ] ’表示过滤[ ]中的属性

7.etree

  • etree方法可以把HTML文件转换为etree类型的文件,可以使用XPath语句查询
from lxml import etree
html= ' html文件 '
dom = etree.HTML(html) #将html文件转换为etree类型
xpath_pattern = 'xpath表达式'
anser = dom.xpath(xpath_pattern)   
#将etree类型的dom按xpth_pattern查找,结果以列表的形式存入anser

Day Three

1.爬虫尝试

爬取煎蛋网标题信息脚本:

import requests
from lxml import etree

url = 'http://jandan.net'

headers = {
    # 'coocckies':,
    # 'refer':
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
}

resp = requests.get(url,headers=headers)
if resp.status_code  == 200:
    html = resp.text
    dom = etree.HTML(html)
    xpath_pattern = '//div[@class="post f list-post"]//h2/a/text()'
    titles = dom.xpath(xpath_pattern)
for i in titles:
    print(i)
  • 请求头在network里的headers里面存放
  • headers头文件可以用于识别是否爬虫脚本,较少网站会使用,可以自行加入跳过检测
  • Ctrl+F可以在Elements里面以XPath,String,selector查找信息
  • 部分网页使用动态请求,页面加载不是一次而成的,会使xpath语句产生问题,可以在Elements中找到,但无法爬取信息,可以通过network查看重新请求页面的代码,在network中看到的是最后一次的请求信息,然后使用xpath语句定位查询
  • 页面跳转可以通过获取子页面连接,使用requests.get()方法进行跳转获取新页面的HTML文件,然后按照原方法对子页面进行信息爬取
对网易新闻的头条新闻进行跳转爬取脚本:

import requests
from lxml import etree

url = 'https://news.163.com/'

resp = requests.get(url)
if resp.status_code == 200:
    html = resp.text
    dom = etree.HTML(html)
    xpath_pattern = '//div[@class="news_default_news"]//a/@href'
    url_list = dom.xpath(xpath_pattern)

for href in url_list:
    resp1 = requests.get(href)
    html1 = resp1.text
    dom1 = etree.HTML(html1)
    news = dom1.xpath('//div[@class="post_body"]//p/text()')
    for i in news:
        print(i)
    print("\n\n\n\n")

2.OS库

  • Operate System :系统管理库,可以对文件夹的增删改查,是python内置库
import os

#打印当前工作目录下的文件和文件夹信息
print(os.listdir())

#查看当前工作目录
print(os.getcwd())

#改变工作目录
print(os.chdir('../Day 2'))
print(os.listdir())

#判断是否存在文件或文件夹
print(os.path.exists('./aaa'))

#创建文件夹
os.mkdir('./aaa')
print(os.path.exists('./aaa'))

#获取当前脚本所在的文件夹,__file__特殊变量代表脚本自己
print(os.path.dirname(__file__))

#拼写文件完整路径
file_path= os.path.join(os.path.dirname(__file__),'aaa','test.jpg')
print(file_path)

3.图片爬虫

  • 图片以二进制的形式存放在content参数中,使用requests.content()方法获取
  • 还需要创建文件夹,并且创建jpg文件,使用wb格式打开文件存入图片
import os
import requests
from lxml import etree

headers = {
    # 'coocckies':,
    # 'refer':
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                  'AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/87.0.4280.141 Safari/537.36'
}

album_url = 'https://www.ivsky.com/tupian/lugui_v62472'

resp = requests.get(album_url)
status_code = resp.status_code

if status_code == 200:
    html = resp.text
    album_dom = etree.HTML(html)
    img_pattern = '//div[@class="il_img"]/a/img/@src'
    title_pattern = '//h1/text()'
    image_src_list = album_dom.xpath(img_pattern)
    album_title = album_dom.xpath(title_pattern)[0]
    # 爬取回来的title名可能有空格,但windows资源管理器路径不支持空格存在,
    # 所以用strip()方法消除末尾空格
    album_title = album_title.strip()
    # print(image_src_list)
    # print(album_title)

if not os.path.exists('./'+album_title):
    os.mkdir('./'+album_title)

for i, image_src in enumerate(image_src_list):
    image_src = 'https:' + image_src
    nice = requests.get(image_src, headers=headers)
    image_content_bytes = nice.content

    image_path = os.path.join(os.path.dirname(__file__), album_title, f'test{1+i}.jpg')
    with open(image_path, mode='wb') as f:
        f.write(image_content_bytes)
        print(f'第{i+1}张图片保存完毕')

4.格式化

>>> name = '小明'
>>> age = 13
  • 方法一:format方法
>>> print('我叫{},今年{}岁'.format(name.age))
我叫小明,今年13
  • 方法二:f特殊标志(python3.5以后出现)
>>>print(f'我叫{name},今年{age}岁')
我叫小明,今年13

Day Four

1.京东商品评价爬虫

  • JS动态网站:第一次请求从后台收到HTML源代码,只包含网页菜单导航等公共部分和JS,浏览器获取第一次响应后,解析JS,JS发起后续异步后台请求(xhr),通过JS把数据渲染到某一处div里面,使用会看到完整页面
  • network的JS类型请求界面中,如果代码是一行可以用左下角的{ }符号pretty print将代码格式化
  • 本次的请求头可以加上Referer参数,否则有可能会拒绝访问
  • 京东的评论页返回的jsonp格式文件,设计跨域问题,需要将jsonp先转换成json文件

解决方法:
① 删除不必要的的字符串
②从网上找jsonp转换器
③使用正则表达式

  • 按照需求对方法进行封装
import requests
import json

base_url = 'https://club.jd.com/comment/productPageComments.action'

# Alt+Shift+鼠标左键拖动进入列编辑模式
params = {
    # 'callback': 'fetchJSON_comment98',      # 本例中可以通过删除callback参数获取json文件
    'productId': 100009077475,    # 商品id
    'score': 0,
    'sortType': 5,
    'page': 1,                    # 评论页码
    'pageSize': 10,
    'isShadowSku': 0,
    'rid': 0,
    'fold': 1
}

# 本次的请求头可以加上Referer参数,表示请求从何处来
headers = {
    # 'coocckies':,
    'Referer': 'https://item.jd.com/',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                  'AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/87.0.4280.141 Safari/537.36'
}

resp = requests.get(base_url, headers=headers, params=params)
if resp.status_code == 200:
    comment_json = resp.text
    # print(comment_json)
    # 京东评论页返回的jsonp格式文件,设计跨域问题,需要将jsonp先转换成json文件

    comment_json_obj = json.loads(comment_json)
    # print(comment_json_obj)

    comments = comment_json_obj['comments']
    for comment in comments:
        cid = comment['id']
        content = comment['content']
        creation_time = comment['creationTime']
        product_color = comment['productColor']
        product_size = comment['productSize']
        print('—'*100)
        print(cid, content, creation_time)

2.静态网页与动态网页

Ⅰ.静态网站

  • 一次成型,直接可以访问所有的界面信息

Ⅱ.动态网站

  • 分步成型,多用于大型网站,没必要一次加载所有信息的网站,部分信息会随着用户的浏览进行加载,未访问到的部分不加载
  • 常用JS等语法进行二次请求,一般这种网页爬取相对麻烦

动态网站爬取步骤:
①打开network查看实时请求信息
②清空network,翻动网页,看看哪些是JS或XHR的二次请求,按Ctrl+F搜索关键字,找到请求文件
③查看二次请求的:
(1)General > Requesr URl请求地址
(2)Resquest Headers > cookie文件,referer文件和user-agent文件作为头文件
(3)Query String Parameters内的参数作为params参数
④使用伪造的请求头和参数对网站进行爬取操作

3.JSON

  • JSON可以解决不同语言之间的冲突,实现数据结构的统一

Ⅰ.JSON语法格式

{ } 内写键值对属性和值
[ ] 表示数组
“ ” 字符串用双引号括起来
常用类型变量或常量

xiaoming_json_str = """
    {
        "name" : "小明",
        "age" : 13,
        "parent" : [
            {
                "name": "小明爸爸"
            },
            {
                "name": "小明妈妈"
            }
        ]
    }
"""

Ⅱ.JSON库

import json  # python内置库

json.load()
#load方法可以使.json文件转换为python内置对象类型,如字典,列表
json.loads()
#loads方法可以把json格式变量转换为内置对象类型

json.dump()
#将python内置对象类型文件打包为json格式
json.dumps()
#将python内置对象类型变量打包为json格式

Day Five

1.SQlite3库的使用

步骤:
①导入sqlite3包
②使用connect方法建立连接
③使用cursor方法创建游标
④使用execute方法写入SQL语句
⑤使用插入,更新操作时,需要使用commit方法确认提交
⑥结束后关闭游标,断开连接

import sqlite3

# 建立连接
connect = sqlite3.connect('./testsqlite.db')
# 创建游标
cursor = connect.cursor()

# 创建表
cursor.execute(
    """
    CREATE TABLE IF NOT EXISTS student (
        id INTEGER PRIMARY KEY,
        name TEXT,
        age INTEGER
    );
    """
)

# 插入数据
cursor.execute(
    """
    insert into student (name, age) values ('小明',13);
    """
)
# 插入,更新语句需要提交确认
connect.commit()

# 查询语句
cursor.execute(
    """
    SELECT * FROM student;
    """
)
result_set = cursor.fetchall()
print(result_set)

# 关闭游标
cursor.close()
# 断开连接
connect.close()

2.数据库图形化工具

  • Navicat
  • mysql phpadminmysql-workbench
  • oracle plsql
  • DataGrip

3.jieba库

  • jieba库是一个三方库,需要下载
  • 生成器(Generator):生成序列、生成列表的制造者。生成器只能被迭代一次,可以通过自带的 _ _ next _ _( ) 方法把大量的数据逐个迭代产生一个迭代器。
  • 列表生成式:
    a = [i for i in Generator]
    # 将Generator生成器遍历后的数据生成列表i然后赋值给a
import jieba

strqs = '我在人民广场吃炸鸡'
words = jieba.cut(strqs, cut_all=False)  # 参数:False表示精确模式
print(type(words))     # words是一个生成器类型变量
print('/'.join(words))    #使用join方法产生一个迭代器

详情链接:https://github.com/fxsjy/jieba

4.停止词

  • 如果想要分析高频词汇,往往逗号,的,地等词汇出现次数最多,影响最终分析结果,所以需要把无用的词汇剔除,也有别人整理好了常见的无用词汇
  • 创建一个新列表,使用for循环让word遍历待清洗列表,如果待清洗列表中的的词汇不在停止词内,则将此词汇添加进新列表
comment_word_list = [',', ',', '同学', '看', '了', '一直', '夸', '太漂亮', '了']
with open('./dict/stop_words_zh.txt', mode='r', encoding='utf-8') as f:
    stop_words = f.read().split('\n')

new_list =[]
for word in comment_word_list:
    if word not in stop_words:
        new_list.append((word))
print(new_list)

Day Six

1.评估情感分数

  • 加载积极词汇库和消极词汇库,然后让数据与两个词库进行比对,比对成功一个就让对应数值加一,就可以获得积极词汇数与消极词汇数,从而进行计算评估出情感分数
with open('./dict/emotion_dict/neg_all_dict.txt', mode='r', encoding='utf-8') as f:
    negative_words = f.read().splitlines()
with open('./dict/emotion_dict/pos_all_dict.txt', mode='r', encoding='utf-8') as f:
    positive_words = f.read().splitlines()
negative = 0
positive = 0
for word in words:
    if word in negative_words:
        negative += 1
    elif word in positive_words:
        positive += 1
print(f'negative words num:{negative}\npositive words num:{positive}')

2.词云图

  • wordcloud库:三方库,使用其中的WordCloud方法
import sqlite3
import jieba
from wordcloud import WordCloud

comment_word_list = [',', ',', '同学', '看', '了', '一直', '夸', '太漂亮', '了']
comments_str = ' '.join(comment_word_list)
# print(comments_str)


font = './simkai.ttf'
wc = WordCloud(font_path=font,
               background_color='white',
               width=1000,
               height=800,
               min_font_size=10,
               max_font_size=100
               ).generate(comments_str)
wc.to_file('./词云图Test.png')

3.数据可视化

  • Pygal库 http://www.pygal.org/en/stable/
  • 常用的图表都有,可以自行选择
  • 保存文件使用render_to_file('文件路径 ') 方法,存为svg格式
import sqlite3
import pygal

connect = sqlite3.connect('../Day 5/JDcomments.db')
cursor = connect.cursor()

cursor.execute("""SELECT COUNT(id),product_color FROM JD_comments GROUP BY product_color;""")
data = cursor.fetchall()

pie_chart = pygal.Pie()
pie_chart.title = 'iphone 颜色爱好饼状图'
for i in data:
    # print(type(i[1]), i[0])
    pie_chart.add(i[1], i[0])
pie_chart.render_to_file('./JD评论数据可视化.svg')

你可能感兴趣的:(python)