目录

  • 前言
  • 要解决的问题
  • 设计方案
  • 代码说明
  • 小结

前言

前一段一直在打基础,已经学习了变量,流程控制,循环,函数这几块的知识点,就想通过写写小程序来实践一下,来加深知识点的记忆和理解。首先考虑的就是爬虫啦,一直很崇拜爬虫大师,特别想能够学习一些爬虫技术,去淘宝上爬爬数据,说不定什么时候可以使用数据进行一些分析,比如哪天自己也开了个小店啥的~~。为了能够开始起步, 我看了一些视频,查阅了一些资料,起步阶段就不用那些很牛逼的框架了,主要是想通过基本的爬虫来了解爬虫的基本概念和思路。

要解决的问题

查阅百度百科的某个关键词以及相关联的关键词的集合。这是一个比较有意义的事情,通过这样的数据能更好的理解相关的生态圈。比如我查阅“分布式计算”  http://baike.baidu.com/item/%E5%88%86%E5%B8%83%E5%BC%8F%E8%AE%A1%E7%AE%97/85448 文章里面含有很多的有链接的关键词,就这样不断的迭代去爬这些链接的关键词的文章内的关键词。

设计方案

爬虫含有5个组成部分:主程序,URL管理器,HTML下载器,HTML解析器,结果展示器

主程序:调度其他的部件的执行,并作为主程序入口来执行代码

URL管理器: 管理URL的集合以及状态 - 未下载的URL,已下载的URL,添加新的URL,去除已现在的URL

HTML下载器: 下载URL对应的HTML

HTML解析器: 解析下载下来的HTML,取出有用的数据

结果展示器: 组织最终生成的数据,并展示或者存储起来

代码说明

  • 代码组织架构

  • 代码展示
部件名称 程序名称 代码
主程序 SpiderMain.py
from Spider import UrlManager,HtmlDownloader,HtmlParser,HtmlOutputer

class Spider(object):

    def __init__(self):
self.urlmanager = UrlManager.Manager()
self.htmldownloader = HtmlDownloader.Downloader()
self.htmlparser = HtmlParser.Parser()
self.htmloutputer = HtmlOutputer.Outputer() def scrpy(self, root_url):
self.urlmanager.add_new_urls(root_url)
count = 1
while(self.urlmanager.has_new_url()):
if(count>10):
break curr_url = self.urlmanager.get_new_url()
html_content = self.htmldownloader.load(curr_url)
print("No.%d Downloading URL %s" % (count, curr_url))
word,new_urls,lemmasummary = self.htmlparser.parse(curr_url,html_content)
data={}
data['word']=word
data['curr_url']=curr_url
data['lemmasummary']=lemmasummary
self.htmloutputer.collect(data)
self.urlmanager.add_new_urls(new_urls)
count = count + 1
self.htmloutputer.genhtml() if(__name__=='__main__'):
root_url = "http://baike.baidu.com/item/%E5%88%86%E5%B8%83%E5%BC%8F%E8%AE%A1%E7%AE%97/85448"
spider = Spider()
spider.scrpy({root_url})
URL管理器 UrlManager.py
class Manager(object):
def __init__(self):
self.old_urls=set()
self.new_urls=set() def add_new_urls(self, root_url):
for url in root_url:
if(root_url not in self.old_urls and root_url not in self.new_urls):
self.new_urls.add(url) def has_new_url(self):
if(len(self.new_urls) > 0):
return True
else:
return False def get_new_url(self):
tmp=self.new_urls.pop()
self.old_urls.add(tmp)
return tmp
HTML下载器 HtmlDownloader.py
import urllib.request

class Downloader(object):
def load(self, curr_url):
html = urllib.request.urlopen(curr_url)
return html.read().decode("UTF-8",'ignore')
HTML解析器 HtmlParser.py
import re
from urllib.parse import urljoin
from bs4 import BeautifulSoup class Parser(object):
def __init__(self):
self.title = ''
self.urls = set()
self.lemmasummary = '' def parse(self, curr_url, html_content):
soup = BeautifulSoup(html_content, 'html.parser',from_encoding="utf-8")
soupurls=soup.find_all('a',href=re.compile(r'/view'))
for url in soupurls:
self.urls.add(urljoin(curr_url,url['href']))
self.title = soup.title.string.split("_")[0]
self.lemmasummary = soup.find('div',class_='lemma-summary')
return self.title,self.urls,self.lemmasummary
结果展示器 HtmlOutputer.py
class Outputer(object):
def __init__(self):
self.table = [] def collect(self, data):
self.table.append(data) def genhtml(self):
html = open('result.html','w')
html.write("<html>")
html.write("<head>")
html.write("</head>")
html.write("<body>")
html.write("<table>")
for data in self.table:
html.write("<tr>")
html.write("<td>%s</td>" % data['word'])
html.write("<td>%s</td>" % data['curr_url'])
html.write("<td>%s</td>" % data['lemmasummary'])
html.write("</tr>")
html.write("</table>")
html.write("</body>")
html.write("</html>")
html.close()
  • 最终的结果

