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

```python3
    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
```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
主页 是一个目录里面的 所有章节,如何用线程下载目录里的每个章
比如 我第一个线程下载第一个章节 第二 ...

参考文章[ ThreadPoolExecutor线程池](https://www.jianshu.com/p/b9b3d66aa0be)

想要成为一名优秀的程序员,必然要学会面向搜索引擎编程
页: [1]
查看完整版本: 在学多线程爬小说,感觉自己写的有问题 请求各位