华南俳烁实业有限公司

python

當(dāng)前位置:中華考試網(wǎng) >> python >> python爬蟲 >> 文章內(nèi)容

python爬蟲節(jié)點(diǎn)是什么?怎么用?

來源:中華考試網(wǎng)  [2020年11月26日]  【

  爬蟲節(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

python課程免費(fèi)試聽預(yù)約

  • 地區(qū):
  • 姓名:
  • 手機(jī):

  :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í)候可以多下一些功夫。

責(zé)編:fushihao
  • 會計(jì)考試
  • 建筑工程
  • 職業(yè)資格
  • 醫(yī)藥考試
  • 外語考試
  • 學(xué)歷考試
碌曲县| 和田县| 金坛市| 峨山| 南溪县| 宁阳县| 吉首市| 绥中县| 奇台县| 华蓥市| 白水县| 乌鲁木齐市| 赤峰市| 隆回县| 东乡族自治县| 普兰店市| 资源县| 建宁县| 正镶白旗| 巴林右旗| 左贡县| 久治县| 广宁县| 买车| 都匀市| 和龙市| 威信县| 普兰县| 驻马店市| 沂源县| 寻乌县| 肃北| 射洪县| 社旗县| 隆回县| 襄樊市| 土默特右旗| 三河市| 桃源县| 商南县| 五台县|