050模块:模块就是程序(中)
本帖最后由 摆渡终极鉴黄师 于 2017-11-10 16:42 编辑第一种:import 模块名
第二种:from 模块名 import 函数名
第三种:import 模块名 as 新名字
050模块:模块就是程序(下)
本帖最后由 摆渡终极鉴黄师 于 2017-11-11 13:09 编辑def c2f(cel):
fah = cel * 1.8 + 32
return fah
def f2c(fah):
cel = (fah - 32) / 1.8
return cel # 一个简单的模块
然后导入这个模块
第一种
import TemperatureConversion
print("32摄氏度 = %.2f华氏度" % TemperatureConversion.c2f(32))
print("99华氏度 = %.2f摄氏度" % TemperatureConversion.f2c(99))
————————————————————————————
第二种
from TemperatureConversion import c2f, f2c # 这种方法导入的是,整个命名空间会覆盖进来的,里面有什么函数直接写函数名就可以了
print("32摄氏度 = %.2f华氏度" % c2f(32))
print("99华氏度 = %.2f摄氏度" % f2c(99))
也可以使用通配符*,来导入这个模块里的所有命名空间(小甲鱼不推荐的方法)
from TemperatureConversion import *
print("32摄氏度 = %.2f华氏度" % c2f(32))
print("99华氏度 = %.2f摄氏度" % f2c(99))
————————————————————————————
第三种(小甲鱼推荐的方法)
import TemperatureConversion as tc # 名字太长了,这样tc就代表TemperatureConversion命名空间了
print("32摄氏度 = %.2f华氏度" % tc.c2f(32))
print("99华氏度 = %.2f摄氏度" % tc.f2c(99))
051模块:__name__='__main__'、搜索路径和包(上)
本帖最后由 摆渡终极鉴黄师 于 2017-11-12 11:20 编辑def c2f(cel):
fah = cel * 1.8 + 32
return fah
def f2c(fah):
cel = (fah - 32) / 1.8
return cel
def test():
print("测试,0摄氏度 = %.2f华氏度" % c2f(0));
print("测试,0华氏度 = %.2f摄氏度" % f2c(0));
if __name__ == "__main__": # 要测试模块的测试文件中加上这一句,那么才实现去调用test方法,如果name等于这个模块名的话,那么这个模块就被作为模块导入,那么这一句就不用调用test方法了,如果作为主程序的话,那么这个if __name__ == "__main__":就会测试一下
051模块:__name__='__main__'、搜索路径和包(中)
本帖最后由 摆渡终极鉴黄师 于 2017-11-13 16:46 编辑搜索路径 # 不同的操作系统路径会不同的
['', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\Lib\\idlelib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\python36.zip', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\DLLs', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages'] # 模块推荐存放在site-packages,因为这个文件夹本身就是用来存放模块的
>>>
>>> sys.path.append("C:\\Python34\\test") # 加了一个路径
>>> sys.path
['', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\Lib\\idlelib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\python36.zip', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\DLLs', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages', 'C:\\Python34\\test']
>>> import TemperatureConversion
>>> TemperatureConversion.c2f(32)
89.6
>>>
051模块:__name__='__main__'、搜索路径和包(下)
本帖最后由 摆渡终极鉴黄师 于 2017-11-16 19:22 编辑·包(package)
1.创建一个文件夹,用于存放相关的模块,文件夹的名字即包的名字;
2.在文件夹中创建一个__init__.py的模块文件,内容可以为空;
3.将相关的模块放入文件夹中
例如
import TemperatureConversion as tc
改为
import M1.TemperatureConversion as tc # M1是包的名字
然后就可以找到相关的模块了
052模块:像个极客一样去思考(上)
本帖最后由 摆渡终极鉴黄师 于 2017-11-16 19:31 编辑1.打开python3 IDLE
2.打开Help
3.打开Python Docs F1
052模块:像个极客一样去思考(中)
本帖最后由 摆渡终极鉴黄师 于 2017-11-16 19:33 编辑https://pypi.python.org/pypi
世界上各种编程dalao的上传的模块
PEP是Python Enhancement Proposals的缩写,翻译过来就是Python增强建议书的意思,Ta是用来规范与定义Python的各种加强与延伸功能的技术规格,好让Python开发社区能有共同遵循的依据
052模块:像个极客一样去思考(下)
本帖最后由 摆渡终极鉴黄师 于 2017-11-19 19:37 编辑@&*……(*¥&*!*(@#&↓
>>> dir(timeit)
['Timer', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_globals', 'default_number', 'default_repeat', 'default_timer', 'dummy_src_name', 'gc', 'itertools', 'main', 'reindent', 'repeat', 'sys', 'template', 'time', 'timeit']
>>> timeit.__all__ # 不是所有的模块都有all这个属性,有的话这个属性包含的内容 是 这个模块的作者 希望外部调用的这些名字,这些函数,或者是这些类,而其他的就是不希望外部调用的了
['Timer', 'timeit', 'repeat', 'default_timer'] # 只有4个元素,前面一个是类,后面3个是接口函数,all显示出来的这个模块可以供外界调用的所有东西,所有信息
>>>
——————————————————————————————————
如果一个模块设置了all属性,使用这个from timeit import *这样的语句,只有all属性这里面的名字才会被导入,例如
>>> from timeit import *
>>> Timer
<class 'timeit.Timer'>
>>> ab
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
ab
NameError: name 'ab' is not defined
>>>
注:如果没有设置all属性的话,from 模块名 import *就会把所有不以下划线开头的名字都导入到当前命名空间,所以在编写模块的时候,对外提供接口函数和类都设置到这个all属性这个列表里面去,这样是比较规范的做法
——————————————————————————————————
>>> import timeit
>>> timeit.__file__
'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\timeit.py'
>>>
这样可以找到作者的源代码,阅读可以提高自己的水平
——————————————————————————————————
>>> help(timeit)
>>> !&**……#*&!……*&(@¥
比Docs属性详细一点,比官方文档简单一点,介于中间的一个帮助文档,这里!&**……#*&!……*&(@¥也可以知道各个函数的一个用法
http://bbs.fishc.com/thread-55593-1-1.html这里小甲鱼老湿有更具体的详解
053论一只爬虫的自我修养(上)
本帖最后由 摆渡终极鉴黄师 于 2017-11-19 21:49 编辑·URL的一般格式为(带方括号[]的为可选项):
protocol://hostname[:port]/path/[;parameters][?query]#fragment
·URL由三部分组成:
-第一部分是协议:http,https,ftp,file,ed2k...
-第二部分是存放资源的服务器的域名系统或IP地址(有时候要包含端口号,各种传输协议都有默认的端口号,如http的默认端口为80)。
-第三部分是自愿的具体地址,如目录或文件名等。
053论一只爬虫的自我修养(中)
本帖最后由 摆渡终极鉴黄师 于 2017-11-20 18:53 编辑>>> import urllib.request
>>> response = urllib.request.urlopen("http://www.fishc.com")
>>> html = response.read()
>>> print(html)
@!&*……#¥(*&!#(*@
>>> html = html.decode("utf-8")
>>> print(html)
!&@^&*(@$#^*(&@!
053论一只爬虫的自我修养(下)
emmmm下半节课大致意思就是,,失去后才会珍惜所失去的东西,珍惜那些所拥有的。。 赞054论一只爬虫的自我修养2(上)
可以用urllib.parse.urlencode()来将字符串转化为application/x-www-form-urlencocded format格式,需用urllib.parse.urlencode()对urllib.parse.urlencode进行编码json是一种轻量级的数据交换形式,说白了就是用字符串形式把python数据结构封装起来了 xiaozhitadie 发表于 2017-11-21 19:30
赞
{:10_257:}
054论一只爬虫的自我修养2:实战(下)
import urllib.request # 请求网站import urllib.parse # 负责解析功能
import json
content = input("请输入需要翻译的内容:")
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=http://www.youdao.com/" # 链接的话就是右键网页审核元素里Network中Header里的Request URL:后面的内容
data = {} # 字典data的话就是右键网页审核元素里Network中Header里的Form Data这个表单
data['type'] = 'AUTO'
data['i'] = content
data['doctype'] = 'json'
data['xmlVersion'] = '1.6'
data['keyfrom'] = 'fanyi.web'
data['ue'] = 'UTF-8'
data['typoResult'] = 'true'
data = urllib.parse.urlencode(data).encode('utf-8') # encode用于编码,用编码后的值赋值给data,覆盖了data(必须得encode硬编码成utf-8的形式)
response = urllib.request.urlopen(url, data) # 1、传入响应的链接,2、传入data
html = response.read().decode('utf-8') # decode用于解码
target = json.loads(html)
print("翻译结果:%s" % (target['translateResult']['tgt']))
055论一只爬虫的自我修养3:隐藏(上)
可以用代理进行访问一个网站·步骤:
1、参数是一个字典{‘类型’:‘代理ip:端口号’}
proxy_support = urllib.request.ProxyHandler({})
2、定制、创建一个opener
opener = urllib.request.bulid_opener(proxy_support)
3a、安装 opener
urllib.request.install_opener(opener)
3b、调用 opener
opener.open(url)
055论一只爬虫的自我修养3:隐藏(中)
短时间内大量下载东西服务器拒绝咋办?可以修改headers
·在Request对象生成之前,通过设置Ta的headers参数修改
·通过Request.add_header()方法来动态的进行增加
(1、延迟提交的时间 2、使用代理)
055论一只爬虫的自我修养3:隐藏(下)
import urllib.requestimport random
url = 'http://www.whatismyip.com.tw'
iplist = ['代理IP复制进来', '代理IP复制进来', '代理IP复制进来']
proxy_support = urllib.request.ProxyHandler({'http':random.choice(iplist)})
opener = urllib.request.build_opener(proxy_support)
opener.addheaders = [('User-Agent', 'User-Agent里的内容复制进来')]
urllib.request.install_opener(opener)
response = urllib.request.urlopen(url)
html = response.read().decode('utf-8')
print(html)
056轮一只爬虫的自我修养4:OOXX(突然就有了一种学习的动力)
import urllib.requestimport os
import random
def url_open(url):
req = urllib.request.Request(url)
req.add_header('User-Agent', 'User-Agent里的内容复制进来')
proxies = ['把代理IP地址复制进来', '把代理IP地址复制进来', '把代理IP地址复制进来']
proxy = random.choice(proxies)
proxy_support = urllib.request.ProxyHandler({'http':proxy}) # 上节课讲过、、
opener = urllib.request.build_opener(proxy_support)
urllib.request.install_opener(opener)
response = urllib.request.urlopen(url) # 去访问Ta
html = response.read()
return html
def get_page(url):
html = url_open(url).decode('utf-8') # |-②所以说要在这里先调用url_open,给Ta url然后把Ta得到的值再decode
# response = urllib.request.urlopen(url) # 去访问Ta
# req = urllib.request.Request(url)
# req.add_header('User-Agent', 'User-Agent里的内容复制进来')
# html = response.read().decode('utf-8')# |-①这里decode返回的就是解码好的,下面有个save_img,如果说把Ta解码成utf-8的形式,图片不能变成这个形式,Ta读不出来,图片是二进制代码的形式
a = html.find('current-comment-page') + 23 # 查找先用find方法,正则表达式下节课
b = html.find(']', a) # 这里的话要给方括号一个起始位置,从a开始找到第一个方括号,返回Ta的索引坐标
html = response.read()
return html # 返回一个字符串
def find_imgs(url):
html = url_open(url).decode('utf-8')
img_addrs = [] # 声明一个列表
a = html.find('img src=') # 找到起始地址
while a != -1: # 找不到这个img标签的时候,这个循环会结束
b = html.find('.jpg', a, a+255) # 图片为.jpg的形式,如果不是jpg Ta会继续往后找jpg去,所以要限定Ta一个结束范围,一个网页的的地址最多也不会超过255
if b != -1: # 找到一个jpg,有一个索引值了
img_addrs.append(html) # 把Ta加到这个列表里边去,把Ta地址加进去
else:
b = a + 9 # 这里如果说b找得到,那b会改变,如果说b找不到的话,b的地址也发生改变一下,如果没有这一句的话Ta会在循环在同一个位置
a = html.find('img src=', b) # 这里是个循环,每一次a都会发生改变,a都会进行下一次寻找,a下一次寻找的起始位置就是a上一次的结束位置
return img_addrs # 返回一个包含着图片的地址的列表
def save_imgs(folder, img_addrs):
for each in img_addrs: # 把这些图片保存起来
filename = each.split('/')[-1] # 最后一个反斜杠后面带的就是图片的名字
with open(filename, 'wb') as f: # open(filename就是在OOXX里边写入一个filename的文件,用wb的形式写入
img = url_open(each) # 相当于把这张图片给打开,得到的是一个二进制
f.write(img) #把Ta写进去,这个不需要返回值
def download_mm(folder='OOXX', pages=10):
os.mkdir(folder) # 用os在当前目录创建一个文件夹
os.chdir(folder) # 改变目录
url = "http://@&*¥……(&*@/" # 先随便找一个有图的网站,最后别忘了加反斜杠/
page_num = int(get_page(url)) # 要用模块化的思维来写,抽象成get_page,传给Ta url,因为Ta这里要返回一个字符串,所以要把Ta变为一个整形
for i in range(pages): # 范围前几页
page_num -= i #这里第一次获取的是1293,第二次是1293 -= 1 ,也就是1292,以此类推
page_url = url + 'page-' + str(page_num) + '#comments' # 整形,字符串相加,也就是拼成一个page_url
img_addrs = find_imgs(page_url) # 打开这个链接,在这个页面,找到所有图片的地址,把Ta们保存成一个列表,然后把Ta返回,然后就是说返回了一个列表
save_imgs(folder, img_addrs) # 利用模块化思维,把这些页面都给保存起来
if __name__ == '__main__':
download_mm()
057论一只爬虫的自我修养5:正则表达式(上)
search()方法用于在字符串中搜索正则表达式模式第一次出现的位置>>> import re
>>> re.search(r'FishC', 'I love FishC.com!') # 第一个参数,需要使用原始字符串+r来编写,这样可以避免很多不必要的麻烦,起始位置是从0开始的,也就是下面的(7,12)的范围,找不到的话就啥都不返回
<_sre.SRE_Match object; span=(7, 12), match='FishC'> # 起始位置是从0开始的,也就是匹配的范围,找不到的话就啥都不返回
>>> "I love FishC.com!".find('FishC') # 这个用find方法也可以实现的
7
>>> re.search(r'.', 'I love FishC.com!')
<_sre.SRE_Match object; span=(0, 1), match='I'> # Ta找到了第一个字符I,因为上一行的那个点号代表的是除了换行符之外的任何字符,所以也可以这样写↓
>>> re.search(r'Fish.', 'I love FishC.com!') # Fish这里不加C,因为点号把C匹配了进去,点号可以代表除了换行符之外的任何字符
<_sre.SRE_Match object; span=(7, 12), match='FishC'>
>>>