Ⅰ.编码(encode)
>>> '你好'.encode(encoding='utf-8')
b'\xe4\xbd\xa0\xe5\xa5\xbd'
Ⅱ.解码(decode)
>>> b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode(encoding='utf-8')
你好
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)
Ⅰ.读方法
Ⅱ.写方法
Ⅰ.二进制编码
open('./tupian.jpg',mode='wb')
open('./tupian.jpg',mode='rb')
Ⅱ.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导入语句在最后
Ⅰ.Ctrl+Shift+I打开检查
Ⅱ.在右侧Elements中可以查看整个页面的源代码
Ⅲ.Network中可以记录网页所有请求与响应的详细信息
Ⅰ.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换源
Ⅰ.打断点
Ⅱ.以Debug模式运行
Ⅲ.向下单步执行,观察变量值
Ⅰ.bs库只适合Python2时代,适合Python3时代的是bs4库
Ⅱ.BeautifulSoup4库的的名字是bs4,包的名字和包元信息名不一样,素以在导入时要注意库名
from bs4 import BeautifulSoup
Ⅰ.XPath语句符号与含义
/la/b/of/k
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
爬取煎蛋网标题信息脚本:
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)
对网易新闻的头条新闻进行跳转爬取脚本:
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")
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)
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}张图片保存完毕')
>>> name = '小明'
>>> age = 13
>>> print('我叫{},今年{}岁'.format(name.age))
我叫小明,今年13岁
>>>print(f'我叫{name},今年{age}岁')
我叫小明,今年13岁
- 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)
Ⅰ.静态网站
Ⅱ.动态网站
动态网站爬取步骤:
①打开network查看实时请求信息
②清空network,翻动网页,看看哪些是JS或XHR的二次请求,按Ctrl+F搜索关键字,找到请求文件
③查看二次请求的:
(1)General > Requesr URl请求地址
(2)Resquest Headers > cookie文件,referer文件和user-agent文件作为头文件
(3)Query String Parameters内的参数作为params参数
④使用伪造的请求头和参数对网站进行爬取操作
Ⅰ.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格式
步骤:
①导入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()
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
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)
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}')
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')
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')