python开发简单爬虫:准备篇

本文介绍了一个简单的Python爬虫架构,包括爬虫调度端、URL管理器、网页下载器及网页解析器等关键组件的工作原理。此外,还详细介绍了如何使用Python进行网页下载和解析。

python开发简单爬虫:准备篇

  这篇博客是用于记录自己学习python爬虫的过程,以下内容是看过慕课网python开发简单爬虫之后自己整理的一些东西,防止自己忘记。

1. 简单的爬虫架构

1.1 架构图

  一个简单爬虫的架构图如下所示:

  其中爬虫调度端用来启动爬虫、停止爬虫或者监视爬虫的运行情况;URL管理器是对将要爬取的URL和已经爬取的URL进行管理;从URL中取出一个待爬取的URL,将其传送给网页下载器,网页下载器会将指定的URL网页下载下来,存储成一个字符串;这个字符串会传送给网页解析器进行解析,网页解析器将会解析出有价值的数据传送给应用程序,将解析出的有用的URL传送给URL管理器。以上这些模块就组成了一个简单的爬虫架构。

1.2 时序图

  简单爬虫架构的动态运行流程如下图所示:

Created with Raphaël 2.1.0 爬虫调度端 爬虫调度端 URL管理器 URL管理器 网页下载器 网页下载器 网页解析器 网页解析器 应用 应用 有待爬取的URL? 是\否 若‘是’ 获取一个待爬取的URL URL URL URL的下载内容 URL的下载内容 价值数据、新的URL列表 收集价值数据 新增待爬取URL 循环至‘否’ 输出价值数据。

2. URL管理器

  URL管理器:管理待爬取的URL集合和以爬取的URL集合。作用是防止重复爬取和循环爬取。
  
  一个URL管理器应该具有以下几个功能:

  • 添加新的URL到待爬取集合中;
  • 判断待添加的URL是否在容器中;
  • 获取待爬取的URL;
  • 判断是否还有待爬取的URL;
  • 将爬取后的URL从待爬取集合移动到以爬取集合。

      URL管理器目前有一下三种实现方式:

    1. 内存
      • 如python内存:待爬取URL集合set(),以爬取URL集合set();
    2. 关系数据库:
      • 如MySQL数据库:urls(url, is_crawled);
    3. 缓存数据库:
      • 如redis:待爬取集合set,以爬取集合set。

3. 网页下载器

网页下载器:将互联网上URL对应的网页下载到本地的工具。

方法1:最简洁的方法

#coding:utf-8
import urllib2

#直接请求
response = urllib2.urlopen('http://www.baidu.com')

#获取状态码,如果是200表示获取成功
print response.getcode()

#读取内容
cont = response.read()
print len(cont)

方法2:添加data、http header

#coding:utf-8
import urllib2

#创建Request对象
request = urllib2.Request('http://www.baidu.com')

#添加http的header,伪装成浏览器访问
request.add_header('User-Agent', 'Mozilla/5.0')

#发送请求,获取结果
response = urllib2.urlopen(request)
#读取内容
cont = response.read()
print len(cont)

方法3:添加特殊情景的处理器

#coding:utf-8
import urllib2
import cookielib

#可以进行cookie处理
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)

#直接请求
response = urllib2.urlopen('http://www.baidu.com')

#读取内容
cont = response.read()
print len(cont)
#打印cookie
print cj

4. 网页解析器

  网页解析器:从网页中提取出有价值数据的工具。
  python有以下几种网页解析器:正则表达式、html.parser、BeautifulSoup、lxml。

4.1 DOM树

  文档树(Document Tree)是HTML页面的层级结构。它由元素、属性和文本组成,它们都是一个节点(Node)。

<!DOCTYPE HTML> 
<html lang="en-US"> 
  <head> 
    <meta charset="UTF-8"> 
    <title>HTML DOM树型结构图</title> 
  </head> 
  <body> 
    <div> 
      <a href="http://www.baidu.com">百度首页</a>
      <p>para</p> 
      <b>ghi</b> 
    </div> 
  </body> 
</html>

根据上面的HTML文档可以绘制一个清晰的DOM结构树:

4.2 Beautiful Soup

  Beautiful Soup是Python第三方库,用于从HTML或XML中提取数据。官网地址是:https://www.crummy.com/software/BeautifulSoup/
  利用python的pip指令在命令行输入:pip install beautifulsoup4安装Beautiful Soup模块。
  Beautiful Soup的语法如下:
  先根据HTML文档创建一个BeautifulSoup对象,然后按节点名称、属性值或者内容搜寻节点,最后就可以访问搜寻到的节点的名称、属性、内容。在<a href="http://www.baidu.com">百度首页</a>中节点名称是:a,节点属性是:href=”http://www.baidu.com”,节点内容是:百度首页。
  
  代码如下:

#coding:utf-8
from bs4 import BeautifulSoup
import re
#根据HTML网页字符串创建BeautifulSoup对象
soup = BeautifulSoup(
                    html_doc,             #HTML网页字符串
                    'html.parser',        #HTML解析器
                    from_encoding='utf-8' #HTML文档的编码)

#搜索节点方法:find_all(name, attrs, string)
#查找所有标签为a的节点
soup.find('a')

#查找所有标签为a,链接符合/view/123.htm形式的节点
soup.find('a', href='/view/123.htm')
#可以传入正则表达式作为参数
soup.find('a', href=re.compile(r'/view/\d+\.htm'))

#查找所有标签为div,class为abc,文字内容为Python的节点
soup.find('div', class_='abc', string='Python')

#访问节点信息:<a href="http://www.baidu.com">百度首页</a>
#获取查找到节点的标签名称
node.name

#获取查找到的a节点的href属性
node['href']

#获取查找到的a节点的链接文字
node.get_text()

  至此,要开发一个简单python爬虫的准备工作已经完成,下一步要进行的就是从python的百度百科开始爬取相关联的100个页面的标题和简介。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值