主要内容
1.爬虫简介
一、初步理解:
1.1 简介:自动访问互联网并自动提取数据的程序
1.2、价值:互联网数据为我所用
2.简单爬虫架构
2.1、框架:核心功能由URL管理器、网页下载端、网页解析器,三大模块的循环工作来完成
2.2、运行流程:时序图分析如下:
3.URL管理器
3.1、URL管理器
3.1.1 简介:
设计管理器的目的是为了防止重复抓取和循环抓取,必须包含以下五大基本功能:
3.1.2、URL管理器的实现
python中set()数据结构特点,会自动过滤掉重复的元素,用于存储url比较合适;
数据量大并计划永久保存url数据,可选用关系型数据库;而一般大型企业选用高性能的缓存数据库进行url的管理
4.网页下载器
4.1 简介:
爬虫的核心模块
4.2常见的下载器
方法一:urllib2 简洁方式,功能单一
方法二:可以添加数据项和数据头部信息
代码实现:
add_data方法传入的两个参数,可以理解为用户的数据,a这个数据项,其值 为1
方法三:添加特殊情景的处理器
以下的处理器,HTTPCookieProcessor用于处理需要登录的网页下载;ProxyHandler处理需要代理功能的网页下载;HTTPSHandler处理加密访问的网页下载;HTTPRedictHander处理可以相互调用访问的网页的下载
代码实现:以第一个可以处理cookie的处理器为例
5.网页解析器
5.1 网页解析器
5.1.1 功能简介:
5.2 分类
BeautifulSoup是第三方库,可以使用python的网页解析模块html.parser,也可使用lxml第三方库,功能最为强大,第一种为字符串的模糊匹配,适用于简单的解析,后三种为结构化解析,适用于复杂网页解析。
5.3 结构化解析原理
即把网页文档当做一个DOC对象,使用DOC对象中的一些方法进行解析。
5.4 BeautifulSoup4
bs4使用示例:
2.3.5 BeautifulSoup4使用示例
from bs4 import BeautifulSoup
import re
html = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
print "--find all links--" #获取所有链接
soup = BeautifulSoup(html,'html.parser',from_encoding='utf-8')
links = soup.find_all('a')
for link in links:
print link.name,link['href'],link.get_text()
print '--find fixed link--' #获取指定链接
link_node = soup.find('a',href = 'http://example.com/lacie')
print link_node.name,link_node['href'],link_node.get_text()
print '--zhengzepipei--' #正则匹配
link_node = soup.find('a',href=re.compile(r"ill"))
print link_node.name,link_node['href'],link_node.get_text()
print '--get p text--' #获取P字段内容
p_node = soup.find('p',class_='title')
print p_node.name,p_node.get_text()
#通过标签内容获取节点
print '--get node from string'
s_nodes = soup.find_all('a',class_ = 'sister',string = 'Lacie')
for s_node in s_nodes:
print s_node.name,s_node.get_text()