Pr1s0n

菜鸟的自我修养


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

同步异步阻塞非阻塞

发表于 2019-08-22 | 分类于 Python学习

同步和异步

  1. 同步,就是在发出一个调用时,在没有得到结果之前, 该调用就不返回。换句话说就是调用者主动接收这个结果。

  2. 异步,就是调用者发出一个调用后,不用等结果,直接可以进行下一步。也就是说这个调用没有返回结果,是被调用者通过状态、通知来通知调用者,或者通过回调函数处理这个调用。

通俗点说:
同步就像是正在苦苦追求一个女生的男生,这天他向这个女生表白,女生要给他一个是否同意交往的回答,女生没有回答之前他会一直等这个结果。
异步就像是个海王,广撒网,精准捕捞。群发表白消息,不管第一个女生是否给了回答,反正就是给列表里所有的女生都发了表白信息。等有女生同意和他交往,他就收到了想要的答案(返回值)。

阅读全文 »

普通爬虫和协程爬虫

发表于 2019-08-22 | 分类于 Python学习

普通爬虫和协程爬虫

普通爬虫逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import time
from lxml import etree
import requests
urls = [
'https://henan.qq.com/a/20190822/001115.htm',
'https://henan.qq.com/a/20190822/001128.htm',
'https://henan.qq.com/a/20190822/001086.htm',
'https://henan.qq.com/a/20190822/001764.htm',
'https://henan.qq.com/a/20190822/001163.htm',
'https://henan.qq.com/a/20190822/001169.htm',
'https://henan.qq.com/a/20190822/001196.htm',
'https://henan.qq.com/a/20190822/001278.htm'
]
url = 'https://henan.qq.com/a/20190822/001764.htm'
def get_titles(url,cnt):
reponse = requests.get(url)
html = reponse.content
title = etree.HTML(html).xpath('//*[@id="Main-Article-QQ"]/div[2]/div[1]/div[2]/div[1]/h1/text()')
print('第%d个title:%s' % (cnt,''.join(title)))

if __name__ == '__main__':
start1 = time.time()
i = 0
for url in urls:
i = i + 1
start = time.time()
get_titles(url,i)
print('第%d个title爬取耗时:%.5f秒' % (i,float(time.time() - start)))
print('爬取总耗时:%.5f秒' % float(time.time() - start1))
阅读全文 »

15st_day HTMLParser

发表于 2019-08-19 | 分类于 Python学习

HTMLParser

非显式调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from urllib import request
from html.parser import HTMLParser
class HtmlParserTest(HTMLParser):
"""docstring for HtmlParserTest"""
def __init__(self):
super().__init__()
self.tag = None
def handle_starttag(self,tag,attrs):
if tag == 'time':
self.tag = 'Time:'
elif('class','event-location') in attrs:
self.tag = 'Location:'
elif('class','event-title') in attrs:
self.tag = '\nTitle:'
def handle_data(self,data):
if self.tag:
print(self.tag,data)
def handle_endtag(self,tag):
self.tag = None

with request.urlopen('https://www.python.org/events/python-events/') as f:
html_data = f.read().decode('utf-8')

parser = HtmlParserTest()
parser.feed(html_data)
  1. HTMLParser.handle_starttag(tag,attrs): 解析时遇到开始标签调用,如<p class='para'>,参数tag是标签名,这里是’p’,attrs为标签所有属性(name,value)列表,这里是[('class','para')]

    阅读全文 »

15st_day 常用第三方模块

发表于 2019-08-19 | 分类于 Python学习

Pillow

pillow是一个图形处理模块,可以实现常用的裁剪,模糊,输出文字等功能。

