2018/01/22 爬虫日记

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基本爬虫——相关库和框架爬虫



























你可能感兴趣的:(python日记)