吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1098|回复: 5
收起左侧

[求助] 在学多线程爬小说,感觉自己写的有问题 请求各位

[复制链接]
hahawangzi 发表于 2021-1-16 08:28
本帖最后由 hahawangzi 于 2021-1-16 09:57 编辑

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" 这是为了给每个小说个章节下载用的
#-----------------------------------------------------
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={}
lock=threading.Lock()
def get_html(): 这里是解析主页面小说名
    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)))
        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"))
                mkdir("test",dict["shuming"])
                print(dict["shuming"],str(j.get("href")))
                thread_list=[]
                #get_mulu(str(j.get("href")),str(j.get("title")))
               
                t1=threading.Thread(target=get_mulu,args=(j.get("href"),j.get("title")))
                t2=threading.Thread(target=get_mulu,args=(j.get("href"),j.get("title")))
                t3=threading.Thread(target=get_mulu,args=(j.get("href"),j.get("title")))
                t4=threading.Thread(target=get_mulu,args=(j.get("href"),j.get("title")))
                t1.start()
                t2.start()
                t3.start()
                t4.start()
               
               
                    
               
               
               
def get_mulu(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)
               
    end=time.time()
    lock.release()
    print("{}所有章节下载完毕,共用时{}".format(sname,(end-start)))
    filename="{}\{}.txt".format("test",shuming)
    with open(filename) as f:
        f.write((end-start))
   
def down(ip:str,name:str,shuming:str): 这里是主要下载章节的
    r=requests.get(url2+ip,headers=headers)
    r.encoding="gbk"
    soup=BeautifulSoup(r.text,"lxml")
    s=soup.find("div",class_="panel-body",id="htmlContent")
    #print(s.getText())
    text=str(s.getText())
    print(text)
   
   
    filename="{}\{}\{}.txt".format("test",shuming,name)
    #if not mulu:
     #   os.makedirs("test")
   
    with open(filename,'a+',encoding='utf-8') as f:
        f.write(text)
        print("{}写入成功".format(name))


if __name__ =="__main__" :
    get_html()

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

头像被屏蔽
cy5520 发表于 2021-1-16 08:37
提示: 作者被禁止或删除 内容自动屏蔽
天黑我隐身 发表于 2021-1-16 09:40
    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"))

                #main(k.get("href"),k.getText(),sname)
                t1=threading.Thread(target=main,args=(str(k.get("href")),k.getText(),sname))
                t2=threading.Thread(target=main,args=(k.get("href"),k.getText(),sname))
                t1.start()
                t2.start()
                t1.join()
                t2.join()

t1、t2两个线程传入的参数都一样,能不重复吗

这个代码中的Thread.join()方法会阻塞主线程,最多就2个线程在跑,使用线程池才是更合适的方案

 楼主| hahawangzi 发表于 2021-1-16 09:44
天黑我隐身 发表于 2021-1-16 09:40
[md]```python3
    for i in s.find_all("dd"):
        for k in i.find_all("a"):

主页 是一个目录里面的 所有章节,如何用线程下载目录里的每个章
比如 我第一个线程下载第一个章节 第二个线程下载 第二个章节 然后下完 第一个线程下载第四个这样 不重复的下载
 楼主| hahawangzi 发表于 2021-1-16 09:57
cy5520 发表于 2021-1-16 08:37
你这个代码没有注释,没有网址看不了

改过了 你看下
天黑我隐身 发表于 2021-1-16 09:59
hahawangzi 发表于 2021-1-16 09:44
主页 是一个目录里面的 所有章节,如何用线程下载目录里的每个章
比如 我第一个线程下载第一个章节 第二 ...

参考文章[python] ThreadPoolExecutor线程池

想要成为一名优秀的程序员,必然要学会面向搜索引擎编程

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

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

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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