小结

在上面的爬虫代码里面,主要体现了爬虫的几个部件之间的配合,以及每个部件的所引用的模块,比如urllib,bs4,re

Python进阶篇:Python简单爬虫的更多相关文章

  1. python 进阶篇 python 的值传递

    值传递和引用传递 值传递,通常就是拷贝参数的值,然后传递给函数里的新变量,这样,原变量和新变量之间互相独立,互不影响. 引用传递,通常是指把参数的引用传给新的变量,这样,原变量和新变量就会指向同一块内 ...

  2. python进阶篇

    python进阶篇 import 导入模块 sys.path:获取指定模块搜索路径的字符串集合,可以将写好的模块放在得到的某个路径下,就可以在程序中import时正确找到. ​ import sys ...

  3. python根据正则表达式的简单爬虫

    今天根据正则表达式简单的爬了一下大众点评,把北京的美食爬了爬,(店铺名,人均消费,地址) import re import urllib.request from urllib.request imp ...

  4. python+senium+chrome的简单爬虫脚本

    简述: 开始接触python写web自动化的脚本主要源于在公司订阅会议室,主要是使用python+selenium+chromedriver驱动chrome浏览器来完成的,其中部分python代码可以 ...

  5. python第一篇-------python介绍

    一.python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,Guido开始写Python语言的编译器.Python这个名字,来自Guido所 ...

  6. Python 进阶篇

    作者:武沛齐 出处:http://www.cnblogs.com/wupeiqi/articles/5246483.html Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这 ...

  7. python练习1(简单爬虫)

    做一个简单的练习 目标:爬取中文小说 目标网站:http://www.biqule.com/book_58/26986.html 只爬取正文部分. 使用requests库来获取网页信息,使用re库正则 ...

  8. python 进阶篇 函数装饰器和类装饰器

    函数装饰器 简单装饰器 def my_decorator(func): def wrapper(): print('wrapper of decorator') func() return wrapp ...

  9. python放弃篇(Django/爬虫)

    第一篇:Django系列 第二篇:爬虫系列 待续……

随机推荐

  1. Strusts2笔记5--数据验证

    数据验证: 输入验证分为客户端验证与服务器端验证.客户端验证主要通过JavaScript脚本进行,而服务器端验证主要是通过Java代码进行验证. 分为以下四种情况: (1)手工编写代码,对Action ...

  2. Django 1.10中文文档-模型参考

    模型字段 本文档包含了Django提供的全部模型 Field 包括 字段选项 和 字段类型 的API参考. 参见 如果内建的字段不能满足你的需求, 你可以蚕食 django-localflavor ( ...

  3. git fetch 命令

    git fetch命令用于从另一个存储库下载对象和引用. 使用语法 git fetch [<options>] [<repository> [<refspec>…] ...

  4. CentOS时区GMT修改为CST

    GMT:格林尼标准时间 北京时间=GMT时间+8小时 [root@sa~]# date -R 查看目前服务器的时间标准 [root@sa~]# vi /etc/sysconfig/clock 将ZON ...

  5. python几种装饰器的用法

    用函数装饰函数 这种比较常见首先定义装饰器函数 def cache(func): data = {} @wraps(func) def wrapper(*args, **kwargs): key = ...

  6. pymongo的几个操作

    # -*- coding: utf-8 -*- # @Time : 2018/9/11 17:16 # @Author : cxa # @File : mongotest.py # @Software ...

  7. 10 The Go Programming Language Specification go语言规范 重点

    The Go Programming Language Specification go语言规范 Version of May 9, 2018 Introduction 介绍 Notation 符号 ...

  8. python面向对象(六)之元类

    元类 1. 类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Python中这一点仍然成立: In [13]: class ObjectCreator(object): . ...

  9. python随笔(二)

    range(2,10):不包括10 range(2,10,3):步长为3 range(10,2,-1):从10到2,步长-1.

  10. 异步消息框架netty

    Netty-WebSocket长连接推送服务 http://blog.csdn.net/z69183787/article/details/52505249 http://blog.csdn.net/ ...