网页抓取数据百度百科(本文是针对慕课网关于python爬虫课程的总结记录! )

优采云 发布时间: 2021-09-28 10:09

  网页抓取数据百度百科(本文是针对慕课网关于python爬虫课程的总结记录!

)

  本文针对来自的python爬虫课程总结记录!

  1、简介

  一个完整的爬虫架构包括:调度器、url管理器、网页下载器、网页解析器。

  Scheduler:爬虫的主要功能

  网址管理器:网址管理的作用是管理未抓取的网址和已抓取的网址。常见的实现方式有:内存(使用python的set实现)、关系数据库、缓存数据库(*敏*感*词*关系数据库,如redis))

  网页下载器:将互联网上url对应的网页下载到本地进行后续分析处理的工具。常用网页下载器:urllib2(官方)、request(第三方)

  网页解析器:网页内容下载后,需要进行解析,才能判断是否有我们需要的内容。然后网页解析器完成这个功能。常见的网页解析器实现方式有:正则表达式、html.parser(官方)、beautifulSoup(第三方插件,功能强大)、lxml

  2、实用代码

  本节给出1000条课程中百度百科相关python词条(IDE为eclipse下的PyDev)

  2.1 个调度器

  #coding:utf-8

'''

Created on 2016年5月15日

@author: Owen

'''

from spider import url_maneger, html_downloader, html_parser, html_outputer

class SpiderMain(object):

def __init__(self):

self.urls = url_maneger.UrlManager()

self.downloader = html_downloader.HtmlDownloader()

self.parser = html_parser.HtmlParser()

self.outputer = html_outputer.HtmlOutputer()

def craw(self, root_url):

count = 1

self.urls.addNewUrl(root_url)

while self.urls.hasNewUrl():

try:

new_url = self.urls.getNewUrl()

print('craw %d:%s'%(count,new_url))

html_cont = self.downloader.download(new_url)

new_urls,new_data = self.parser.parse(new_url,html_cont)

self.urls.addNewUrls(new_urls)

self.outputer.collectData(new_data)

if count == 1000:

break;

count += 1

except:

print("craw failed!")

self.outputer.outputHtml()

if __name__ == '__main__':

root_url = "http://baike.baidu.com/view/21087.htm"

obj_spider = SpiderMain()

obj_spider.craw(root_url)

  2.2 网址管理器

  #-*- coding: UTF-8 -*-

'''

Created on 2016年5月15日

@author: Owen

'''

class UrlManager(object):

def __init__(self):

self.newUrls = set() #未爬取的url集合

self.oldUrls = set() #已经爬取的url集合

def hasNewUrl(self):

return len(self.newUrls)!=0

def getNewUrl(self):

new_url = self.newUrls.pop()

self.oldUrls.add(new_url)

return new_url

def addNewUrl(self,url):

if url is None:

return

if url not in self.newUrls and url not in self.oldUrls:

self.newUrls.add(url)

def addNewUrls(self,urls):

if urls is None or len(urls)==0:

return

for url in urls:

self.addNewUrl(url)

  2.3 网络下载器

  2.4 网页解析器

  #-*- coding: UTF-8 -*-

'''

Created on 2015年5月15日

@author: Owen

'''

from bs4 import BeautifulSoup

import re

import urlparse

class HtmlParser(object):

def getNewUrls(self, page_url, soup):

links = soup.find_all('a',href = re.compile(r"/view/\d+\.htm"))

new_urls = set()

for link in links:

new_url = link['href']

new_full_url = urlparse.urljoin(page_url,new_url)

new_urls.add(new_full_url)

return new_urls

def getNewData(self, page_url, soup):

res_data = {}

#url

res_data['url'] = page_url

#

#Python

title_node = soup.find('dd',class_="lemmaWgt-lemmaTitle-title").find("h1")

res_data['title'] = title_node.get_text()

#

summary_node = soup.find('div',class_ = "lemma-summary")

res_data['summary'] = summary_node.get_text()

return res_data

def parse(self,page_url,html_cont):

if page_url is None or html_cont is None:

return

soup = BeautifulSoup(html_cont,'html.parser',from_encoding='utf-8')

new_urls = self.getNewUrls(page_url,soup)

new_data = self.getNewData(page_url,soup)

return new_urls,new_data

  2.5 文件保存

  #-*- coding: UTF-8 -*-

'''

Created on 2016年5月15日

@author: Owen

'''

#将爬取之后的网页保存到本地文件中,保存为网页格式

class HtmlOutputer(object):

def __init__(self):

self.datas=[]

def collectData(self,data):

if data is None:

return

self.datas.append(data)

def outputHtml(self):

fout = open('output.html','w')

fout.write("")

fout.write("")

fout.write('') #告诉浏览器使用何种编码

fout.write("")

for data in self.datas:

fout.write("")

fout.write("%s"%data['url'])

fout.write("%s"%data['title'].encode('utf-8'))

fout.write("%s"%data['summary'].encode('utf-8'))

fout.write("")

fout.write("")

fout.write("")

fout.write("")

  2.6 运行结果

  

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线