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/

【Python实训笔记】③.通过PyCharm换源
  • 步骤:File>Settings>Project>Python Interpreter>点击右边加号>Manage Repositories>右边加号添加新源
    Python实训笔记
    文章图片

  • 新源添加完成后,只需切换源即可
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 etreeurl = '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 etreeurl = '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 etreeheaders = { # '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_codeif 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://www.it610.com/article/https:' + image_src nice = requests.get(image_src, headers=headers) image_content_bytes = nice.contentimage_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 jsonbase_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 jiebastrqs = '我在人民广场吃炸鸡' 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 WordCloudcomment_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 pygalconnect = sqlite3.connect('../Day 5/JDcomments.db') cursor = connect.cursor()cursor.execute("""SELECT COUNT(id),product_color FROM JD_comments GROUP BY product_color; """) data = https://www.it610.com/article/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')

    推荐阅读