2017年6月

python3中urllib模块使用笔记

urllib模块属于python Internet模块中比较常用的模块,主要是用于HTTP协议和FTP协议,其他常见的internet模块还有httplib、xmllib、ftplib等很多。是我们做网络爬虫首选工具。在python2中,有两个:urllib和urllib2,到了python3中,两者合并为urllib,并且很多的方法都发生了变化。

1、urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None) # 包装请求内容

参数释义

url:目标网址
data:Post提交的数据,根据官方文档说明,这个参数默认为None,当不为空时,使用POST替代GET方法发送数据给服务器。
headers:参数值应为一个字典,由于许多服务器禁止脚本访问,只支持普通的浏览器访问,所以要通过headers的值来模拟浏览器访问。
origin_req_hos和unverifiable是用于正确处理cookie的,不做深入研究,可参考官方文档:

origin_req_host should be the request-host of the origin transaction, as defined by RFC 2965. It defaults to http.cookiejar.request_host(self). This is the host name or IP address of the original request that was initiated by the user. For example, if the request is for an image in an HTML document, this should be the request-host of the request for the page containing the image.

unverifiable should indicate whether the request is unverifiable, as defined by RFC 2965. It defaults to False. An unverifiable request is one whose URL the user did not have the option to approve. For example, if the request is for an image in an HTML document, and the user had no option to approve the automatic fetching of the image, this should be true.

method是指明请求方法的字段。官方文档:

method should be a string that indicates the HTTP request method that will be used (e.g. 'HEAD'). If provided, its value is stored in the method attribute and is used by get_method(). Subclasses may indicate a default method by setting the method attribute in the class itself.

单独看这个命令的演示没有实际意义,请结合urlopen一起看。

2、urllib.request.urlopen(req) # 获取指定页面,返回bytes类型,需要用decode('utf-8')解码,转换为str类型

from urllib import request
url = 'http://www.lagou.com/zhaopin/Python/?labelWords=label'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
    'Referer': 'http://www.lagou.com/zhaopin/Python/?labelWords=label',
    'Connection': 'keep-alive'
}
req = request.Request(url, headers=headers) # 包装好头部信息
page = request.urlopen(req).read() # 打开url,并使用read方法读取内容
page = page.decode('utf-8') # 将返回的内容(bytes)转换为人类阅读的utf-8格式
print(page) # 打印结果

运行的效果:

2345截图20170626063016.png

3、urllib.parse URL解析组件

该模块的主要作用是将各种URL转换为标准的URL字符串。

包含urlparse和quote两大类。

暂时只说一下我遇到的quote大类中的urlencode。

这个urlencode作用是将请求的数据(一般为字典)转换为ascii格式,这样会避免报错。

from urllib import parse
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
    'Referer': 'http://www.lagou.com/zhaopin/Python/?labelWords=label',
    'Connection': 'keep-alive'
}
h = parse.urlencode(headers)
print(h)

运行结果:

2345截图20170626071501.png

python3中time库使用笔记

python3里很多库的使用都和python2里不同了,所以做了个系列笔记,当工作中碰到了某个库,就记录在这里。

time库主要有用来对时间进行操作。

1、time.time() 获取当前时间戳(1970纪元后经过的浮点秒数)

import time
print(time.time())
输出:
1498428559.7719462

Python基础语法和常用工具笔记

本文记录的是在使用python过程中遇到的基本语法和常用函数、动作

1、global 定义全局变量

相对于局部变量而言,global的作用是,在函数内定义一个全局变量,这样在函数内对该变量的操作,在全局都有意义。为什么不直接在函数外直接进行定义呢?原则上可以,但不建议这么做,因为那样可能导致我们在阅读代码时,不知道某个变量是如何来的,作用是什么。而在函数内,通过global xxx的形式,能方便的知道该变量的来龙去脉。

def func():
    global x  # 定义全局变量x,作用域为全局
    x = 1     # 将x的值设置为1
func()  # 执行一下func,使全局变量生效
print(x) # 打印x的值(注意除了在函数func内,我们未在其他地方定义过x)

执行结果:1

您可以尝试去掉global,将会得到一个报错,说x未被定义:NameError: name 'x' is not defined

2、int(flo) 将浮点转换为整数

flo = 3.14
print(int(flo))

输出:3

实例1:获取时间戳

import time
print(time.time()) # 这里返回的是一个类似1498428421.5438452的浮点型时间戳
print(int(time.time())) # 这里将返回的浮点型数字转换为整数时间戳

WIN8下python3使用os.system命令输出时Hbuilder控制台出现中文乱码的解决方法

未命名-1.jpg

故障表现状态

2345截图20170625173632.png

原因分析及解决过程

由于python3默认采用了UTF-8编码,而WIN8的CMD窗口采用的是GBK编码,导致了编码不同。

但是,如果简单的通过encode('gbk')之类的方法,不能解决根本问题。

尤其是当我们根本不是使用print命令来输出,而是控制台默认输出的情况下,是没办法修改os.system的编码格式的,因为os.system执行命令返回的并不是命令中出现的文本,而是一个int,为0时表示成功,为1时表示异常。

后来通过搜索hbuilder相关文章已经无法解决,想到hbuilder其实是eclipse内核的,所以搜索了eclipse+控制台+乱码,发现一篇文章:

http://blog.csdn.net/forandever/article/details/24811273

大概意思是,修改运行环境。瞬间醍醐灌顶啊:输出不是问题,问题出在控制器的显示本身了。

于是按照前辈的方法,解决了问题,解决方法如下:

解决方案

1、在代码编辑区点击右键,选择“运行方式”->“运行 配置(N)”,如图:

2345截图20170625173827.png

2、在弹出的“运行 配置”窗口中,选择左侧的文件(你在编辑的文件,应该是默认选了的),右边选择“公共”选项卡,如图:

2345截图20170625173929.png

3、 在公共选项卡中,将“编码”项的设置修改为“其他(E)”->“GB2312”,这里默认是缺省值UTF8,如图:

2345截图20170625174053.png

4、点击“应用”,然后关闭。

5、再运行一下看看,是不是变成中文了?

2345截图20170625174251.png

唠叨一句

这个问题其实无伤大雅,因为程序发布后控制台的东西外人是看不到的。纯粹就是因为看着不顺眼!

python3中os库使用笔记

python3里很多库的使用都和python2里不同了,所以做了个系列笔记,当工作中碰到了某个库,就记录在这里。

os库主要用来对操作系统进行一些操作,本文中使用的全部为windows系统。

1、os.getcwd() 获取当前路径

import os
path = os.getcwd()
print(path)

2345截图20170625162608.png

2、os.system() 执行系统命令,相当于cmd

例1:调用ping命令

import os

os.system('ping 222.222.222.222')

2345截图20170625163133.png

关于这个乱码的事情,请参照我的另一篇文章:WIN8下python3使用os.system命令输出时Hbuilder控制台出现中文乱码的解决方法

例2:查看网络配置

import os

os.system('ipconfig')

2345截图20170626054654.png

例3:打开文件

import os

os.system('call "D:\\aaa.txt"')

2345截图20170626055000.png

3、os.remove(file) 删除文件

import os

os.remove('D:\\aaa.txt')