老孙的爬虫(二·)--------通过储存在在MongoDB中的url来下载文件

本文详细介绍了如何利用Python爬虫配合MongoDB数据库,从存储的URL中批量下载文件,涵盖了数据检索、文件下载及错误处理等关键步骤。
摘要由CSDN通过智能技术生成
#紧接着我在"老孙的爬虫一中储存的url进行下载"
from pymongo import MongoClient
import requests
import os
import datetime
from multiprocessing import Pool
from multiprocessing import Process
import time


conn=MongoClient("192.168.2.214",27017)
db=conn.test4
url_set=db.url_set
path_set=db.path_set

def download_file():
        # print(os.path.exists("D:\\1111111\\bb"))
        while True:
            try:
                data=url_set.find_one_and_update({"state":0},{"$set":{"state":1}})#替换MongoDB中的第一个匹配的数据
                if not data:#此函数匹配第一个参数,若存在,则用第二个替换,若无匹配则反回None
                    return#如果替换则表示已下载,not None为True,跳出循环

                data["state"] = 1
                url = data["url"]
                MD5_url = data["MD5_url"][3:]
                path = os.path.join("F:\\", datetime.datetime.now().strftime("%Y-%m-%d"), data["MD5_url"][0],
                                    data["MD5_url"][1:3])
                path_judge = os.path.exists(path)  # 判断路径是否存在
                if path_judge:
                    pass
                else:
                    os.makedirs(path)
                # print(datetime.datetime.now().strftime("%Y-%m-%d"))#获取当天时间
                # print(path)

                Download_address = url  # 下载地址
                f = requests.get(Download_address)
                with open(path + "\\" + MD5_url + ".zip", 'wb') as code:
                    code.write(f.content)
                    print("下载完成")

                # path_set.insert_one({"url":url,"MD5_url":MD5_url,"path":path})

            except Exception as e:
                print("出错")

def pro():
    trader = []
    for i in range(24):
        pr = Process(target=download_file)
        time.sleep(0.5)
        pr.start()
        trader.append(pr)
    for i in trader:
        i.join()



if __name__=="__main__":
    # for data in set.find():
        # print(data["url"])
        # print(data["MD5_url"])
        # pool=Pool(10)
        # for i in range(50):
        #     pool.apply_async(func=download_file,args=(url,path,))
        # pool.close()
        # pool.join()
        pro()#使用多进程启动多个下载,提高效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值