目标分析:
目标:百度百科python词条相关词条网页 - 标题和简介

入口页:https://baike.baidu.com/item/Python/407313

URL格式:
- 词条页面URL:/item/xxxx

数据格式:
- 标题:
<dd class="lemmaWgt-lemmaTitle-title"><h1>***</h1></dd>

- 简介:
<div class="lemma-summary">***</div>

页面编码:utf-8

爬虫主入口文件

spider_main.py

# coding:utf-8
import url_manager
import html_downloader
import html_parser
import html_outputer class SpiderMain(object):
def __init__(self):
# url管理器
self.urls = url_manager.UrlManager()
# 下载器
self.downloader = html_downloader.HtmlDownloader()
# 解析器
self.parser = html_parser.HtmlParser()
# 输出控制器
self.outputer = html_outputer.HtmlOutputer() def craw(self, root_url):
# 记录当前爬取的是第几个url
count = 1
self.urls.add_new_url(root_url)
# 如果有待爬取的url就继续while循环
'''
while self.urls.has_new_url():
try:
new_url = self.urls.get_new_url()
print 'craw %d : %s' % (count, new_url)
# 下载url页面
html_cont = self.downloader.download(new_url)
# 进行url解析并获取url的数据
new_urls, new_data = self.parser.parse(new_url, html_cont)
# url解析及数据搜集
self.urls.add_new_urls(new_urls)
self.outputer.collect_data(new_data) if count >= 1000:
break
count = count + 1
except Exception as e:
print 'craw failed'
print e
'''
while self.urls.has_new_url():
new_url = self.urls.get_new_url()
print 'craw %d : %s' % (count, new_url)
# 下载url页面
html_cont = self.downloader.download(new_url)
# print html_cont
# 进行url解析并获取url的数据
new_urls, new_data = self.parser.parse(new_url, html_cont)
# url解析及数据搜集
self.urls.add_new_urls(new_urls)
self.outputer.collect_data(new_data) if count >= 10:
break
count = count + 1 # 输出到指定页面
self.outputer.output_html() if __name__ == "__main__":
root_url = "https://baike.baidu.com/item/Python/407313"
obj_spider = SpiderMain()
obj_spider.craw(root_url)

网页管理器

url_manager.py

# coding:utf-8

class UrlManager(object):
def __init__(self):
# 要爬取的url
self.new_urls = set()
# 爬取过的url
self.old_urls = set() def add_new_url(self, url):
if url is None:
return
# 如果url不在要爬取的url里面也不在爬取过的url里面就添加进来
if url not in self.new_urls and url not in self.old_urls:
self.new_urls.add(url) def add_new_urls(self, urls):
if urls is None or len(urls) == 0:
return
for url in urls:
self.add_new_url(url) def has_new_url(self):
return len(self.new_urls) != 0 def get_new_url(self):
new_url = self.new_urls.pop()
self.old_urls.add(new_url)
return new_url

网页下载器

html_downloader.py

# coding:utf-8

import urllib2

class HtmlDownloader(object):
def download(self, url):
if url is None:
return None response = urllib2.urlopen(url) if response.getcode() != 200:
return None return response.read()

网页分析器

html_parser.py

# coding:utf-8

from bs4 import BeautifulSoup
import re
import urlparse class HtmlParser(object): def _get_new_urls(self, page_url, soup):
# 得到所有的词条url
links = soup.find_all('a', href=re.compile(r"/item/.*"))
# print links
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 _get_new_data(self, page_url, soup):
res_data = {}
# url
res_data['url'] = page_url # <dd class="lemmaWgt-lemmaTitle-title">
# <h1>Python</h1>
title_node = soup.find('dd', class_='lemmaWgt-lemmaTitle-title').find("h1")
res_data['title'] = title_node.get_text()
# <div class="lemma-summary" label-module="lemmaSummary">
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._get_new_urls(page_url, soup)
new_data = self._get_new_data(page_url, soup) return new_urls,new_data

网页输出器

html_outputer.py

# coding:utf-8

class HtmlOutputer(object):
def __init__(self):
self.datas = [] def collect_data(self, data):
if data is None:
return
self.datas.append(data) # ascii
def output_html(self):
fout = open('output.html', 'w') fout.write("<html>")
fout.write("<body>")
fout.write("<table>") for data in self.datas:
fout.write("<tr>")
fout.write("<td>%s</td>" % data['url'])
fout.write("<td>%s</td>" % data['title'].encode('utf-8'))
fout.write("<td>%s</td>" % data['summary'].encode('utf-8'))
fout.write("</tr>") fout.write("/table")
fout.write("/body")
fout.write("/html")

运行代码:

结果页面