1
2
3
4
5
6
7
from PIL import Image
im = Image.open('image.jpg')
w,h = im.size
print('Original image size:%s %s' % (w,h))
im.thumbnail((w//2, h//2))
print('Resize image to: %s %s' % (w//2,h//2))
im.save('thumbnial.jpg','jpeg')
1
2
3
4
5
6
7
from PIL import Image, ImageFilter

# 打开一个jpg图像文件,注意是当前路径:
im = Image.open('test.jpg')
# 应用模糊滤镜:
im2 = im.filter(ImageFilter.BLUR)
im2.save('blur.jpg', 'jpeg')

模糊效果

1
2
3
4
5
6
7
from PIL import Image,ImageFilter
import os
im = Image.open('image.jpg')
im2 = im.filter(ImageFilter.BLUR)
im2.save('blur.jpg','jpeg')
if os.path.exists('blur.jpg'):
print('success!')

requests

requests用来处理URL资源。
get()
使用requests.get('url')来实现一个get访问功能。

阅读全文 »

st_day13 常用内建模块1

发表于 2019-08-17 | 分类于 Python学习

collections

namedtuple

namedtuple是一个函数,用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,可以用属性来引用tuple的某个元素。

1
2
3
4
from collections import namedtuple
Point = namedtuple('Point',['x','y'])
p = Point()
print(p.x)

deque

class collections.deque([iterable[, maxlen]])
返回一个新的双向队列对象,从左到右初始化(用方法 append()) ,从 iterable (迭代对象) 数据创建。如果 iterable 没有指定,新队列为空。
双向队列(deque)对象支持以下方法:

append(x)
添加 x 到右端。

appendleft(x)
添加 x 到左端。

clear()
移除所有元素,使其长度为0.

copy()
创建一份浅拷贝。

deque是为了高效实现插入和删除操作的双向列表。

阅读全文 »

st12_day python中的正则表达式

发表于 2019-08-16 | 分类于 Python学习

正则表达式

30分钟正则表达式
python中对于正则表达式使用re模块处理
因为python本身也用\转义,所以可以在字符串前使用r前缀,这样就不用考虑转义问题了。

match()

match()方法判断是否匹配成功,然会一个match()对象,否则返回None。

1
2
3
4
5
6
import re
test = '字符串'
if re.match(r'正则表达式',test):
print('ok')
else:
print('failed')
阅读全文 »

st12_day 多线程

发表于 2019-08-16 | 分类于 Python学习

多线程

任何进程默认都会启动一个线程,这个线程被称为主线程,主线程又可以启动新的线程。
threading模块中的current_thread()函数,永远返回当前线程的实例。主线程实例的名字为MainThread,子线程的名字在创建时指定。名字没啥意义,就是需要的时候可以打印出来。

Lock

多进程中,同一个变量,各自有一份拷贝存在于每个进程中;多线程中,所有变量都由所有线程共享。
所以为了避免多个线程使变量错乱,需要给线程加锁,防止线程之间修改出现冲突。当一个线程获得锁之后,其他线程就不能同时执行该线程运行中的方法,只能等待锁被释放后才可以更改。无论多少线程,同一时刻只有一个线程持有该锁,所以不会造成修改的冲突。
threading模块中的lock()方法可以创建一个锁。

阅读全文 »

st11_day 进程和线程

发表于 2019-08-15 | 分类于 Python学习

进程和线程

每一个正在运行的程序都可以看作是一个进程,比如你打开了一个浏览器就是启动了一个浏览器进程,打开了QQ就是启动了一个QQ进程,打开两个QQ就是启动了两个QQ进程。
每个进程至少要干一件事,有的进程还不止干一件事,比如word文档,在你打字的同时,word程序本身还在进行拼写检查,字数统计等事情。在一个进程内部,要同时干很多不同的事情,就需要同时运行多个”子任务”,这些”子任务”称为线程。

multiprocessing

由于Windows上无法调用fork,所以需要引入multiprocessing这个多进程模块,multiprocessing模块提供了一个Process类来表示一个进程对象。

阅读全文 »

st11_day IO编程笔记

发表于 2019-08-15 | 分类于 Python学习

IO编程

读文件

open(‘路径’,’模式’,encoding=’编码方式’,errors=’ignore’)

  1. 打开文本文件使用’r’,二进制文件使用’rb’
  2. 编码方式默认为UTF-8
  3. 遇到编码错误后使用error参数处理

每次打开文件操作结束后需要使用f.close()关闭文件,不然会持续造成内存占用。
可以使用with语句简化操作。

写文件

write([str])
write()方法用于向文件中写入指定字符串,参数为字符串,返回值为写入的字符长度。
和open()参数配合with使用

1
2
with open('/test/test.txt','w') as f:
f.write('hello')

需要注意的是,以w模式写入文件时,默认是覆盖原有文件的所有内容,如果需要将字符串追加到文件末尾,则可以使用’a’模式写入。

阅读全文 »

10st_day 调试

发表于 2019-08-14 | 分类于 Python学习

调试

assert

1
2
3
4
5
6
7
def foo(s):
n = int(s)
assert n != 0, 'n is zero!'
return 10 / n

def main():
foo('0')

assert表示:如果n != 0 得结果为true,则程序继续进行
如果断言失败,assert语句本身就会抛出AssertionError错误,内容为表达式后的’n is zero!’
python解释器可以使用-O参数来关闭assert

阅读全文 »
12

Pr1s0n

一个博客

13 日志
3 分类
3 标签
© 2019 Pr1s0n
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4
访问人数 访问量 次