您好,登錄后才能下訂單哦!
這篇文章主要介紹了python中爬蟲節(jié)點(diǎn)的使用方法,具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。
爬蟲節(jié)點(diǎn)相對(duì)簡(jiǎn)單,主要包含HTML下載器、HTML解析器和爬蟲調(diào)度器。執(zhí)行流程如下:
爬蟲調(diào)度器從控制節(jié)點(diǎn)中的url_q隊(duì)列讀取URL
爬蟲調(diào)度器調(diào)用HTML下載器、HTML解析器獲取網(wǎng)頁(yè)中新的URL和標(biāo)題摘要
最后爬蟲調(diào)度器將新的URL和標(biāo)題摘要傳入result_q隊(duì)列交給控制節(jié)點(diǎn)
HTML下載器
#coding:utf-8 import requests class HtmlDownloader(object): def download(self,url): if url is None: return None user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' headers={'User-Agent':user_agent} r = requests.get(url,headers=headers) if r.status_code==200: r.encoding='utf-8' return r.text return None
HTML解析器
#coding:utf-8 import re import urlparse from bs4 import BeautifulSoup class HtmlParser(object): def parser(self,page_url,html_cont): ''' 用于解析網(wǎng)頁(yè)內(nèi)容抽取URL和數(shù)據(jù) :param page_url: 下載頁(yè)面的URL :param html_cont: 下載的網(wǎng)頁(yè)內(nèi)容 :return:返回URL和數(shù)據(jù) ''' if page_url is None or html_cont is None: return soup = BeautifulSoup(html_cont,'html.parser',from_encoding='utf-8') new_urls = self._get_new_urls(page_url,soup) new_data = self._get_new_data(page_url,soup) return new_urls,new_data def _get_new_urls(self,page_url,soup): ''' 抽取新的URL集合 :param page_url: 下載頁(yè)面的URL :param soup:soup :return: 返回新的URL集合 ''' new_urls = set() #抽取符合要求的a標(biāo)簽 links = soup.find_all('a',href=re.compile(r'/view/\d+\.htm')) for link in links: #提取href屬性 new_url = link['href'] #拼接成完整網(wǎng)址 new_full_url = urlparse.urljoin(page_url,new_url) new_urls.add(new_full_url) return new_urls def _get_new_data(self,page_url,soup): ''' 抽取有效數(shù)據(jù) :param page_url:下載頁(yè)面的URL :param soup: :return:返回有效數(shù)據(jù) ''' data={} data['url']=page_url title = soup.find('dd',class_='lemmaWgt-lemmaTitle-title').find('h2') data['title']=title.get_text() summary = soup.find('div',class_='lemma-summary') #獲取tag中包含的所有文版內(nèi)容包括子孫tag中的內(nèi)容,并將結(jié)果作為Unicode字符串返回 data['summary']=summary.get_text() return data
爬蟲調(diào)度器
class SpiderWork(object): def __init__(self): #初始化分布式進(jìn)程中的工作節(jié)點(diǎn)的連接工作 # 實(shí)現(xiàn)第一步:使用BaseManager注冊(cè)獲取Queue的方法名稱 BaseManager.register('get_task_queue') BaseManager.register('get_result_queue') # 實(shí)現(xiàn)第二步:連接到服務(wù)器: server_addr = '127.0.0.1' print('Connect to server %s...' % server_addr) # 端口和驗(yàn)證口令注意保持與服務(wù)進(jìn)程設(shè)置的完全一致: self.m = BaseManager(address=(server_addr, 8001), authkey='baike') # 從網(wǎng)絡(luò)連接: self.m.connect() # 實(shí)現(xiàn)第三步:獲取Queue的對(duì)象: self.task = self.m.get_task_queue() self.result = self.m.get_result_queue() #初始化網(wǎng)頁(yè)下載器和解析器 self.downloader = HtmlDownloader() self.parser = HtmlParser() print 'init finish' def crawl(self): while(True): try: if not self.task.empty(): url = self.task.get() if url =='end': print '控制節(jié)點(diǎn)通知爬蟲節(jié)點(diǎn)停止工作...' #接著通知其它節(jié)點(diǎn)停止工作 self.result.put({'new_urls':'end','data':'end'}) return print '爬蟲節(jié)點(diǎn)正在解析:%s'%url.encode('utf-8') content = self.downloader.download(url) new_urls,data = self.parser.parser(url,content) self.result.put({"new_urls":new_urls,"data":data}) except EOFError,e: print "連接工作節(jié)點(diǎn)失敗" return except Exception,e: print e print 'Crawl fali ' if __name__=="__main__": spider = SpiderWork() spider.crawl()
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享python中爬蟲節(jié)點(diǎn)的使用方法內(nèi)容對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問(wèn)題就找億速云,詳細(xì)的解決方法等著你來(lái)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。