吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1514|回复: 11
收起左侧

[求助] 我写的多线程爬虫 运行一下 就会卡主 哪里有问题呀?

[复制链接]
hahawangzi 发表于 2021-1-21 10:25
url="https://www.tianyabook.com/list/7/"
headers={
         'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
      
         
        }
url2="https://www.tianyabook.com"
q=Queue(maxsize=30)
#-----------------------------------------------------
def mkdir(path:str,path2:str):
    isexists=os.path.exists(path+"/"+path2)
    if not isexists:
        os.makedirs(path+"/"+path2)
        print("{}/{}创建成功".format(path,path2))
    else:
        print("{}/{}已经存在".format(path,path2))

   
#=====================================================
dict={}
def scz(ip,sname):
    #lock.acquire()
    r =requests.get(ip,headers=headers)
    r.encoding="gbk"
    soup=BeautifulSoup(r.text,"lxml")
    s=soup.find("div",class_="panel panel-default",id="list-chapterAll")
    start=time.time()
    for i in s.find_all("dd"):
        for k in i.find_all("a"):
            
            if k.get("href") is not None:
                #print(k.getText(),k.get("href"))
                #down(k.get("href"),k.getText(),sname)
                q.put((k.get("href"),k.getText(),sname))               
               
               
    #end=time.time()
    #lock.release()
    #print("{}所有章节下载完毕,共用时{}".format(sname,(end-start)))
    #filename="{}\{}.txt".format("test",sname)
    #with open(filename) as f:
        #f.write((end-start))
   
   
def xfz(shuming:str):
    #db=pymysql.connect("10.197.201.221","root","Phah.123","python")
    #cs=db.cursor()
    ip=q.get()[0]
    print("{}这是目录章节的地址".format(ip))
    #name=q.get()[1]
    #print("{}这是章节名字".format(name))
    r=requests.get(url2+ip,headers=headers)
    r.encoding="gbk"
    soup=BeautifulSoup(r.text,"lxml")
    s=soup.find("div",class_="panel-body",id="htmlContent")
    s2=soup.find("h1",class_="readTitle")
   
    zj=s2.getText()
    #print(name)
    #print(s.getText())
    text=str(s.getText())
    print(text)
    filename="{}\{}\{}.txt".format("test",shuming,zj)
   
    with open(filename,'a+',encoding='utf-8') as f:
        f.write(text)
        print("{}写入成功".format(zj))
   

if __name__ =="__main__" :
    thread=[]
    for i in range(1,2):
        r =requests.get(url+str(i)+".html",headers=headers)
        r.encoding="gbk"
        soup=BeautifulSoup(r.text,'lxml')
        s=soup.find("div",class_="col-md-8")
        time.sleep(5)
        print("这是第{}页".format(str(i)))
        start=time.time()
        for j in s.find_all("a"):
            if j.get("title") is not None:
                print(j.get("title")+"\n"+j.get("href"))
                sm=os.path.exists(str(j.get("title")))
                dict["shuming"]=str(j.get("title"))
                dict["ip"]=str(j.get("href"))
                mkdir("test",dict["shuming"])
                print(dict["shuming"],str(j.get("href")))
               
                t1=threading.Thread(target=scz,args=(dict["ip"],dict["shuming"]))
                t1.start()
               
                t2=threading.Thread(target=xfz,args=(dict["shuming"],))
                t3=threading.Thread(target=xfz,args=(dict["shuming"],))
                t4=threading.Thread(target=xfz,args=(dict["shuming"],))
                t2.start()
                t3.start()
                t4.start()
                t1.join()
                t2.join()
                t3.join()
                t4.join()
        end=time.time()
        print("耗时{}".format((end-start)))
         我用了 队列 看看也没地方错,运行了一下就会卡主了 不知道你来有问题

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

halfone 发表于 2021-1-21 10:44
[Python] 纯文本查看 复制代码
url="https://www.tianyabook.com/list/7/"
headers={
         'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
      
         
        }
url2="https://www.tianyabook.com"
q=Queue(maxsize=30)
#-----------------------------------------------------
def mkdir(path:str,path2:str):
    isexists=os.path.exists(path+"/"+path2)
    if not isexists:
        os.makedirs(path+"/"+path2)
        print("{}/{}创建成功".format(path,path2))
    else:
        print("{}/{}已经存在".format(path,path2))

   
