爬蟲節(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 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)頁內(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('h1')
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()
需要著重說明的是,爬蟲節(jié)點(diǎn)是分布式爬蟲里的一個(gè)重要的難點(diǎn),大家在學(xué)習(xí)的時(shí)候可以多下一些功夫。
上一篇:python分布式爬蟲中的Redis是什么?怎么用?
下一篇: 沒有了
初級會計(jì)職稱中級會計(jì)職稱經(jīng)濟(jì)師注冊會計(jì)師證券從業(yè)銀行從業(yè)會計(jì)實(shí)操統(tǒng)計(jì)師審計(jì)師高級會計(jì)師基金從業(yè)資格稅務(wù)師資產(chǎn)評估師國際內(nèi)審師ACCA/CAT價(jià)格鑒證師統(tǒng)計(jì)資格從業(yè)
一級建造師二級建造師消防工程師造價(jià)工程師土建職稱房地產(chǎn)經(jīng)紀(jì)人公路檢測工程師建筑八大員注冊建筑師二級造價(jià)師監(jiān)理工程師咨詢工程師房地產(chǎn)估價(jià)師 城鄉(xiāng)規(guī)劃師結(jié)構(gòu)工程師巖土工程師安全工程師設(shè)備監(jiān)理師環(huán)境影響評價(jià)土地登記代理公路造價(jià)師公路監(jiān)理師化工工程師暖通工程師給排水工程師計(jì)量工程師
人力資源考試教師資格考試出版專業(yè)資格健康管理師導(dǎo)游考試社會工作者司法考試職稱計(jì)算機(jī)營養(yǎng)師心理咨詢師育嬰師事業(yè)單位教師招聘公務(wù)員公選考試招警考試選調(diào)生村官
執(zhí)業(yè)藥師執(zhí)業(yè)醫(yī)師衛(wèi)生資格考試衛(wèi)生高級職稱護(hù)士資格證初級護(hù)師主管護(hù)師住院醫(yī)師臨床執(zhí)業(yè)醫(yī)師臨床助理醫(yī)師中醫(yī)執(zhí)業(yè)醫(yī)師中醫(yī)助理醫(yī)師中西醫(yī)醫(yī)師中西醫(yī)助理口腔執(zhí)業(yè)醫(yī)師口腔助理醫(yī)師公共衛(wèi)生醫(yī)師公衛(wèi)助理醫(yī)師實(shí)踐技能內(nèi)科主治醫(yī)師外科主治醫(yī)師中醫(yī)內(nèi)科主治兒科主治醫(yī)師婦產(chǎn)科醫(yī)師西藥士/師中藥士/師臨床檢驗(yàn)技師臨床醫(yī)學(xué)理論中醫(yī)理論