Scrapy:
Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
下载地址:https://www.cnblogs.com/liuliliuli2017/p/6746440.html
根据自己的需要来下载Twisted地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/
然后win + R输入cmd进入命令行,输入pip install scrapy 回车键进行安装:
安装后用scrapy进行测试是否安装成功,结果如下图:
还有一种简单粗暴的方法,直接在命令行输入conda install scrapy进行安装
这种方法不是所有都适合用,可能会成功也可能会失败
线程:
比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程。
进程:
对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。
我们前面编写的所有的Python程序,都是执行单任务的进程,也就是只有一个线程.
如果我们要同时执行多个任务怎么办?
解决办法有两种:
1.启动多个进程,每个进程虽然只有一个线程,但多个进程可以一块执行多个任务。
2.启动一个进程,在一个进程内启动多个线程,这样,多个线程也可以一块执行多个任务。
当然还有第三种方法,就是启动多个进程,每个进程再启动多个线程,这样同时执行的任务就更多了,当然这种模型更复杂,实际很少采用。
总结多任务实现的3中方式:
1.多进程模式;
2.多线程模式;
3.多进程+多线程模式。
同时执行多个任务通常各个任务之间并不是没有关联的,而是需要相互通信和协调,有时,任务1必须暂停等待任务2完成后才能继续执行,有时,任务3和任务4又不能同时执行,所以,多进程和多线程的程序的复杂度要远远高于我们前面写的单进程单线程的程序。
因为复杂度高,调试困难,所以,不是迫不得已,我们也不想编写多任务。但是,有很多时候,没有多任务还真不行。想想在电脑上看电影,就必须由一个线程播放视频,另一个线程播放音频,否则,单线程实现的话就只能先把视频播放完再播放音频,或者先把音频播放完再播放视频,这显然是不行的。
Python既支持多进程,又支持多线程,我们会讨论如何编写这两种多任务程序。
线程分两种:
主线程和分线程
1.代码运行默认都是在主线程里面,如果需要执行新的任务,可以开辟分线程
2.分线程个数没有限制,分线程里面的任务结束后,分线程结束
分线程使用场景:
1.当有大量任务需要执行的时候,可以将任务放入到分线程里面
2.当有大量任务需要执行的时候,而任务的执行顺序需要指定的时候,可以使用分线程
3.当界面有大量效果(UI界面)需要更新的时候,需要放入到分线程
同步任务和异步任务:
同步任务:
上一个任务没有完成,下一个任务不能开始执行
异步任务:
可以同时执行多个任务,上一个任务没有完成,下一个任务也可以开始执行
分线程和异步的区别:
1.分线程可以同时开启多个任务,所有的任务自己完成
2.异步可以同时开启多个任务,但是自己只做一个任务,其他任务命令其他人来完成
例:
import threading
print('当前线程为',threading.current_thread().name)
def myThread():
print('位置1',threading.current_thread().name)
print('位置2', threading.current_thread().name)
print('位置3', threading.current_thread().name)
print('位置4', threading.current_thread().name)
print('位置5', threading.current_thread().name)
print('位置6', threading.current_thread().name)
class People(object):
def thread_test(self):
print('对象方法',threading.current_thread().name)
p = People()
p.thread_test()
# threading.Thread开辟一个新的线程 target目标 name分线程名称
#开始执行分线程
sub_thread = threading.Thread(target=myThread,name='newThread')
sub_thread.start()
print('outsidel',threading.current_thread().name)
print('outside2',threading.current_thread().name)
print('outside3',threading.current_thread().name)
print('outside4',threading.current_thread().name)
print('outside5',threading.current_thread().name)
线程是最小的执行单元,而进程由至少一个线程组成,如何调度进程和线程,完全决定于操作系统,程序自己不能决定什么时候执行,执行多长时间.
多进程和多线程 涉及到同步,数据共享的问题,编写更复杂