您好,登錄后才能下訂單哦!
小編給大家分享一下多線程在python3爬蟲中調用函數的示例,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
可以說函數和python爬蟲一般情況下都可以結合使用,但是這需要小伙伴們對于函數的使用方法進行充分的了解,才能和python爬蟲的知識點緊密結合使用。經過幾天多線程和爬蟲的內容講解,相信大家對于這方面的模塊內容已經比較熟悉的,所以可以用我們的老朋友download()函數進行一次知識點的交流,下面就來來看看download()在python爬蟲中的運用吧。
對其進行構造,創建日志,download()函數創建線程,update_queque_url對連接的列表進行更新,get_url()根據bs4進行匹配獲取連接,download_all()通過調用download()函數實現批量下載。spider作為一個入口函數進行爬取
class Crawler: def __init__(self,name,domain,thread_number): self.name=name self.domain=domain self.thread_number=thread_number self.logfile=open('log.txt','w') self.thread_pool=[] self.url = 'http://'+domain def spider(self):# 內容會隨著爬蟲的進行而更新 global g_queue_urls# 初始,隊列中僅有一個url g_queue_urls.append(self.url)# 爬取的深度 depth =0 print(f'爬蟲{self.name}開始啟動........') while g_queue_urls: depth +=1 print(f'當前爬取深度是{depth}') self.logfile.write(f'URL:{g_queue_urls[0]}') self.download_all() # 下載所有 self.update_queque_url() # 更新 url隊列 self.logfile.write(f">>>Depth:{depth}") count = 0 while count <len(g_queue_urls): self.logfile.write(f"累計爬取{g_total_count}條,爬取是第{g_queue_urls[count]}個") count+=1 def download_all(self): global g_queue_urls global g_total_count i=0 while i < len(g_queue_urls): j=0 while j<self.thread_number and i+j <len(g_queue_urls): g_total_count +=1 print(g_queue_urls[i+j]) thread_result=self.download(g_queue_urls[i+j],f"{g_total_count}.html",j) if thread_result is not None: print(f'線程{i+j}啟動') j +=1 i=i+j for thread in self.thread_pool: thread.join(25) g_queue_urls=[] def download(self,url,filename,tid): print(url,filename,tid) creawler_thread= CrawlerThread(url,filename,tid) self.thread_pool.append(creawler_thread) creawler_thread.start() def update_queque_url(self): global g_queue_urls global g_exist_urls#已經爬過的url new_urls=[]#新發現的url for url_content in g_urls: new_urls +=self.get_Url(url_content)# 從頁面中提取新url g_queue_urls=list(set(new_urls) -set(g_exist_urls)) # 去除重復的和已經爬過的 def get_Url(self,content): ''' 從網頁源代碼中提取url ''' links =[] # 保存提取到的href try: soup =BeautifulSoup(content) for link in soup.findAll('a'): if link is not None and link.get('href') is not None: if self.domain in link['href']: # 如果link是本網站的絕對地址 links.append(link) elif len(link['href']) >10 and 'http://' not in link['href']: # 如果link是相對地址 links.append(self.url +link['href']) except Exception as e: print("fail to get url",e) return links
主函數調用爬蟲函數的spider()方法
if __name__=="__main__": domain ="www.geyanw.com" thread_number=10 name="geyan" crawler =Crawler(name,domain,thread_number) crawler.spider()
除了download()函數,spider()也可以在python爬蟲中調用。
以上是“多線程在python3爬蟲中調用函數的示例”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。