python 爬虫练习 多线程的运用

初学python,python学习笔记
学习python没多久,觉得python的代码比较简洁
python中多线程的使用: threading 与 concurrent.futures
本练习主要参考《多线程抓取》,完成上文中的练习(抓取 http://www.tybai.com/topic 里面文章的详情页,将其 html 下载到本地),只做了一点点的修改
1.学习了python中的一些文件操作,文件及目录的创建
os.path.exists(path) 判断路径path是否存在
os.makedirs(path) 创建多级目录
open(file,mode) 创建文件
2.threading的使用
1)首先import threading
2)threading.Thread(target=method,args=arg)创建一个线程
method为要执行的方法,arg为方法的参数。有个需要注意的地方就是这里的arg为字符串变量时,需要在后面加个逗号“,”,否则它会将这个字符串中的每个字符当成参数处理。
例如th=threading.Thread(target=downHtml,args=(l,name,))
3)创建线程之后就可以通过start()来启动这个线程了
4)join()方法的作用:等待直到进程结束。这将阻塞正在调用的线程,直到被调用join()方法的线程结束。例如主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么,主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行。
3.concurrent.futures的使用
1)引入concurrent.futures
from concurrent.futures import ThreadPoolExecutor
2 )创建线程池
thPool=concurrent.futures.ThreadPoolExecutor(max)其中max为线程池的大小
3)thPool.submit(method,args),method为需要执行的方法,args为方法的参数

具体练习代码如下:

import urllib.request
import re
import os
import threading
from concurrent.futures import ThreadPoolExecutor

def reg(html):
    reg=r'(

)(.+?)()' all = re.compile(reg) alllist = re.findall(all, html) return alllist def downHtml(url,name): print(url,name) saveHtml=open("E:\\topics\\"+name+'.html','wb') saveHtml.write(urllib.request.urlopen(url).read()) saveHtml.close() url='http://www.tybai.com/topic' html=urllib.request.urlopen(url).read().decode('UTF-8') links=reg(html) if not os.path.exists("E:\\topics\\"): os.makedirs("E:\\topics\\") #use threading # thPool=[] # for link in links: # l="http://www.tybai.com"+link[1] # name=link[3] # th=threading.Thread(target=downHtml,args=(l,name,)) # thPool.append(th) # # for th in thPool: # th.start() # # for th in thPool: # th.join() #use concurrent.futures pool=ThreadPoolExecutor(max_workers=50) for link in links: l = "http://www.tybai.com" + link[1] name=link[3] pool.submit(downHtml,l,name)

如有问题,欢迎私信,希望能一起进步

你可能感兴趣的:(python爬虫)