python轻量级存储方案_Python开发轻量级爬虫

1.概述

对于轻量级爬虫:

只抓取静态页面

而对于高级的爬虫,需要考虑的因素就较多,如:

如何模拟登陆

验证码识别

分布式爬取网页

数据存储

网页更新

这些因素都具有重要的现实意义,但是对于初学者来讲,了解爬虫的基础架构显得更为必要,在实际应用场景中对其扩展可以爬取其他网页。

对于一个简单的爬虫架构,它包含了以下三大模块:

URL管理器: 用来管理将要抓取的URL和已经抓取过的URL

HTML下载器:给定一个URL,需要将其网页下载到本地后才能进行后续的分析。(这里使用Python自带的urllib2模块)

HTML解析器:得到了网页的内容以后,我们需要对其进行解析才能提取出我们想要的、我们感兴趣的内容。(这里使用Python的第三方插件BeautifulSoup)

2.爬虫架构:

爬虫调度端:

启动爬虫、停止爬虫或者监视爬虫的运行情况

而在爬虫程序中有三个模块:

URL管理器:对将要抓取的URL和已经抓取过的URL进行管理。我们可以取出一个将要爬取的URL传送给HTML下载器:,下载器会将URL指定的网页下载下来,存储成一个字符串,这个字符串会传送给HTML解析器:进行解析,一方面会解析出有价值的数据,另一方面每一个网页会有许多指向其他网页的URL,这些URL被解析出来以后可以补充进URL管理器。

URL管理器、HTML下载器和HTML下载器会形成一个循环,只要有相关联的URL就会一直运行下去。以上这些模块就组成了这个简单的爬虫架构。这个架构就可以把互联网上的相关所有网页下载下来。

爬虫架构

爬虫运行流程:

下图以时序图的方式给出了爬虫架构的运行流程

简单爬虫架构动态运行流程

3.URL管理器

URL管理器:管理待抓取URL集合和已抓取URL集合

防止重复抓取、防止循环抓取

URL管理器功能

URL管理器功能

Python爬虫URL管理器实现方式

URL管理器的实现方式

4.HTML下载器

HTML下载器简介

HTML下载器:将互联网上URL上对应的网页下载到本地的工具。可以说HTML下载器是爬虫的核心组件

HTML下载器

Python有哪几种网页下载器?

urllib2是Python官方的基础模块,支持直接的URL下载,或者向网页提供需要用户输入的数据,甚至支持需要登录网页的cookie处理,需要代理访问的代理处理等这些增强功能

requests是Python的第三方插件,它提供更为强大的功能

HTML下载器分类

这里使用urllib2.

urllib2下载网页的三种方法

1.最简洁方法

给定一个url,将其传送给urllib2模块的urlopen()方法,即:urllib2.urlopen(url)

对应到代码:

import urllib2

# 直接请求

response=urllib2.urlopen('http://www.baidu.com')

# 获取状态码,如果是200表示获取成功

print response.getcode()

# 读取内容

cont=response.read()```

**2.添加data、http header**

![方法2](http://upload-images.jianshu.io/upload_images/3480470-7cdf6be81b2e6df3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

对应到代码:

import urllib2

创建Request对象

request=urllib2.Request(url)

添加data

request.add_data('a','1')

添加http的header

request.add_header('User-Agent','Mozilla/5.0')

发送请求获取结果

response=urllib2.urlopen(request)```

3.添加特殊情景的处理器

特殊情景处理器

例如,增强cookie的处理,对应到代码:

import urllib2,cookielib

# 创建cookie容器

cj=cookielib.CookieJar()

# 创建一个opener

opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

# 给urllib2安装opener

urllib2.install_opener(opener)

# 使用带有cookie的urllib2访问网页

reponse=urllib2.urlopen("http://www.baidu.com/")```

以上三种方法都实现了网页的下载,但是每一种方法都比前一种方法有更大的更强的功能处理。

### 5.HTML解析器和BeautifulSoup第三方模块

>#### HTML解析器

HTML解析器:从网页中提取有价值数据的工具

![网页解析器](http://upload-images.jianshu.io/upload_images/3480470-21afe8826281ba9b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

Python有哪几种HTML解析器?

![HTML解析器分类](http://upload-images.jianshu.io/upload_images/3480470-ab5a1e42c60da28a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

- **结构化解析-DOM(Document Object Model)树**

![DOM树.png](http://upload-images.jianshu.io/upload_images/3480470-e5138777c3844bb9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

>#### Beautiful Soup

- Python第三方库,用于从HTML或XML中提取数据

- 官网:http://www.crummy.com/software/BeautifulSoup/

- 安装并测试beautifulsoup4

- 安装:pip install beautifulsoup4

- 测试:import bs4

- Beautiful Soup-语法

![Beautiful Soup-语法](http://upload-images.jianshu.io/upload_images/3480470-cbdbe787de89ceb1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

例如:

![举例](http://upload-images.jianshu.io/upload_images/3480470-b8106c578b037fea.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

对应到代码:

- 创建BeautifulSoup对象

form bs4 import BeautifulSoup

根据HTML网页字符串创建BeautifulSoup对象

soup=BeautifulSoup(

html_doc, #HTML文档字符串

'html.paser' #HTML解析器

from_encoding='utf8' #HTML文档的编码

)```

搜索节点(find_all,find)

# 方法:find_all(name,attrs,string)

# 查找所有标签为a的节点

soup.find_all('a')

# 查找所有标签为a,链接符合/view/123.htm形式的节点

soup.find_all('a',href='/view/123.htm')

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

# 查找所有标签为div,class为abc,文字为Python的节点

soup.find_all('div',class_='abc',string='Python')```

- 访问节点信息

得到结点: Python

获取查找到的节点的标签名称

node.name

获取查找到的a结点的href属性

node['href']

获取 查找到的a结点的链接文字

node.get_text()```

** 通过以上创建BS对象、搜索DOM树、访问节点的内容,就可以实现对整个下载好的网页所有节点的解析、访问。**

6.实例

我的GitHub获取。

爬取结果如下图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值