鱼C论坛

 找回密码
 立即注册

[技术交流] py3000愉快的开始

[复制链接]
 楼主| 发表于 2017-11-10 16:27:48 | 显示全部楼层

050模块:模块就是程序(中)

本帖最后由 摆渡终极鉴黄师 于 2017-11-10 16:42 编辑

第一种:import 模块名
第二种:from 模块名 import 函数名
第三种:import 模块名 as 新名字
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-11 12:47:52 | 显示全部楼层

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))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-12 11:01:06 | 显示全部楼层

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__":就会测试一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-13 15:18:23 | 显示全部楼层

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
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-14 14:08:49 | 显示全部楼层

051模块:__name__='__main__'、搜索路径和包(下)

本帖最后由 摆渡终极鉴黄师 于 2017-11-16 19:22 编辑

·包(package)
1.创建一个文件夹,用于存放相关的模块,文件夹的名字即包的名字;
2.在文件夹中创建一个__init__.py的模块文件,内容可以为空;
3.将相关的模块放入文件夹中

例如
import TemperatureConversion as tc
改为
import M1.TemperatureConversion as tc        #        M1是包的名字
然后就可以找到相关的模块了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-15 23:06:13 | 显示全部楼层

052模块:像个极客一样去思考(上)

本帖最后由 摆渡终极鉴黄师 于 2017-11-16 19:31 编辑

1.打开python3 IDLE
2.打开Help
3.打开Python Docs F1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-16 19:31:38 | 显示全部楼层

052模块:像个极客一样去思考(中)

本帖最后由 摆渡终极鉴黄师 于 2017-11-16 19:33 编辑

https://pypi.python.org/pypi
世界上各种编程dalao的上传的模块

PEP是Python Enhancement Proposals的缩写,翻译过来就是Python增强建议书的意思,Ta是用来规范与定义Python的各种加强与延伸功能的技术规格,好让Python开发社区能有共同遵循的依据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-18 12:45:48 | 显示全部楼层

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这里小甲鱼老湿有更具体的详解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-19 19:37:38 | 显示全部楼层

053论一只爬虫的自我修养(上)

本帖最后由 摆渡终极鉴黄师 于 2017-11-19 21:49 编辑

·URL的一般格式为(带方括号[]的为可选项):
protocol://hostname[:port]/path/[;parameters][?query]#fragment

·URL由三部分组成:
-第一部分是协议:http,https,ftp,file,ed2k...
-第二部分是存放资源的服务器的域名系统或IP地址(有时候要包含端口号,各种传输协议都有默认的端口号,如http的默认端口为80)。
-第三部分是自愿的具体地址,如目录或文件名等。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-20 15:10:29 | 显示全部楼层

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)
!&@^&*(@$#^*(&@!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-21 17:11:39 | 显示全部楼层

053论一只爬虫的自我修养(下)

emmmm下半节课大致意思就是,,失去后才会珍惜所失去的东西,珍惜那些所拥有的。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-21 19:30:10 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-11-22 20:19:14 | 显示全部楼层

054论一只爬虫的自我修养2(上)

可以用urllib.parse.urlencode()来将字符串转化为application/x-www-form-urlencocded format格式,需用urllib.parse.urlencode()对urllib.parse.urlencode进行编码
json是一种轻量级的数据交换形式,说白了就是用字符串形式把python数据结构封装起来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-22 20:20:45 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-23 19:11:05 | 显示全部楼层

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'][0][0]['tgt']))       
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-24 18:56:25 | 显示全部楼层

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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-25 13:50:49 | 显示全部楼层

055论一只爬虫的自我修养3:隐藏(中)

短时间内大量下载东西服务器拒绝咋办?
可以修改headers
·在Request对象生成之前,通过设置Ta的headers参数修改
·通过Request.add_header()方法来动态的进行增加
(1、延迟提交的时间        2、使用代理)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-26 16:57:46 | 显示全部楼层

055论一只爬虫的自我修养3:隐藏(下)

import urllib.request
import 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-27 19:13:17 | 显示全部楼层

056轮一只爬虫的自我修养4:OOXX(突然就有了一种学习的动力)

import urllib.request
import 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[a:b]        #        返回一个字符串


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[a+9:b+4])        #        把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()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-28 18:16:00 | 显示全部楼层

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'>
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 07:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表