1. 程式人生 > >多線程爬蟲爬取詳情頁HTML

多線程爬蟲爬取詳情頁HTML

切片 html rt thread set enc import req xpath 循環

註意:如果想爬取詳情頁的信息請按須添加方法

import requests import os import re import threading from lxml import etree
#爬去詳情頁得HTML內容 class CnBeta(object):
def get_congtent(self,url): #獲取網頁首頁HTML信息 r = requests.get(url) #將獲取得HTML頁面進行解碼 html = r.content.decode(‘utf-8‘) #返回值 return html
def xpath_html(self,html): html = etree.HTML(html) #利用xpath進行解析HTML模板 new_url = html.xpath("//dt/a/@href") #定義容器把獲取到得所有詳情頁url添加到容器 url_list = [] #定義容器把截取後得文件名字添加到名字容器 name_list = [] #遍歷url列表容器 for i in new_url: #由於獲取到得url不同 利用判斷進行手動更改 if "http:" not in i: h = "http:" + i + ".htm" url_list.append(h) else: url_list.append(i) #對獲取到得url進行鏈式切片獲取想要得字段 用來命名文件名字 file_name = i.split(‘/‘)[-1].split(‘.‘)[0] #把獲取到的文件名字添加到名字容器 name_list.append(file_name) #返回兩個值 return url_list,name_list #定義方法獲取詳情頁URL def load_html(self,url,name): #獲取詳情頁HTML信息 r = requests.get(url) #對詳情頁HTML信息進行解碼 html = r.content.decode("utf-8") #把相應得HTML信息寫入指定文件夾 並把動態傳過來得文件名字直接寫入並加入指定文件後綴 with open(‘E:/新建文件夾/‘+name+".html",‘w‘,encoding="utf-8") as f: f.write(html)
if __name__ == "__main__": #實例化對象 cndeta = CnBeta() #調用方法並傳入首頁URL html = cndeta.get_congtent(‘https://www.cnbeta.com/‘) #定義兩個變量分別接收方法傳過來的兩個參數 url,name = cndeta.xpath_html(html) #循環遍歷url的個數 定義線程執行的個數 在這裏直接執行len(url)個線程 for i in range(len(url)): #定義多線程爬去 target指定方法 args指定相應的url和文件名字 s = threading.Thread(target=cndeta.load_html,args=(url[i],name[i])) #守護線程 s.setDaemon(True) #執行線程 s.start() #阻塞主線程 s.join()

多線程爬蟲爬取詳情頁HTML