简单爬虫--结合慕课网和菜鸟教程

Python 爬虫架构主要由五个部分组成,分别是调度器、URL管理器、网页下载器、网页解析器、应用程序(爬取的有价值数据)

调度器:相当于一台电脑的CPU,主要负责调度URL管理器、下载器、解析器之间的协调工作。
URL管理器:包括待爬取的URL地址和已爬取的URL地址,防止重复抓取URL和循环抓取URL,实现URL管理器主要用三种方式,通过内存、数据库、缓存数据库来实现。
网页下载器:通过传入一个URL地址来下载网页,将网页转换成一个字符串,网页下载器有urllib2(Python官方基础模块)包括需要登录、代理、和cookie,requests(第三方包)
网页解析器:将一个网页字符串进行解析,可以按照我们的要求来提取出我们有用的信息,也可以根据DOM树的解析方式来解析。网页解析器有正则表达式(直观,将网页转成字符串通过模糊匹配的方式来提取有价值的信息,当文档比较复杂的时候,该方法提取数据的时候就会非常的困难)、html.parser(Python自带的)、beautifulsoup(第三方插件,可以使用Python自带的html.parser进行解析,也可以使用lxml进行解析,相对于其他几种来说要强大一些)、lxml(第三方插件,可以解析 xml 和 HTML),html.parser 和 beautifulsoup 以及 lxml 都是以 DOM 树的方式进行解析的。
应用程序:就是从网页中提取的有用数据组成的一个应用。
下面用一个图来解释一下调度器是如何协调工作的:
简单爬虫--结合慕课网和菜鸟教程
1.URL管理器:管理待抓取URL集合和已抓取URL集合(防止重复抓取、防止循环抓取)

简单爬虫--结合慕课网和菜鸟教程
简单爬虫--结合慕课网和菜鸟教程*
2.Python网页下载器:将互联网上的URL对应的网页下载器下载到本地工具*
urllib 侧重于 url 基本的请求构造,urllib2侧重于 http 协议请求的处理,而 urllib3是服务于升级的http 1.1标准,且拥有高效 http连接池管理及 http 代理服务的功能库,从 urllib 到 urllib2和 urllib3是顺应互联应用升级浪潮的

urllib2,下载网页方法:
(1)import urllib2
#直接请求
response=urllib2.urlopen(‘http://www.baidu .com ’)
#获取状态码,
Print(response.grtcode())
#读取内容
cont=response.read()

(2)添加data,http header
#创建request对象
request=urllib2.Request(url)
#添加数据
request.add_data(‘a’,’1’)
#添加http的header
request.add_header(’user-Agent’,’Mozilla/5.0’)
#发送请求获取结果
response=urllib2.urlopen(request)

(3)添加特殊情景的处理器
简单爬虫--结合慕课网和菜鸟教程
例如:import urllib2,cookielib
#创建cookie容器
cj=cookielib.CookieJar()
#创建一个opener
opener=urllib2.build_opener(urlllib.HTTPCookieProcessor(cj))
#给urlib2安装opener
urllib2.install_opener(opener)
#使用带有cookie的urllib2访问网页
response=urllib2.urlopen(“http://www.baidu.com/”)

3.网页解析器:从网页中提取有价值数据的工具(正则表达式,html.parser, BeautifuiSoup,lxml)
简单爬虫--结合慕课网和菜鸟教程

结构化解析-DOM(Document object Model)树
简单爬虫--结合慕课网和菜鸟教程
BeautifulSoup的语法:
简单爬虫--结合慕课网和菜鸟教程
简单爬虫--结合慕课网和菜鸟教程

#创建BeautifulSoup对象
from bs4 import BeautifulSoup
#根据HTML网页字符串创建BeautifulSoup对象
soup = BeautifulSoup(
htm1_ doc, # . HTML文档字符串
“html . parser’ # HTML解析器
from_ encoding= ‘utf8’ # HTML文档的编码
)
#搜索节点(find. _all, find)
#方法: find_ all(name, attrs, string)
#查找所有标签为a的节点
soup. find_ _a1l("a’)

#查找所有标签为a ,链接符合/view/123.htm形式的节点
soup. find_ all(‘a’ ,href= “/view/123. htm’ )
soup.find
all("a’ ,href=re. compile(r’ /view/\d+. htm’ )) //bs4中可在名称,属性,文字添加正则表达式

#查找所有标签为div , class为abc ,文字为Python的节点
soup. find_ all( ‘div’, class =‘abc’, string= ‘Python’ ) //class有下划线的原因是python中也有class,为了不冲突

#访问节点信息
#得到节点: <a href=“1. html’ >Python
#获取查找到的节点的标签名称
node . name
#获取查找到的a节点的href属性
node[ ‘href’ ]
#获取查找到的a节点的链接文字
node.get_ text( )

免费课程链接:
慕课网-Python开发简单爬虫

菜鸟教程-Python 爬虫介绍