tips
这个多线程已经说的比较清楚了,这篇博客是前两篇有关于多线程的一个实例衍生。
这个代码还是很简单的。
爬虫不太懂得我先前没怎么写完爬虫的博客,我没辙。
但是多线程这块我讲的很明白了,看不懂我也没辙,要不然就私信有时间就回。
几分钟搞定python多线程
几分钟python多线程深入解读
那么接下来代码如下;
import requests
from lxml import etree
import threading
import os
from urllib import request
from queue import Queue
url_frist_save=Queue(1000)
#url_save=Queue(200)
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
' AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'}
url_root='http://pic.netbian.com'
def get_url():
date_frist=requests.get(url_root,headers=headers)
date_frist=date_frist.content.decode('gbk')
date_frist_=etree.HTML(date_frist)
uel_1=date_frist_.xpath('//li//a[@href and @title and @target]/@href')[4:]
for i in uel_1:
url=url_root+i
url_frist_save.put(url)
for i in range(2,101):
urlx='http://pic.netbian.com/index_{name}.html'.format(name=str(i))
date_frist = requests.get(urlx, headers=headers)
date_frist = date_frist.content.decode('gbk')
date_frist_ = etree.HTML(date_frist)
uel_1 = date_frist_.xpath('//li//a[@href and @target]/@href')[1:]
for i in uel_1:
url = url_root + i
url_frist_save.put(url)
def down_load():
if not os.path.exists(r'C:\Users\a3139\Desktop\projects\爬虫dome\pictures'):
os.makedirs(r'C:\Users\a3139\Desktop\projects\爬虫dome\pictures')
while True:
date_frist=requests.get(url_frist_save.get(),headers=headers)
date_frist=date_frist.content.decode('gbk')
date_frist_=etree.HTML(date_frist)
url_down=url_root+str(date_frist_.xpath('//div[@class="photo-pic"]/a/img/@src')[0])
name=str(date_frist_.xpath('//div[@class="photo-pic"]/a/img/@title')[0])
path=r'C:\Users\a3139\Desktop\projects\爬虫dome\pictures'+'\\'+name+'.jpg'
print(path)
print(url_down)
try:
request.urlretrieve(url_down,path)
request.urlcleanup()
except:
print('此图片下载失败')
if url_frist_save.empty():
print(url_frist_save.empty())
break
for i in range(5):
t1=threading.Thread(target=get_url)
t2=threading.Thread(target=down_load)
t1.start()
t2.start()
这里要注意的是我在这里为这个爬虫开了五个线程,但是这个并不意味着使用Queue可将100个网页爬取分成每个线程爬取20个,同样他们还是爬取100个每个线程。区别是以前是甲先做完再乙去做,现在是甲乙同时做为一组即一个线程。除非你给他们分配任务。我之所以这写主要是为了保证我可以爬取的图片不会遗漏,这个线程没有爬到这张图片,但是不代表另一个爬取不到,