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>右边加号添加新源
-
新源添加完成后,只需切换源即可
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方法产生一个迭代器
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')