這篇文章主要介紹了python中爬蟲節(jié)點(diǎn)的使用方法,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

爬蟲節(jié)點(diǎn)相對簡單,主要包含HTML下載器、HTML解析器和爬蟲調(diào)度器。執(zhí)行流程如下:
爬蟲調(diào)度器從控制節(jié)點(diǎn)中的url_q隊(duì)列讀取URL
爬蟲調(diào)度器調(diào)用HTML下載器、HTML解析器獲取網(wǎng)頁中新的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 NoneHTML解析器
#coding:utf-8
import re
import urlparse
from bs4 import BeautifulSoup
class HtmlParser(object):
def parser(self,page_url,html_cont):
'''
用于解析網(wǎng)頁內(nèi)容抽取URL和數(shù)據(jù)
:param page_url: 下載頁面的URL
:param html_cont: 下載的網(wǎng)頁內(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: 下載頁面的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:下載頁面的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注冊獲取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的對象:
self.task = self.m.get_task_queue()
self.result = self.m.get_result_queue()
#初始化網(wǎng)頁下載器和解析器
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)容對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,遇到問題就找創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,詳細(xì)的解決方法等著你來學(xué)習(xí)!
當(dāng)前標(biāo)題:python中爬蟲節(jié)點(diǎn)的使用方法-創(chuàng)新互聯(lián)
URL地址:http://www.yijiale78.com/article40/ceigho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、品牌網(wǎng)站制作、ChatGPT、企業(yè)網(wǎng)站制作、網(wǎng)站收錄、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)