多线程爬虫_version_1
首先记录几个线程常用的函数(省略threading):
Thread(target=,args=(),name=)建立线程函数和三个常用参数。
start() 启动线程。
join() 待子线程执行完毕后,再执行主线程。
简单的小代码:
import threading
import urllib.request as req
import urllib.error as err
import urllib
import time
list=[图片]#这里的图片就不给出来了,知道是个图片url的list就好了。
def down(url):
with sem:
k=1
name='E:\pic_meizi\\'+str(time.time())+'.jpg'
try:
req.urlretrieve(url,name)
print("xiazai"+threading.current_thread().name)
except err.ContentTooShortError:
k=k+1
if k >10:
exit()
else:
down(url)
print('diedai')
if __name__=="__main__":
ls=[]
sem = threading.Semaphore(4)
for i in list:
j=threading.Thread(target=down,args=(i,))
ls.append(j)
j.start()
for k in ls:
k.join()
print('finish')
遗留的问题:
1.本来的想法是控制线程数量,所以使用了sem = threading.Semaphore(4),但是似乎没生效。
2.脚本过于简单,我会逐步加大复杂度。
3.下载的图片,有些是破损的。这个我需要再研究下。
另外:
1.本来是想直接研究进程的,可是发现学习进程还是需要先对线程有一定的了解。
2.之前想1个礼拜学点的东西,固定记录下。但是最近身体很差,一到周末往医院跑,所以算是给自己的flag找个借口吧。之后,看身体状况和时间,再搞吧。
3.大家多保重身体吧,我虽然年纪轻轻,但是已经得了很多四五十岁才能得的病了。反面素材学不得。
再加一段代码,还是多线程爬取图片的例子,这个例子找了一个可以给大家看内容的网站。
很初级的一段代码,不嫌弃凑合看吧。
import threading
import time
import urllib
import urllib.parse
import urllib.error as err
import urllib.request
import re
import os
import socket
sem=threading.Semaphore(10)
def remove_null(list):
while '' in list:
list.remove()
return list
class one_list:
def __init__(self):
self.user_agent='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
self.Connection='keep-alive'
self.hheader={'User-Agent':self.user_agent,'Connection':self.Connection}
self.search_url=u'http://www.mm8mm88.com/search/'
self.total_num='\d{0,2}'
self.title='h1 class="wb_pictitle">.*</h1>'
self.title=''
self.src_regx='http:.*jpg'
def search(self,key_word):
search_url=self.search_url+urllib.parse.urlencode(key_word,'gb123')
return search_url
def req_url(self,path):
try:
req=urllib.request.Request(path,headers=self.hheader)
reps = urllib.request.urlopen(req)
except socket.timeout:
print("请求失败,请重试")
exit()
file = reps.read().decode('utf-8')
return file
def get_page_name(self,file):
title_res = re.findall(self.title,file) #获取本group的标题,结果为list
ls = str(title_res)
ls2 = re.findall('\S',ls)
while '' in ls2:
ls2.remove()
ls3=[]
for i in ls2:
ls3 = ls3+i
totle_num = re.findall(self.total_num,)
def get_name_num(self,file):
title_res = re.findall('wb_pictitle">\s*.*)', file)
rr = str(title_res)
title_re = rr.split()
del title_re[0]
numb = title_re[-1]
del title_re[-1]
for i in title_re:
self.title=self.title+str(i)
numbers1=re.findall('/\d{1,3}',numb)
number=re.findall('\d{1,3}',str(numbers1))
lss=[]
lss.append(self.title)
lss.append(number[0])
return lss
def down_url(self,path):
if re.findall('tupian',path):
t=path.replace('tupian','download')
else:
print('url错误')
return t
def save_pic(self,j,k):
with sem:
try:
s = 1
urllib.request.urlretrieve(j, k)
print(k)
except err.ContentTooShortError as e: # 图片在特定时间内没有下载完成
print('chongxinqingqiu')
self.save_pic(j, k)
except socket.timeout:
s = s + 1
if s < 10:
print('超时')
self.save_pic(j, k)
else:
print('跳过本张图片')
except err.URLError:
s = s + 1
if s < 10:
print('URL错误')
self.save_pic(j, k)
else:
print('跳过本张图')
except Exception:
print('跳过本张图')
def mak_dir(self,name):
dir='E:\pic_meizi'+name
if os.path.exists(dir):
os.chdir(dir)
else:
os.makedirs(dir)
os.chdir(dir)
return dir
if __name__ == "__main__":
url = u'http://www.mm8mm88.com/tupian/5550.html'
count=0
file=one_list()
print('开始请求页面')
page=file.req_url(url)
print('请求完毕')
t=file.get_name_num(page)
print("获取标题和页数")
print(t[0],t[1])
print('开始创建文件夹')
mk_dir=file.mak_dir(t[0])
print('获取大图下载地址')
rurl=file.down_url(url)
tt=rurl.split('.html')
pic_list=[]
print('开始获取图片地址列表')
inte=int(t[1])
for i in range(0,inte):
real_url = tt[0] + '-' + str(i) + '-' + '0x0' + '.html'
print(real_url)
pic_page = file.req_url(real_url)
src=re.findall(file.src_regx,pic_page)
print(src[0])
pic_list.append(src[0])
print('开始下载列表中的图片')
print(pic_list)
for ii in pic_list:
count=count+1
print('图片地址'+ii)
pic_name=t[0]+str(count)+'.jpg'
th =threading.Thread(target=file.save_pic,args=(ii,pic_name,))
th.start()

浙公网安备 33010602011771号