20171024
①导入自定义的模块(如类),需要在当前类作导入
类的引用声明,如self.tool = tool.Tool()
20171025
①正则表达式:两个<><>之间匹配不到的时候需要考虑
换行符的存在,加上.*?即可。
②注意每行代码的缩进。
③中文编码问题:decode('
utf-8') decode('
gbk')
④文件读写:file=open(文件名,打开格式),file.write()
⑤格式化字符%%,输出%
⑥用于判断的逻辑变量,False True 和0 1 不同
20171026
①写入图片,urlopen,read,write。注意文件名为xxx.jpg
②下载图片的网络响应问题IOError: [Errno ftp error] [Errno 10060]
③os.makedirs创建文件目录,os.path.exists检查是否存在。
④python爬虫实战四心得:给定图片URL抓取图片下载到本地,可行。但比如一个mm的个人网址多个图片抓取就提示10060。
20171027
①尝试列表多个图片URL,抓取导入本地,3个,可行。
②淘女郎mm图片链接 + 上“https:”后,可以实现抓取。多个链接抓取图片实现。
③抓取新的模特的时候,发生错误,'NoneType' object has no attribute 'group'
④第一次尝试为重新执行抓取,因为有时候第一次就会弹出这个错误,有时候是第二次.etc
2017/11/03(之前第一次记录日记丢失,11/06补上)
①获取图片URL有问题,不再继续学习。转爬虫框架和高级工具(库)。
②requests库,requests.post\get\delate\head\options\,cookies,timeout,会话session持久,verify,proxies
③Beautiful Soup库,安装。导入from bs4 import BeautifulSoup。输出.prettify。标签\字符串\注释。
④遍历,直接子(children\contents)\所有子孙(descendants)\内容(strings)\父节点(parent)\s\
兄弟(next_sibling\previous_sibling)\s\next_element\previous
⑤搜索,findall\find\
⑥CSS选择器,标签\类名\ID\组合,注意同一节点中的组合中间不能加空格。
⑦开始学习Xpath,lxml。
2017/11/06
①装机图表,excel VBA函数实现自动更新进程点的颜色。
②在excel打开时自动执行VBA函数代码,目前仅能在thisworkbook下定义函数\直接写代码\新建模块定义函数,然后open事件中call。
③方法二。在对应的sheet的private sub worksheet_Activate代码下,不定义函数,直接写代码,
然后在open中调用sheet3.activate(随后\之前需要activate其他sheet才行)即可。
④条件格式的数据条表达进度百分比,直接“=”会出错。
解决方法:在thisworkbook下定义函数Sheets(3).Range("C16") = Sheets(3).Range("F20")
然后在open中call即可。
⑤冻结窗口的灵活变动。
⑥接着学习xpath语法和lxml解析库。
2017/11/07
①Xpath语法。
②节点关系,父\子\同胞\先辈\后代。
③选取节点。nodenamme(节点名称)、/(直接子元素)、//(所有元素)、.(
选取当前节点)、..(当前节点的父节点)、@(属性)。
④谓语,在[]中。
⑤*表示任意匹配。
⑥运算符。
①phantomjs工具,浏览器引擎。运行失败 can't open文件。
②Selenium,自动化测试工具,驱动浏览器/PhantomJS,支持python。
③用python写selenium去驱动phantomjs来模拟浏览器爬虫。
④关于浏览器driver的问题,重启/添加具体路径
webdriver.Chrome("C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
2017/11/08
①团建影片记录,寻找PPT模板/AE模板,
知乎资源海量。
2017/11/09
①合同审批核准流程。询问IE孙木。
②AE模板制作团建影片,可以简单更换图片、文字。
③AE输出文件太大,AVI格式,需要下载media encoder。
④selenium模拟输入、搜索,封装。
⑤AE模板研究,能操作进程(一个模板分为几大进程)、文字(大小、格式、位置)、图片(更换、修改)、
背景音乐(添加到下方播放条)。
⑥第一个团建影片建立完成。
2017/11/10 周五
selenium总结
①获取 .find_element_by_id/name/tag_name/xpath
②输入 .send_keys()
③模拟点击 .send_keys("and some",Keys.ARROW_DOWN)
④清除文本 .clear()
⑤下拉选项卡 select_by_index/visible_text_value Select(driver.find_element_by_name("选项卡名称"))
取消 deselect
提交 .click()/submit()
⑥元素拖拽 ActionChains.drag_and_drop(element,target).perform()
⑦页面切换 .switch_to_window("windowName/framename.0.child")
⑧弹窗 driver.switch_to_alert()
⑨等待时间 WebDriverWait(driver,10).until()
driver.implicitly_wait()
PyQuery总结
①初始化 import后pq(代码/URL/文件)
②属性操作 p.attr("id","xx")
③遍历 .items
④网页请求 pq("url")
爬虫框架PySpider和Scrapy
PySpider
主要架构:scheduler(调度器),fetcher(抓取器),processor(脚本执行)
可灵活使用各种python库对页面进行解析
2017/11/13 周一
Scrapy学习
主要组件:引擎scrapy、调度器scheduler、下载器downloader、爬虫spiders、项目管道pipeline
下载器中间件、爬虫中间件、调度中间件。
过程: ①scrapy从scheduler取出url,封装成request请求,传给downloader
②downloader下载页面,封装成应答包response,传给spiders
③spiders解析response,若是item,交给pipeline
若是URL,交给scheduler
2017/11/14 周二
试运行PySpider,提示HTTP 599: SSL certificate problem: self signed certificate in certificate chain
解决方法:在crawl中加入忽略证书验证的参数,validate_cert=False。
2017/11/15 周三
①PySpider的运行 cmd启动,端口运行,打开 http://localhost:5000 ,进入PySpider的界面
②PySpider代码,较多新内容。
③多线程和多进程
多线程的缺点:拿到GIL的CPU才能运行线程,多个核竞争一个GIL导致线程颠簸,效率更低。(不同代码块交替执行)
多线程运行同一代码块,会出现线程不同步,比如12112。
改进:python的Queue模块,能够实现线程间的同步。
多进程:每个进程有各自独立的GIL。(不同代码块同时执行)
④多线程:直接利用函数创建多线程:
thread.start_new_thread(print_time, ("Thread-1", 2,))
thread.start_new_thread(print_time, ("Thread-2", 4,))
使用Threading模块创建线程,直接从threading.Thread继承,然后重写init方法和run方法
⑤线程同步:(类似GIL的用途),访问共享数据必须的锁,唯一,有锁才能访问。
2017/11/16 周四
多进程(python包:multiprocessing)
①多进程能够充分利用多核CPU的资源,单进程转并发执行。
Process([group [, target [, name [, args [, kwargs]]]]])
②多进程也会出现 “互斥”的现象,需要类似GIL的lock避免同时访问临界资源(如print)而出问题。
2017/11/17 周五
①Semaphore信号量,控制临界资源的数量
②Queue队列,用于进程间的通信。
③Pipe管道
④Pool进程池,分为阻塞和非阻塞。
ADSL
代理过程:每拨号一次,IP更换。通过动态域名解析和端口映射,SSH连接。
爬虫第一次总结:
先是简单了解爬虫这个概念,入门爬虫的获取网页代码是urllib和urllib2,Request/urlopen
入门匹配是正则表达式(.*?)
了解cookie的用途
之后学习了入门的几个例子,获取贴吧内容,只看楼主,忽略图片,去掉多余的HTML符号,输入一次弹出一楼帖子
写入本地文件夹,获取帖子标题,添加分隔符。
接着学习图片链接的打开,urlopen/read/write即可,目录的新建和检测。
然后接触爬虫的高级库和工具,主要有Requests库/Beautiful Soup库/Xpath语法、lxml库/PhantomJS浏览器引擎/
Selenium库,用于页面交互/
PyQuery库
最后学习了两个爬虫框架,Scrapy和PySpider。
①PySpider上手简单,操作更加简单,配有WEB界面,集成了phantonjs。
②Scrapy自定义程度较高,适合学习研究。
2017/11/20 周一
①食谱PPT排列logo像素。
②学习VBA写条件格式。
③PS图像像素处理。
2017/11/21 周二
①excel VBA cells(x,y) x代表行,y代表列。
②VBA中语法不同于excel,类似一般的程序语言。
③尝试修改excel条件格式,使得整数变红,找不到解决方法。直接输入整数替换可以变色。
2017/11/21 周三
爬虫入门经验学习
①python基本功:list/dict/切片/if/for/while/文件读写操作
②网页的基本知识:基本的HTML语言知识,href等
网站的发包和守包概念
动态网页JS知识
③分析语言:正则表达式
XPATH(bookstore//book),抓取框架化,能轻松寻找指定的元素,适合复杂页面
Beautifulsoup美丽汤模块,遍历、解析,适合简单页面
④高效的辅助工具:F12开发者工具
抓包工具httpfox
Xpath Checker火狐插件,xpath测试工具
正则表达式测试工具http://tool.oschina.net/regex/
⑤模块:urllib
urllib2
requests(负责连接网络,处理http协议)
⑥爬虫框架:scrapy
⑦动态页面:selenium
phantomJS(不显示网页的selenium)
⑧反爬虫策略验证码:PIL
opencv
pybrain
打码平台
⑨数据库:mysql
mongodb
sqllite
⑩数据分析:numpy,类似matlab的模块
pandas,基于numpy的数据分析模块
进阶技术:多线程
多进程
分布式
CSDN博客爬虫入门总结
①URL:统一资源定位符,http,ftp,file等
URI:统一资源标识符,web资源,如HTML,图像,视频,程序等
URL是URI的子类。
2017/11/23 周四
①urllib2,获取网页用Request
发送data,可以编码urllib.urlencode,然后post/get,两者区别在于添加的位置不同
Headers设置,模拟浏览器
②http获取异常和状态码
HTTPError是URLError的子类
HTTPError状态码分为5种类型:200/201/202/204表示请求成功
300/301/302/304表示重定向等
400非法请求/401未授权/403禁止/404没有找到
5XX服务器出现错误
两种测试Error方法:先except HTTPError再except URLError,(先确定发生error的具体状态码,再确定大体上的reason)
(父类的异常先写到子类异常的后面,如果子类捕捉不到,则到父类)
except URLError,if hasattr(e,'code')hasattr属性对e进行判断
④opener与handler
urllib2的两个方法:geturl获取重定向的url,info返回页面情况
Openers和Handlers
⑤urllib2的技巧
proxy/timeout/header/redirect/cookie/put/referer
Scrapy爬虫框架中文介绍
看不懂,哈哈
2017/11/24 周五
用爬虫能干嘛
1.爬取数据,进行市场调研和商业分析。
爬取知乎优质答案,为你筛选出各话题下最优质的内容。
抓取房产网站买卖信息,分析房价变化趋势、做不同区域的房价分析。
爬取招聘网站各类职位信息,分析各行业人才需求情况及薪资水平。
2.作为机器学习、数据挖掘的原始数据。
比如你要做一个推荐系统,那么你可以去爬取更多维度的数据,做出更好的模型。
3.爬取优质的资源:图片、文本、视频
爬取知乎钓鱼贴\图片网站,获得福利图片。
学习过程:
1.了解爬虫的基本原理及过程
发送请求——获得页面——解析页面——抽取并储存内容
2.Requests+Xpath 实现通用爬虫套路
对于异步加载的网站,可以学习浏览器抓包分析真实请求或者学习Selenium来实现自动化
3.了解非结构化数据的存储
文档形式,存在 本地 or 数据库
text/csv
爬取的数据要进行预处理,去掉多余的空格\标签\换行符
4.学习scrapy,搭建工程化爬虫
便捷地构建request
强大的 selector 能够方便地解析 response
超高的性能,可以将爬虫工程化、模块化
5.学习数据库知识,应对大规模数据存储与提取
MongoDB
可以利用PyMongo,更方便地在Python中操作MongoDB
数据如何入库、如何进行提取
6.掌握各种技巧,应对特殊网站的反爬措施
反爬:被网站封IP、各种奇怪的验证码、userAgent访问限制、各种动态加载、异步加载等等。
技巧:访问频率控制、使用代理IP池、抓包、验证码的OCR处理等等。
7.分布式爬虫,实现大规模并发采集,提升效率
Scrapy + MongoDB + Redis 利用多线程的原理让多个爬虫同时工作
Redis 则用来存储要爬取的网页队列
xpath语法适合通用,按F12检查列出的标签列表就能写xpath,
比bs4好的一个地方在于:不用一层层检查元素代码
获取网页后需要使用lxml的etree库,etree.HTML()初始化
①//获取所有
②/获取子元素
③//@class获取属性
④对比,//@class=“xxx”返回true or false
⑤//*[@class=“xxx”] 获取属性为xxx的元素
⑥//xx/text获取xx标签的text内容
⑦xpath得到的结果是list,[xxx,xxx,...]
⑧此外,xpath搜索到的元素是list生成器,
需要作字符串转换,etree.tostring()
学习该段爬虫经验:
①代码开头需要表明编码:# -*- coding:utf-8 -*-
②输出编码问题,输出u'xxx',u'xxx',...等时,可以for逐项输出即可。
③遇到乱码问题,xx.decode('gbk'),不适用于对象为list,只能是str类型
UTF-8:国际编码,包含全球字符
GBK:中国编码,包含全部中文字符
2017/11/17 周一
①爬到的数据存在本地,在写入前,对于每一条评论str(for循环),需要i.encode('utf-8'),
才能write到文件。
②数据前后加上换行符:\n i="\n"+i+"\n"
2017/11/28 周二
①Requests比python自带的urllib/urllib2 更高一阶
正则表达式
常用符号
.:匹配任意字符,换行符\n除外, 类似一个占位符
*:匹配前一个字符0次或无限次
?:匹配前一个字符0次或1次
+:匹配前一个字符1词或无限次
.*:贪心算法,能找到多少是多少
.*?:非贪心算法
\d:匹配数字
[abc]:abc任意一个
{m,n}:匹配前一个字符m到n次
| :匹配|左右任意一个
(.*?) :输出符合条件的,将()里结果返回
scrapy框架学习
①在任意目录下shift右击打开命令窗口,创建项目
②item定义爬取的数据,spider定义初始URL,针对后续链接的规则,从页面中提取数据。
③尝试输出,没有结果
2017/11/29 周三
DOE试验设计 minitab软件学习 课程
2017/11/30 周四
minitab和DOE试验 动手操作
专利idea:曝光机一次曝光四片,UM透镜成本问题
2017/12/1 周五
hardram marking
2017/12/04 周一
周会、曝光机分束器设计、daily meeting会议
2017/12/05 周二
2017/12/06 周三
canon marking
2017/12/07 周四
写专利
2017/12/08 周五
应届生异常单检验
工作学习阶段总结
曝光机学习报告
2017/12/11 周一
2017/12/29 周五
重新开始学习python的scrapy框架。
2018/01/02 周二
scrapy框架
爬之后进行取
XPath 非常强大
在scrapy中提供 XPathSelector 类
2018/01/03 周三
操作xpath,先导入selector类,from scrapy.selector import Selector
用路径表达式抓取,存放到字典item中,
item['title'] = site.xpath('a/text()').extract()
然后return items
最后导出为JSON文件,scrapy crawl dmoz -o items.json -t json
①-o 后面是导出文件名,-t 后面是导出类型。
②extract():返回一个unicode字符串,为选中的数据,re()类似,提取真实的原文数据。
.re()方法返回unicode字符串的列表,无法构造嵌套式的 .re() 调用
xpath()和css()可以,所以extract和re作类比。
xpath()和css()返回一系列的selectors(如果不止一个),表示一系列节点
比如多个title
以上的四个基本方法可以避免每次从response中提取数据生成selector的麻烦。
③获取属性 /@href 和匹配属性 [@href=""]
④框架尝试自定义的网站获取,成功后修改失败,新建project再次成功,初步估计是行距的问题。
⑤使用xpath表达式,print指定内容输出成功。
⑥导出空白,估计是编码格式问题。
2018/01/04 周四
①open 文件后再次修改为print,提示unexpected indent,
找到原因:编辑软件Notepad++有问题,导致行距缩进不一样。
②嵌套selector
③多次浏览,每次有不同的理解。
④目前进度:已能够print在命令行中,接下来需要write到文件中。
2018/01/05 周五
①相对XPaths:即嵌套的选择器中,一开始使用.xpath('//div'),
后续使用divs.xpath('//p')的效果不是//div//p,而是所有的p
解决方法:加点前缀xpath('.//p')
或者提取所有直系结果xpath('p')
②命令行工具、item、spiders、selectors、item loaders
③scrapy shell终端试运行失败
④item Pipeline、Feed exports、Link Extractors、Logging、数据收集、发送email、Telnet终端、Web Service
常见问题、调试Debugging
2018/01/09 周二
①图片管道ImagesPineline/scrapy bench性能测试/暂停、恢复爬虫/架构概览
②Downloader 中间件和Spider中间件
③扩展extensions/核心API
④requests/response请求与响应
⑤设置Setting/信号Signals/异常Exceptions
简单看完一遍,很多概念不懂,需要找实例逐渐深入学习。
继续捣鼓 scrapy的write问题
2018/01/10 周三
①对比CSDN两个例子,能够输出到JSON,需进一步分析。
②修改例子(五)的xpath表达式后,能输出中文到JSON文件。(因为原网页已变化)
与之前不能输出的差异地方:pipeline、setting、编码encode
③没有write输出原因是语法错误!!!
④spider must return request,baseitem,dict or none,got list in
输出错误几个注意的点:选择器Selector不能输出
return与yield有区别,return在返回执行结果同时中断程序执行。
yield不了就for循环yield,因为不能yield一个生成器
具体原因要看命令行!!!
⑤接下来是pipeline和setting的熟悉
pipeline的写入可以在spider中实现,注意不能直接输出list或者selector,只能是
string或者buffer
** 之前没输出的问题:没有看命令行
item要注意导入以及在使用前定义好
⑥使用item输出!
导入并定义好item
赋值给item
line = json.dumps(dict(item))
式中dict() 函数用于创建一个字典。返回一个字典。
dumps是将dict转化成str格式
然后write(line)即可
总结:学会看命令行非常重要!
2018/01/11 周四
自动多网页爬虫 核心是CrawlSpider,主要方法是rules
** shell尚未能够运行
①Spider是爬虫的基类,从网页获取link继续爬取用CrawlSpider类
最大的不同:多了一个rules参数,它包含了一个或多个Rule对象
classscrapy.contrib.linkextractors.sgml.SgmlLinkExtractor
(
allow=(),deny=(),allow_domains=(),deny_domains=(),deny_extensions=None,
restrict_xpaths=(),tags=('a','area'),attrs=('href'),canonicalize=True,
unique=True,process_value=None
)
allow:满足括号中“正则表达式”的值会被提取,如果为空,则全部匹配。
deny:与这个正则表达式(或正则表达式列表)不匹配的URL一定不提取。
allow_domains:会被提取的链接的domains。
deny_domains:一定不会被提取链接的domains。
restrict_xpaths:使用xpath表达式,和allow共同作用过滤链接。
范例 rules = [
Rule(SgmlLinkExtractor(allow=('/u012150179/article/details'),
restrict_xpaths=('//li[@class="next_article"]')),
callback='parse_item',
follow=True)
]
②防止被ban的几大措施:
1. 设置download_delay download_delay = 2
2. 禁止cookies 在settings.py中设置COOKIES_ENABLES=False
3. 使用user agent池 建立user agent池爬取前随机获取,并在setting禁止默认
4. 使用IP池
5. 分布式爬取
③目前能继续获取下一网页的内容进行爬取,yield Request(url, callback=self.parse)
方法二: 利用crawlspider更快捷。
④熟悉shell中
⑤item、pipeline和setting的熟悉
换行符\r\n与\n有区别
\n是换行,英文是New line,表示使光标到行首
\r是回车,英文是Carriage return,表示使光标下移一格
\r\n表示回车换行
items.py:定义item字典 name=Field()
pipelines.py:分别定义函数,创建打开文件、对item处理和写入文件
Item Pipeline负责处理被spider提取出来的item。
典型的处理有清理、 验证及持久化(例如存取到数据库中)
def __init__(self):
self.file = codecs.open('xx',mode='wb',encoding='utf-8')
def process_item(self,item,spider):
line = json.dumps(dict(item))+'\n'
self.file.write(line.decode("unicode_escape))
return item
settings.py:配置文件,主要是至执行对spider的配置
* 一些容易被改变的配置参数可以放在spider类的编写中,
而几乎在爬虫运行过程中不改变的参数在settings.py中进行配置。
比如设置cookies_enabled=False,以防被ban
设置启动的pipeline类和启动顺序
设置要用到字典ITEM_PIPELINES = {
'CSDNBlog.pipelines.CsdnblogPipeline':300
}
其中,key为要启动的pipeline类,value为启动顺序,默认为0-1000。
设置spider所在的路径,SPIDER_MODULES = ['xx.spiders']
⑥shell能运行,少了sel,直接用response即可。
⑦遗留问题:多网页自动爬取输出item key顺序问题。发现原因:dumps函数导致
scrapy入门教程:project的命名问题,命名dmoz,ab之类的project运行提示没有items,
而tutorial则没问题
2018/01/12 周五
遗留问题二:早上又运行了一遍,命名tutorials运行没有问题了。。。
尝试ab,也没有问题,但dmoz项目还是提示没有item
查网页:爬虫的名字跟项目的名字一样,导致最终导入的时候出错
然而修改还是报错。
终于找到原因:spider目录下的.py文件的名字跟项目的名字不能相同!
爬虫指spider目录下的.py文件,项目指spider的识别名称name!
然而以前的有相同的情况也可以运行。
初步认定是project名也是dmoz的原因
①保存数据到文件的编码问题
write(data.decode("unicode_escape"))
import codecs也可以实现
②shell终端:熟悉各个命名的作用
request:最近获取到的页面的Request对象
response:最近获取到的页面的Response对象
fetch:根据给定的url或request更新response对象
③目前进度:如何下载并保存图片,学习爬虫的实例。
2018/01/15 周一
①学习回顾excel的vlookup和数据透视表
VLOOKUP(lookup_value,table_array,col_index_num,range_lookup)
Lookup_value为需要在数据表第一列中进行查找的数值
Table_array为需要在其中查找数据的数据表。
col_index_num为table_array 中查找数据的数据列序号。
Range_lookup为一逻辑值,指明函数 VLOOKUP 查找时是精确匹配,还是近似匹配。如果为false或0 ,则返回精确匹配
数据透视表:插入,添加字段到下方区域,修改字段名称,修改行列标签名称。
扩展:创建组、计算字段
最后修改单元格格式与表格格式即可。
②爬虫运用scrapy的具体例子学习
2018/01/16 周二
①scrapy具体实例,xpath路径问题:避免两个//使用,属于嵌套使用的问题,
或者添加点前缀。
②实例没输出,没提示错误。不使用scrapy框架,而是用PyCharm和urllib库来复习爬虫。
对应xpath的用法:from lxml import etree
html = etree.parse()
sel = html.xpath('//li')
结果没输出
③熟悉中文编码问题
2018/01/17 周三
①中文编码知识:
ASCII字符集:American Standard Code for Information Interchange美国信息交换标准码
用8bit来表示一个字符,总共可以表示256个字符。
英文字母再加一些其他标点字符之类的也不会超过256个,故只支持英文。
GB2312:是对 ASCII 的中文扩展。占两个字节。
一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字。
前面的一个字节(高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,
支持6700+汉子。
GBK 标准:GB2312扩展之后的编码方案,之后由于多民族的语言系统,GBK 编码扩充为 GB18030 编码。
Unicode:2-4个字节(16bit)来表示字符,是一个字符集,已经收录136690个字符,并还在一直不断扩张中。
第一步:Unicode是用0至最大值之间的数字来表示所有字符.其中0至127这128个数字表示的字符仍然跟ASCII完全一样.
第二步:怎么把0至最大值这些数字转化成01串保存到计算机中和进行传输。
于是出现了UTF(unicode transformation format),一种编码规则。
有UTF-8:使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个
UTF-16:使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。
UTF-32:使用4个字节表示所有字符;
在py2中,有两种字符串类型:str类型和unicode类型,str存字节数据,unicode存unicode数据;
在py3中,也有两种数据类型,str和bytes; str类型存unicode数据,bytes类型存bytes数据
无论py2,还是py3,与明文直接对应的就是unicode数据,打印unicode数据就会显示相应的明文(包括英文和中文)
存到磁盘上的数据是bytes,离计算机更近的数据。
比如
编辑器
当我们保存的的时候,hello.py文件就以pycharm默认的编码方式保存到了磁盘;
关闭文件后再打开,pycharm就再以默认的编码方式对该文件打开后读到的内容进行解码,
转成unicode到内存我们就看到了我们的明文;
解释器
在运行的时候,先解码成unicode,这个过程和编辑器是一样的(解码的时候不是加载到内存,而是在解释器的运行环境内,作string编码),
再译成C代码再转成二进制的数据流,CPU执行数据流后得到结果内容,
然后将内容加载到内存中,被使用的编辑软件显示出来。
解码了的文本只存在运行环境中,如果你需要打印/保存/输出给数据库/网络传递(加载到内存),就又需要一次编码过程
python的编码分为编辑器和解释器。
解释器:py2默认ASCII码,py3默认的utf8
所以,py2有个问题, 它的默认编码是ASCII,想写中文,就必须声明文件头的coding为gbk or utf-8,
声明之后,python2解释器仅以文件头声明的编码去解释你的代码(unicode)并通过CPU执行,
执行结果(声明的utf-8)加载到内存后,并不会主动帮你转为unicode,而py3则会主动转换。
(原因就是默认的编码方式不同,py3是utf8,传达到内存的时候类似编辑器角色,会自动转码unicode)。
也就是说,py2的声明文件编码是utf-8,加载到内存里,你的变量字符串就也是utf-8,
解释的编码方式不同于编辑的编码方式,py2的默认编码是ASCII,在编辑的时候不能将utf8转unicode,会保持utf8。
意味着,你以utf-8编码的文件,在windows的显示软件(如cmd,默认编码方式gbk)会乱码。
2018/1/18 周四
①python给我们提供了一个包codecs进行文件的读取,这个包中的open()函数可以指定编码的类型:
import codecs
f = codecs.open('text.text','r+',encoding='utf-8')
#必须事先知道文件的编码格式,这里文件编码是使用的utf-8
content = f.read()
#如果open时使用的encoding和文件本身的encoding不一致的话,那么这里将会产生错误
f.write('你想要写入的信息')
f.close()
②>>> s
'\xe8\xb7\xaf\xe9\xa3\x9e' #utf-8 (比如CPU运行后的结果)
>>> s.decode('utf-8') (如果解释器默认的编码规则为utf-8,则会自动执行这一步)
u'\u8def\u98de' #unicode 在unicode编码表里对应的位置
>>> print(s.decode('utf-8')) (pirnt的时候输出前要根据显示软件的编码规则对unicode进行编码)
路飞 #unicode 格式的字符
常见编码错误的原因有:
Python解释器的默认编码
Python源文件文件编码
Terminal使用的编码
操作系统的语言设置
2018/01/20 周六
①excel vba函数
range()函数:表示单元格range("A1")而不是range("ij")
表示连续区域range("a1:b4")
表示不连续区域range("a1:b2,c3:b4")
表示行和列range("1:1").select
range("A65536").End(xlUp).Row:表示A列数据区域最后一行的行号。
如果被选中单元格为空,则一直向上走到第一个非空单元格;
如果被选中单元格为非空,则向上走到最后一个非空单元格。
Range("a1").CurrentRegion返回包含指定单元格的当前区域,以空行和空列作外边界。
UBound:Visual Basic 中的一个函数,用来返回数组或元素相应维度的最大值。
2018/01/22 周一
①excel 选取至最后一行:Ctrl + shift + end
②
信息不对称,闷声赚大钱。
信息对称的利润透明的行业,只能赚辛苦钱罢了。
③python入门——python基本爬虫——相关库和框架爬虫