python多线程爬虫界面_Python多线程爬虫爬取网页图片

'''基于多页面多线程'''

import os #引入文件模块

import re #正则表达式

importurllib.requestimportthreading#连接网页并返回源码

defopen_url(url):try:

req=urllib.request.Request(url)

req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36")

response=urllib.request.urlopen(req)

status_code=response.code

html=response.read()returnhtmlexcept:print(url + "404")return 404

defmkdir(path):''':param path: 路径

:return:'''

#引入模块

importos#去除首位空格

path =path.strip()#去除尾部 \ 符号

path = path.rstrip("\\")#判断路径是否存在

#存在 True

#不存在 False

isExists =os.path.exists(path)#判断结果

if notisExists:#如果不存在则创建目录

#创建目录操作函数

os.makedirs(path)print(path + '创建成功')returnTrueelse:#如果目录存在则不创建,并提示目录已存在

print(path + '目录已存在')returnFalsedefYande1(i):

imgs= 1url= 'https://yande.re/post?page=' +str(i)

floder= "E:\\Python\\爬虫\\yande\\img\\page" +str(i)

mkdir(floder)

html=open_url(url)

html= html.decode('gbk', 'ignore')

img_adds=[]

img_adds= re.findall(r'

filename= floder + "\\" + str(imgs) + '.jpg'imgs+= 1img_html=open_url(i)if img_html == 404:continuewith open(filename,'wb') as f:

f.write(img_html)print(i + '下载完成......')

exitflag=0classmyThread(threading.Thread):def __init__(self, threadID, name, list):

threading.Thread.__init__(self)

self.threadID=threadID

self.name=name

self.list=listdefrun(self):print("开始线程:" +self.name)#threadLock.acquire()

get_img(self.name, self.list)#threadLock.release()

print("退出线程:"+self.name)defget_img(threadname, list):iflen(list):for i inlist:ifexitflag:

threadname.exit()

Yande1(i)if __name__ == '__main__':

pages1= int(input('请输入你要下载的起始页面数:'))

pages2= int(input('请输入你要下载的末尾页面数:'))

mkdir('img')#for i in range()

list1 =[]

list2=[]

list3=[]for i in range(pages1, pages2+1):if i % 3 ==0:

list3.append(i)if i % 3 == 1:

list1.append(i)if i % 3 == 2:

list2.append(i)

threadLock=threading.Lock()

threads=[]

thread1= myThread(1, "thread-1", list1)

thread2= myThread(2, "thread-2", list2)

thread3= myThread(3, "thread-3", list3)

thread1.start()

thread2.start()

thread3.start()

threads.append(thread1)

threads.append(thread2)

threads.append(thread3)for t inthreads:

t.join()print("退出主线程")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的Python多线程爬虫示例: ```python import requests import threading from queue import Queue # 定义一个全局变量用来存储爬取到的数据 data = [] # 定义一个线程锁,防止多个线程同时写入数据导致数据错乱 lock = threading.Lock() # 定义一个队列,用来存储待爬取的URL url_queue = Queue() # 定义一个爬取线程类 class CrawlerThread(threading.Thread): def __init__(self, url_queue): super().__init__() self.url_queue = url_queue def run(self): while True: # 从队列中获取一个URL url = self.url_queue.get() try: # 发送请求并解析响应数据 response = requests.get(url) content = response.text # 对响应数据进行处理(此处省略) # ... # 将处理后的数据存入全局变量 with lock: data.append(processed_data) # 标记该URL已被处理 self.url_queue.task_done() except Exception as e: print(f"Error occurred while crawling {url}: {e}") # 如果发生错误,将该URL重新放回队列 self.url_queue.put(url) self.url_queue.task_done() # 定义一个入口函数 def main(): # 初始化待爬取的URL列表 urls = ["http://www.example.com/page{}".format(i) for i in range(1, 11)] # 将URL列表添加到队列中 for url in urls: url_queue.put(url) # 创建多个爬取线程并启动 for i in range(5): t = CrawlerThread(url_queue) t.start() # 阻塞主线程,直到所有URL都被处理完毕 url_queue.join() # 输出爬取结果 print(data) if __name__ == '__main__': main() ``` 以上示例中,我们定义了一个`CrawlerThread`类来表示爬取线程,定义了一个`url_queue`队列来存储待爬取的URL,定义了一个`data`列表来存储爬取到的数据,以及定义了一个`lock`线程锁来保证多个线程访问`data`时不会出现数据错乱的情况。 在`main`函数中,我们首先将待爬取的URL列表添加到`url_queue`队列中,然后创建多个`CrawlerThread`实例并启动它们。最后,我们使用`url_queue.join()`方法来阻塞主线程,直到所有的URL都被处理完毕。 在`CrawlerThread`类的`run`方法中,我们使用`self.url_queue.get()`方法从`url_queue`队列中获取一个URL,然后发送请求并解析响应数据。如果处理过程中出现错误,我们将该URL重新放回队列中,以便后续线程重新处理。如果处理成功,我们将处理后的数据存入`data`列表中,并使用`self.url_queue.task_done()`方法标记该URL已被处理完毕。 需要注意的是,在多线程爬虫中,如果爬取的网站对IP访问频率有限制,可能会导致IP被封禁的情况。因此,在实际应用中,我们需要合理设置线程数量和请求频率,以避免被封禁的情况发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值