在学多线程爬小说,感觉自己写的有问题 请求各位
本帖最后由 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() ```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个线程在跑,使用线程池才是更合适的方案 天黑我隐身 发表于 2021-1-16 09:40
```python3
for i in s.find_all("dd"):
for k in i.find_all("a"):
主页 是一个目录里面的 所有章节,如何用线程下载目录里的每个章
比如 我第一个线程下载第一个章节 第二个线程下载 第二个章节 然后下完 第一个线程下载第四个这样 不重复的下载 cy5520 发表于 2021-1-16 08:37
你这个代码没有注释,没有网址看不了
改过了 你看下 hahawangzi 发表于 2021-1-16 09:44
主页 是一个目录里面的 所有章节,如何用线程下载目录里的每个章
比如 我第一个线程下载第一个章节 第二 ...
参考文章[ ThreadPoolExecutor线程池](https://www.jianshu.com/p/b9b3d66aa0be)
想要成为一名优秀的程序员,必然要学会面向搜索引擎编程
页:
[1]