1 程序,进程,线程
程序
:由源代码生成的可执行应用。(例如:QQ,淘宝等)
进程
:一个正在运行的程序可以看做一个进程,进程拥有独立运行所需要的全部资源。(例如:打开 QQ 相当于开启一个进程)
线程
:程序中独立运行的代码段。(例如:在 QQ 这个进程中,传输文字是一个线程,传输语音是一个线程,弹出对话框是一个线程。)
2 单线程
原理 :每个正在运行的程序(即进程),至少包含一个线程,这个线程叫做主线程,主线程在程序启动时被创建,用于执行 main 函数,只有一个主线程的程序叫做单线程程序,主线程负责执行程序的所有代码。这些代码只能顺序执行,无法并发执行。
单线程示例:
import time
import random
#单线程爬虫
def download(file_name):
print(f'{file_name}文件开始下载')
time.sleep(random.random()*10)
print(f'{file_name}文件结束下载')
#单线程(默认主线程)
'''
总结:每个正在运行的程序(即进程),至少包含一个线程,
这个线程叫做主线程,主线程在程序启动时被创建,用于执行main函数,
只有一个主线程的程序叫做单线程程序,主线程负责执行程序的所有代码。
这些代码只能顺序执行,无法并发执行。
'''
if __name__ =="__main__":
for i in range(5):
download(i)
3.多线程
多线程
定义:多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
多线程优点
:可以提高 CPU 的利用率。在多线程程序中,一个线程必须等待的时候,CPU 可以运行其它的线程而不是等待,这样就大大提高了程序的效率。
所以为了提高爬虫的效率,我们可以使用多线程来下载文件,在 python 中我们使用
threading 模块来创建多线程,从而实现多线程爬虫。(补充:Python3 不能再使用 thread 模
块)。
使用
:启动一个线程就是把函数传入并创建一个 Thread 实例,然后调用 start()方法。
多线程示例1:
'''
1.多线程定义:多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多
个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程
来完成各自的任务。
2.多线程优点:可以提高CPU的利用率。
3.在python中我们使用threading模块来创建多线程,从而实现多线程爬虫。
'''
import time
import random
import threading
def download(fileName):
print(f'{fileName}文件开始下载')
time.sleep(random.random() * 10)
print(f'{fileName}文件结束下载')
#多线程
if __name__=='__main__':
for i in range(5):
#启动一个线程就是把函数传入并创建一个Thread实例,然后调用start()fangfa
#创建线程,并将参数传递给函数
t = threading.Thread(target=download,args=(i,))
t.start()
多线程爬取腾讯招聘:
from selenium import webdriver
from lxml import etree
import time,pymongo
import threading
class Tencent(threading.Thread):
def __init__(self,url):
#要传参数,必须在init方法中调用父类的init方法
threading.Thread.__init__(self)
self.base_url = url
# self.parse()
def run(self):
self.parse()
def myBrowser(self,url):
driver = webdriver.PhantomJS()
driver.get(url)
time.sleep(1)
return etree.HTML(driver.page_source)
def parse(self):
# i=0
# while True:
# if i>400:
# break
# i+=1
#https://careers.tencent.com/search.html?index=2
# url = self.base_url+'?index={}'.format(i)
html = self.myBrowser(self.base_url)
# print(html)
self.parse_detail(html)
def save_to_mongo(self,item):
#创建一个链接
# client = pymongo.MongoClient('mongodb://username:password@localhost:27017')
client = pymongo.MongoClient('localhost')
#创建一个数据库
db = client['tencent']
db['tencent'].insert(item)
def get_text(self,text):
if text:
return text[0]
return ''
def parse_detail(self,html):
work_div_list = html.xpath('//div[@class="recruit-list"]')
# print(work_div_list)
for site in work_div_list:
item = {}
#岗位名称
employ_name = self.get_text(site.xpath('.//h4[@class="recruit-title"]/text()'))
# print(employ_name)
item['employ_name']=employ_name
self.save_to_mongo(item)
if __name__ == '__main__':
base_url = 'https://careers.tencent.com/search.html'
# for i in range(3):
# t = Tencent(base_url)
# t.start()
i = 0
while True:
if i > 10:
break
i += 1
url = base_url + '?index={}'.format(i)
t = Tencent(url)
t.start()