Python开发轻量级爬虫

1.概述

对于轻量级爬虫

  • 只抓取静态页面

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

  • 如何模拟登陆
  • 验证码识别
  • 分布式爬取网页
  • 数据存储
  • 网页更新

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

对于一个简单的爬虫架构,它包含了以下三大模块:
<font color=#FF4500>URL管理器:</font> 用来管理将要抓取的URL和已经抓取过的URL
<font color=#FF4500>HTML下载器:</font>给定一个URL,需要将其网页下载到本地后才能进行后续的分析。(这里使用Python自带的urllib2模块)
<font color=#FF4500>HTML解析器:</font>得到了网页的内容以后,我们需要对其进行解析才能提取出我们想要的、我们感兴趣的内容。(这里使用Python的第三方插件BeautifulSoup)


2.爬虫架构:

<font color=#FF4500>爬虫调度端:</font>
启动爬虫、停止爬虫或者监视爬虫的运行情况

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

<font color=#FF4500>URL管理器:</font>对将要抓取的URL和已经抓取过的URL进行管理。我们可以取出一个将要爬取的URL传送给<font color=#FF4500>HTML下载器:</font>,下载器会将URL指定的网页下载下来,存储成一个字符串,这个字符串会传送给<font color=#FF4500>HTML解析器:</font>进行解析,一方面会解析出有价值的数据,另一方面每一个网页会有许多指向其他网页的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有哪几种网页下载器?

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

  • <font color=#FF4500>requests</font>是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')```

- 访问节点信息

得到结点:<a href='1.html'> Python </a>

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

node.name

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

node['href']

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

node.get_text()```

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

6.实例

这里爬取的是百度百科Python词条相关的1000个页面数据(本实例来源于慕课网教程)。
然后将这些数据写出到一个HTML5页面中,打开这个页面就可以看到我们已经爬取好的数据。
代码我已经敲了一遍,在Python3 版本亲测可执行,可以在我的GitHub获取。
爬取结果如下图:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容