1.爬虫是什么?
1. 爬虫:一段自动抓取互联网信息的程序 2. 从一个url出发,然后访问和这个url相关的各种url,并提取相关的价值数据。 3. URL:Uniform Resource Location的缩写,译为“统一资源定位符” 4. URL的格式由下列三部分组成: 第一部分是协议(或称为服务方式); 第二部分是存有该资源的主机IP地址(有时也包括端口号); 第三部分是主机资源的具体地址。,如目录和文件名等。
2. 爬虫的价值
1. 爬虫的价值:爬取互联网数据,为我所用!(本质是数据的整合、处理与展示。) 2. 这里列举的如聚合等服务是为用户更方便地提供垂直领域的深度信息(数据分析,基于数据做出相关主题的产品)。
3.简单爬虫架构
爬虫调度端:启动爬虫,停止爬虫,监视爬虫运行情况 URL管理器:对将要爬取的和已经爬取过的URL进行管理;可取出带爬取的URL,将其传送给“网页下载器” 网页下载器:将URL指定的网页下载,存储成一个字符串,在传送给“网页解析器” 网页解析器:解析网页可解析出①有价值的数据②另一方面,每个网页都包含有指向其他网页的URL,解析出来后可补充进“URL管理器”
1.调度器:
调度器相当于是一个命令发布枢纽和中转站,由它来指挥三大模块(URL管理器、下载器、解析器)工作,并最终将价值数据输送给应用端。
本网页的url会指向其他网页的url,其他网页也会指向本网页,这样在抓取的过程中会出现死循环,所以为了避免这种重复出抓取的情况,需要用到url管理器,
1、新增的添加到url中时,需要判断在url管理器中是否存在该url,若存在就不再次添加该新的url到url管理器中
2、 从URl管理器获取url,这时候要判断url管理器中是否有要获取的URl ,有的话获取该url,然后将url从待爬取移动到已爬取的url集合中
URL管理器的实现方式有三种: 1、适合个人的:内存 2、小型企业或个人:关系数据库(永久存储或内存不够用) 3、大型互联网公司:缓存数据库(高性能)
2.网页下载器:
网页下载器会将url对应的网页以HTML的形式,将网页存储在本地,方便我们分析 Python网页下载器:urllib2(Python官方基础模块)、requese(第三方包更强大)
网页下载器urllib2的三种下载方法:
# coding:utf-8
#网页下载器-urllib2 下载网页的三种方法
#处理功能的强大:第三种>第二种>第一种
import urllib2
import cookielib
url = "http://www.baidu.com"
#第一种方法:最简洁的方法
print '第一种方法'
response1 = urllib2.urlopen(url)#直接请求
print response1.getcode()#获取状态码,如果是200表示获取成功
print len(response1.read())#读取内容response.read
#第二种方法:添加data、http header
print '第二种方法'
request = urllib2.Request(url)#创建request对象
#添加数据:request.add_data('a','1')
request.add_header("user-agent", "Mozill/5.0")#添加http的header
response2 = urllib2.urlopen(request)#发送请求结果
print response2.getcode()
print len(response2.read())
#第三章犯法:添加特殊场景的处理器
print'第三章方法'
cj = cookielib.CookieJar()#创建cookie容器
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))#创建一个opener
urllib2.install_opener(opener)#给urllib2安装opener
response3 = urllib2.urlopen(url)#使用带有cookie的urllib2访问网页
print response3.getcode()
print cj
print response3.read()
3.网页解析器:
从网页中提取有价值数据的工具
网页解析器:作用: (1)、提取出新的待爬取URL列表; (2)、解析出有价值的数据: 1、正则匹配;(字符串形式的模糊匹配); 2、结构化解析:(将一个文档看成一个对象,整个文档内容看成一棵DOM树来进行解析) (1)、html.parser: (2)、Beautiful Soup(Python第三方库,用于从html和xml中提取数据,下载地址 http://www.crummy.com/software/BeautifulSoup/,pip安装方法:pip install beautifulsoup4) (3)、lxml解析器BeautifulSoup的语法: html网页内容----> 创建BeautifulSoup对象-----> 搜索节点find_all(返回所有满足要求的节点)、find(返回第一个满足要求的节点){这里搜索的时候可以按照:节点名称、节点属性值、按照节点文字}---->访问节点 名称、属性、文字
#解析器BeautifulSoup的使用方法
from bs4 import BeautifulSoup#导入所需包
#根据HTML网页字符串创建BeautifulSoup对象
soup = BeautifulSoup(html_doc, #HTML文档字符串
'html.parser', #HTML解析器
from_encoding='utf8' #HTML文档的编码
)
#方法:find_all(name,attrs,string)
#查找所有标签为a的节点
soup.find_all('a')
#查找所有标签为a,连接符合/view/132.htm形式的节点
soup.find_all('a',herf='/view/132.htm')
soup.find_all('a',href=re.compile(r'/view/132.htm'))#正在表达式匹配
#查找所有标签为div,class 为abc,文字为Python的节点
soup.find_all('a',class_='abc',string='Python')#这里为了区别html标签中的class属性,所以多加一个"_"
#访问节点信息
#得到节点:<a herf='1.html'>Python<a/>
#获取查找到的节点的标签名称
node.name
#获取查找到的a节点的herf属性
node.['herf']
#获取查找到的a节点的连接文字
node.get_text()
# coding:utf8
from bs4 import BeautifulSoup
import re
#解析器BeautifulSoup
html_doc = u"""
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><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>
"""
#创建BeautifulSoup对象
soup = BeautifulSoup(html_doc, #HTML文档字符串
'html.parser', #HTML解析器
from_encoding='utf8' #HTML文档的编码
)
print '获取所有的连接'
links = soup.find_all('a') #获取所有的连接标签为a的连接
for link in links:
# print '标签名称为:%s 节点的href属性为:%s 节点的连接文字位:%s'%(link.name, link['href'], link.get_text())
print '标签名称为:%s 节点的href属性为:%s 节点的连接文字位:%s'% (str(link.name),str(link['href']), str(link.get_text()))
print '获取lacie的连接'
link_node=soup.find('a',href='http://example.com/lacie')
print '标签名称为:%s 节点的href属性为:%s 节点的连接文字位:%s'%(str(link_node.name),str(link_node['href']), str(link_node.get_text()))
print '正则匹配'
link_node=soup.find('a',href=re.compile(r"ill"))#正则表达式,匹配所有标签a,并且href属性含有ill的节点
print '标签名称为:%s 节点的href属性为:%s 节点的连接文字位:%s'%(str(link_node.name),str(link_node['href']), str(link_node.get_text()))
print '获取p段落文字'
p_node=soup.find('p',class_="title")
print '标签名称为:%s 节点的连接文字位:%s'%(str(p_node.name), str(p_node.get_text()))
运行结果:
获取所有的连接
标签名称为:a 节点的href属性为:http://example.com/elsie 节点的连接文字位:Elsie
标签名称为:a 节点的href属性为:http://example.com/lacie 节点的连接文字位:Lacie
标签名称为:a 节点的href属性为:http://example.com/tillie 节点的连接文字位:Tillie
获取lacie的连接
标签名称为:a 节点的href属性为:http://example.com/lacie 节点的连接文字位:Lacie
正则匹配
标签名称为:a 节点的href属性为:http://example.com/tillie 节点的连接文字位:Tillie
获取p段落文字
标签名称为:p 节点的连接文字位:The Dormouse's story
4.开发爬虫实例:
一、步骤 1、确定目标:确定抓取哪个网站的哪些网页的哪部分数据。本实例确定抓取百度百科python词条页面以及它相关的词条页面的标题和简介。 2、分析目标:确定抓取数据的策略。一是分析要抓取的目标页面的URL格式,用来限定要抓取的页面的范围;二是分析要抓取的数据的格式,在本实例中就是要分析每一个词条页面中标题和简介所在的标签的格式;三是分析页面的编码,在网页解析器中指定网页编码,才能正确解析。 3、编写代码:在解析器中会使用到分析目标步骤所得到的抓取策略的结果。 4、执行爬虫。
分析目标目标:百度百科Python词条相关关键词条网页-标题和简介 入口页:http://baike.baidu.com/item/Python URL格式: -词条页面URL:/item/%E8%87%AA%E7%94%B1%E8%BD%AF%E4%BB%B6 数据格式: -标题:<dd class="lemmaWgt-lemmaTitle-title"><h1>标题***</h1></dd> -简介:<div class="lemma-summary" label-module="lemmaSummary">***</div> 页面编码:UTF-8