#=====================================================
dict={}
def scz(ip,sname):
    #lock.acquire()
    r =requests.get(ip,headers=headers)
    r.encoding="gbk"
    soup=BeautifulSoup(r.text,"lxml")
    s=soup.find("div",class_="panel panel-default",id="list-chapterAll")
    start=time.time()
    for i in s.find_all("dd"):
        for k in i.find_all("a"):
            
            if k.get("href") is not None:
                #print(k.getText(),k.get("href"))
                #down(k.get("href"),k.getText(),sname)
                q.put((k.get("href"),k.getText(),sname))               
               
               
    #end=time.time()
    #lock.release()
    #print("{}所有章节下载完毕,共用时{}".format(sname,(end-start)))
    #filename="{}\{}.txt".format("test",sname)
    #with open(filename) as f:
        #f.write((end-start))
   
   
def xfz(shuming:str):
    #db=pymysql.connect("10.197.201.221","root","Phah.123","python")
    #cs=db.cursor()
    ip=q.get()[0]
    print("{}这是目录章节的地址".format(ip))
    #name=q.get()[1]
    #print("{}这是章节名字".format(name))
    r=requests.get(url2+ip,headers=headers)
    r.encoding="gbk"
    soup=BeautifulSoup(r.text,"lxml")
    s=soup.find("div",class_="panel-body",id="htmlContent")
    s2=soup.find("h1",class_="readTitle")
   
    zj=s2.getText()
    #print(name)
    #print(s.getText())
    text=str(s.getText())
    print(text)
    filename="{}\{}\{}.txt".format("test",shuming,zj)
   
    with open(filename,'a+',encoding='utf-8') as f:
        f.write(text)
        print("{}写入成功".format(zj))
   

if __name__ =="__main__" :
    thread=[]
    for i in range(1,2):
        r =requests.get(url+str(i)+".html",headers=headers)
        r.encoding="gbk"
        soup=BeautifulSoup(r.text,'lxml')
        s=soup.find("div",class_="col-md-8")
        time.sleep(5)
        print("这是第{}页".format(str(i)))
        start=time.time()
        for j in s.find_all("a"):
            if j.get("title") is not None:
                print(j.get("title")+"\n"+j.get("href"))
                sm=os.path.exists(str(j.get("title")))
                dict["shuming"]=str(j.get("title"))
                dict["ip"]=str(j.get("href"))
                mkdir("test",dict["shuming"])
                print(dict["shuming"],str(j.get("href")))
               
                t1=threading.Thread(target=scz,args=(dict["ip"],dict["shuming"]))
                t1.start()
               
                t2=threading.Thread(target=xfz,args=(dict["shuming"],))
                t3=threading.Thread(target=xfz,args=(dict["shuming"],))
                t4=threading.Thread(target=xfz,args=(dict["shuming"],))
                t2.start()
                t3.start()
                t4.start()
                t1.join()
                t2.join()
                t3.join()
                t4.join()
        end=time.time()
        print("耗时{}".format((end-start)))


看着有点小乱,这样好一点吧
哆族IT 发表于 2021-1-21 10:46
 楼主| hahawangzi 发表于 2021-1-21 10:51
多谢楼上,运行一下 下了三个就卡住了。。。。。。。。。。。。。。。
fortytwo 发表于 2021-1-21 11:11
hahawangzi 发表于 2021-1-21 10:51
多谢楼上,运行一下 下了三个就卡住了。。。。。。。。。。。。。。。

把导入库那部分也加上吧
fanvalen 发表于 2021-1-21 11:35
如果不是你代码的原因就是网络超时,requests.get(,,timeout=30)
还有就是线程太多了被web检查到了断开
halfone 发表于 2021-1-21 11:39
hahawangzi 发表于 2021-1-21 10:51
多谢楼上,运行一下 下了三个就卡住了。。。。。。。。。。。。。。。

我只是把楼主的代码给格式化了下
RS水果 发表于 2021-1-21 12:29
要加代{过}{滤}理IP的   同一个IP请求过快,网站会ban你的
我用FD补发了200个请求就被ban了
image.png
cptw 发表于 2021-1-21 13:01
技术贴,等大佬
哆族IT 发表于 2021-1-21 13:50
我在等答案!~
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 08:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表