python简单爬虫爬取百度百科python词条网页的更多相关文章

  1. python爬虫—爬取百度百科数据

    爬虫框架:开发平台 centos6.7 根据慕课网爬虫教程编写代码 片区百度百科url,标题,内容 分为4个模块:html_downloader.py 下载器 html_outputer.py 爬取数 ...

  2. Python简易爬虫爬取百度贴吧图片

    通过python 来实现这样一个简单的爬虫功能,把我们想要的图片爬取到本地.(Python版本为3.6.0) 一.获取整个页面数据 def getHtml(url): page=urllib.requ ...

  3. 【Python】Python简易爬虫爬取百度贴吧图片

    通过python 来实现这样一个简单的爬虫功能,把我们想要的图片爬取到本地.(Python版本为3.6.0) 一.获取整个页面数据 def getHtml(url): page=urllib.requ ...

  4. 慕课爬虫实战 爬取百度百科Python词条相关1000个页面数据

    http://www.imooc.com/learn/563 spider_main.py #!/usr/bin/python # coding=utf-8 #from baike_spider im ...

  5. Python——爬取百度百科关键词1000个相关网页

    Python简单爬虫——爬取百度百科关键词1000个相关网页——标题和简介 网站爬虫由浅入深:慢慢来 分析: 链接的URL分析: 数据格式: 爬虫基本架构模型: 本爬虫架构: 源代码: # codin ...

  6. Python开发简单爬虫(二)---爬取百度百科页面数据

    一.开发爬虫的步骤 1.确定目标抓取策略: 打开目标页面,通过右键审查元素确定网页的url格式.数据格式.和网页编码形式. ①先看url的格式, F12观察一下链接的形式;② 再看目标文本信息的标签格 ...

  7. 爬虫实战(一) 用Python爬取百度百科

    最近博主遇到这样一个需求:当用户输入一个词语时,返回这个词语的解释 我的第一个想法是做一个数据库,把常用的词语和词语的解释放到数据库里面,当用户查询时直接读取数据库结果 但是自己又没有心思做这样一个数 ...

  8. Python爬虫 - 爬取百度html代码前200行

    Python爬虫 - 爬取百度html代码前200行 - 改进版,  增加了对字符串的.strip()处理 源代码如下: # 改进版, 增加了 .strip()方法的使用 # coding=utf-8 ...

  9. python爬虫-爬取百度图片

    python爬虫-爬取百度图片(转) #!/usr/bin/python# coding=utf-8# 作者 :Y0010026# 创建时间 :2018/12/16 16:16# 文件 :spider ...

随机推荐

  1. 《剑指offer》面试题17—合并两个排序链表

    题目:输入两个递增排顺序的链表,合并这两个链表并使合并后的链表仍是递增排序的. 重点: 1.代码鲁棒性:要判断输入的两个链表都为NULL:其中一个链表为NULL的情况. 2.用递归实现,注意递归的思路 ...

  2. LuaToC#

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  3. MySql用户配置

    数据库:MySQL5.7 注意事项: MySQL5.7 mysql.user 表没有 password字段 改 authentication_string: 一.前言 我们在创建数据库和权限的时候才用 ...

  4. angularjs 切换tab页的一个方法

    tab条的 css: .floor-tab-li { float: left; padding: 6px 12px; font-size: 14px; font-weight: normal; lin ...

  5. 洛谷P3857 [TJOI2008]彩灯(线性基)

    传送门 线性基裸题 直接把所有的状态都带进去建一个线性基 然后答案就是$2^{cnt}$($cnt$代表线性基里数的个数) //minamoto #include<cstdio> #inc ...

  6. [Xcode 实际操作]九、实用进阶-(2)遍历设备(输出系统)上的所有字体

    目录:[Swift]Xcode实际操作 在实际工作中,经常需要调整界面元素的字体种类. 本文将演示输出系统提供的所有字体,方便检索和使用. 在项目导航区,打开视图控制器的代码文件[ViewContro ...

  7. 【OpenJ_Bailian - 2795】金银岛(贪心)

    金银岛 Descriptions: 某天KID利用飞行器飞到了一个金银岛上,上面有许多珍贵的金属,KID虽然更喜欢各种宝石的艺术品,可是也不拒绝这样珍贵的金属.但是他只带着一个口袋,口袋至多只能装重量 ...

  8. (转)关于MongoDB你需要知道的几件事

    本文列举了颇让作者困惑的一些MongoDB限制,如果你也打算使用MongoDB,那么至少要提前了解这些限制,以免遇到的时候措手不及. 消耗磁盘空间 这是我的第一个困惑:MongoDB会消耗太多的磁盘空 ...

  9. Sublime Text 报“Pylinter could not automatically determined the path to lint.py

    Pylinter could not automatically determined the path to lint.py. please provide one in the settings ...

  10. BZOJ1218(线段树+扫描线)

    1.扫描线扫描x轴,线段树维护y轴. 2.坐标+1,线段树是从1开始维护.然后让边长--,这样就能包含边上的点了. 3.为了保证点在正方形内:在x轴上利用差分的思想,在x出Add(val),在x+r( ...