Python开发简单爬虫(一)
一 、简单爬虫架构:
爬虫调度端:启动爬虫,停止爬虫,监视爬虫运行情况
URL管理器:对将要爬取的和已经爬取过的URL进行管理;可取出带爬取的URL,将其传送给“网页下载器”
网页下载器:将URL指定的网页下载,存储成一个字符串,在传送给“网页解析器”
网页解析器:解析网页可解析出 ①有价值的数据 ②另一方面,每个网页都包含有指向其他网页的URL,解析出来后可补充进“URL管理器”,不断循环。
二、简单爬虫架构的动态运行流程
三、爬虫URL管理
URL管理器:管理待抓取URL集合和已抓取URL集合 防止重复抓取。
url: 添加新url到爬取集合中, 判断待添加url是否在容器中, 判断是否还有待爬取的url, 获取待爬取url, 将url从待爬移动到已爬
四、爬虫URL管理器的实现方式
URL管理器的三种实现方式:内存、关系数据库、缓存数据库
存放在内存中是利用set()集合,可以去除重复元素,利用MySQL里的is_crawled参数是用来标记已爬取还是未爬取,redis数据库同样利用set集合。
五、爬虫网页下载器
Python网页下载器有:
1)urllib2 (Python官方基础模块)python 3.x中urllib库和urilib2库合并为urllib库。
2)requests (第三方包,更强大)
爬虫urlib2下载器网页的三种方法:
方法一:直接将url传送给urllib2模块的urlopen()方法
方法二:共享处理,添加data、http header
可以将url,data,header三个参数传送给urllib2的Request类,生成Resquest对象,再将Resquest对象作为参数传递给urlopen()方法来发送网页请求
方法三:添加特殊情景的处理器
有些网页需要用户登录才能访问,此时需要添加cookie的处理,则使用HTTPCookieProcessor进行处理
有些网页需要代理才能访问,则使用ProxyHandler进行处理
有些网页使用的是HTTPS协议加密访问的,则使用HTTPSHandler进行处理
还有些网页中的url存在相互的自动的跳转关系,则使用HTTPRedirectHandler进行处理
可将这些handler传送给build_opener()方法生成一个opener对象,然后给urlib2安装该opener,再利用urlopen()方法发送网页请求,实现网页的下载
例:增强cookie的处理
六、网页下载器urllib2三种方法实例代码
方法一:
import urllib2 # -*- coding: utf-8 -*- #第一种方法 url = 'http://www.baidu.com' response1 = urllib2.urlopen(url) print response1.getcode() #打印一下状态码,确定请求是否成功 print len(response1.read()) #打印返回的网页内容的长度
方法二:
# -*- coding: utf-8 -*- import urllib2 url = 'http://www.baidu.com' request = urllib2.Request(url) request.add_header("user-agent","Mozilla/5.0") #为request对象添加了http头信息,并将爬虫伪装成了Mozilla浏览器 response2 = urllib2.urlopen(request) print response2.getcode() print len(response2.read())
方法三:
先创建一个cookie容器为cj,
然后创建一个opener,是以容器作为参数通过urllib2.HTTPCookieProcessor()方法创建一个handler,再传给build_opener()方法实现,
为urllib2安装opener,此时urllib2就具有了cookie处理的增强能力,
最后然后就使用urlopen()方法访问正常的url
最后即可打印出cookie的内容和网页的内容
import urllib2 import cookielib url = 'http://www.baidu.com' cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) urllib2.install_opener(opener) response3 = urllib2.urlopen(url) print response3.getcode() print cj print response3.read()
七、爬虫网页解析器
网页解析器:从网页中提取有价值数据的工具
python四种网页解析方式:
模糊匹配:
1.正则表达式(最直观的一种方式,将网页或文档看成是一个字符串,以模糊匹配的方式提取出有价值的数据,但如果文档比较复杂时此方式非常麻烦)
结构化解析:(即将整个网页加载成一个DOM树,以树的形式来进行上下级的遍历和访问)
2.html.parser;(Python的模块)
3.BeautifulSoup,(第三方插件,同时可以使用html.parser和lxml作为解析器)
4.lxml;(第三方插件,可解析html网页或xml网页)
八、使用BeautifulSoup4
BeautifulSoup是Python的第三方库,用于从HTML或XML中提取数据
安装BeautifulSoup4:
1)打开cmd命令窗口
2)进入Python的安装目录下的Scripts
cd C:\Python27\Scripts
3) 输入dir,显示pip.exe已安装
4)输入pip install beautifulsoup4,即可安装beautifulsoup4
BeautifulSoup的语法:
1)根据已下载好的html网页创建一个beautifulsoup对象,创建该对象的同时就已将整个文档加载成一个DOM树,
2)然后根据此DOM就可对节点进行搜索,搜索节点有两个方法:
find_all方法和find方法,两个方法的参数相同,find_all方法会搜索出所有满足要求的节点,find方法只会搜索出第一个满足要求的节点,
在搜索节点时,可按照节点的名称,属性或文字进行搜索。
3)得到了节点之后,就可以访问节点的名称、属性和内容文字。
例:可使用三种方式对下面a链接进行搜索和访问
代码如下:
1.创建BeautifulSoup对象并同时加载好了DOM树
# -*- coding: utf-8 -*- from bs4 import BeautifulSoup #根据HTML网页字符串创建BeautifulSoup对象 soup = BeautifulSoup( html_doc, #HTML文档字符串,指利用网页下载器下载好的html文件或者是存在本地的html文件,是要提前赋值的 'html.parser', #HTML解析器 from_encoding = 'utf-8' #HTML文档的编码 )
2.搜索节点(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') #因为class是Python的关键字,为了避免冲突使用class_
3.访问节点的信息
#例:得到节点<a href='1.html'>Python</a> #获取查找到的节点的标签名称 node.name #获取查找到的a节点的href属性 node['href'] #获取查找到的a节点的链接文字 node.get_text()
BeautifulSoup实例演示:
# -*- coding: utf-8 -*- import os import re from bs4 import BeautifulSoup html_doc = """ <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> """ print '获取所有的a链接:' soup = BeautifulSoup(html_doc,'html.parser',from_encoding='utf-8') links = soup.find_all('a') for link in links: print link.name,link['href'],link.get_text() print '获取lacie的链接:' link_node1 = soup.find('a',href='http://example.com/lacie') print link_node1.name,link_node1['href'],link_node1.get_text() print '使用正则表达式匹配:' link_node2 = soup.find('a',href=re.compile(r"ill")) print link_node2.name,link_node2['href'],link_node2.get_text() print '获取指定p段落的文字:' p_node = soup.find('p',class_='title') print p_node.name,p_node.get_text()
输出结果:
Python开发简单爬虫(一)的更多相关文章
- Python开发简单爬虫 - 慕课网
课程链接:Python开发简单爬虫 环境搭建: Eclipse+PyDev配置搭建Python开发环境 Python入门基础教程 用Eclipse编写Python程序 课程目录 第1章 课程介绍 ...
- Python开发简单爬虫
简单爬虫框架: 爬虫调度器 -> URL管理器 -> 网页下载器(urllib2) -> 网页解析器(BeautifulSoup) -> 价值数据 Demo1: # codin ...
- Python开发简单爬虫(二)---爬取百度百科页面数据
一.开发爬虫的步骤 1.确定目标抓取策略: 打开目标页面,通过右键审查元素确定网页的url格式.数据格式.和网页编码形式. ①先看url的格式, F12观察一下链接的形式;② 再看目标文本信息的标签格 ...
- Python 开发轻量级爬虫05
Python 开发轻量级爬虫 (imooc总结05--网页下载器) 介绍网页下载器 网页下载器是将互联网上url对应的网页下载到本地的工具.因为将网页下载到本地才能进行后续的分析处理,可以说网页下载器 ...
- Python 开发轻量级爬虫03
Python 开发轻量级爬虫 (imooc总结03--简单的爬虫架构) 现在来看一下一个简单的爬虫架构. 要实现一个简单的爬虫,有哪些方面需要考虑呢? 首先需要一个爬虫调度端,来启动爬虫.停止爬虫.监 ...
- Python 开发轻量级爬虫01
Python 开发轻量级爬虫 (imooc总结01--课程目标) 课程目标:掌握开发轻量级爬虫 为什么说是轻量级的呢?因为一个复杂的爬虫需要考虑的问题场景非常多,比如有些网页需要用户登录了以后才能够访 ...
- Python 开发轻量级爬虫08
Python 开发轻量级爬虫 (imooc总结08--爬虫实例--分析目标) 怎么开发一个爬虫?开发一个爬虫包含哪些步骤呢? 1.确定要抓取得目标,即抓取哪些网站的哪些网页的哪部分数据. 本实例确定抓 ...
- Python 开发轻量级爬虫07
Python 开发轻量级爬虫 (imooc总结07--网页解析器BeautifulSoup) BeautifulSoup下载和安装 使用pip install 安装:在命令行cmd之后输入,pip i ...
- Python 开发轻量级爬虫06
Python 开发轻量级爬虫 (imooc总结06--网页解析器) 介绍网页解析器 将互联网的网页获取到本地以后,我们需要对它们进行解析才能够提取出我们需要的内容. 也就是说网页解析器是从网页中提取有 ...
随机推荐
- jsp中的request.setAttribute的使用
1.第一个jsp页面 <form id="form1" method="post" action="first.jsp"> &l ...
- 【Javascript语言精粹】笔记摘要
现在大部分编译语言中都流行要求强类型.其原理在于强类型允许编译器在编译时检测错误.我们能越早检测和修复错误,付出的代价越小.Javascript是一门弱类型的语言,所以Javascript编译器不能检 ...
- jQuery中易混淆知识点总结(持续更新)
find()与children() <body> <ul class="level-1"> <li class="item-i"& ...
- R语言学习路线和常用数据挖掘包(转)
对于初学R语言的人,最常见的方式是:遇到不会的地方,就跑到论坛上吼一嗓子,然后欣然or悲伤的离去,一直到遇到下一个问题再回来.当然,这不是最好的学习方式,最好的方式是——看书.目前,市面上介绍R语言的 ...
- Redis数据类型之Hash(二)
前言: Redis hash是一个String类型的field和value的映射表.添加.删除操作复杂度平均为O(1),为什么是平均呢?因为Hash的内部结构包含zipmap和hash两种.hash特 ...
- 【Windows 10 应用开发】如何防止应用程序被截屏
今天老周只想跟大伙们分享一个小技巧,是的,小小的技巧,很简单,保证你能学会的,要是学不会,可以考虑跳泰山. 有些时候,我们可能会想到不要让应用程序界面上显示的内容被截屏,要阻止应用界面呈现在截图上,可 ...
- Java之【线程通信】--标志位练习
* 写两个线程,一个线程打印1-52,另一个线程答应字母A-Z. * 打印顺序为12A34B56C--5152Z.通过使用线程之间的通信协调关系. 注:分别给两个对象构造一个对象o,数字每打印两个或字 ...
- HashMap集合
HashMap集合特点(用法与特点类似于HashSet集合): 1.无序,不允许重复(无序指元素顺序与添加顺序不一致): 2.底层数据结构是哈希表 3.HashMap内部对"键"用 ...
- Webpack新手入门教程(学习笔记)
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 30.0px Helvetica; color: #000000 } ...
- ActiveMQ 学习第二弹
经历了昨天的初识 ActiveMQ,正好今天下班有点事耽搁了还没法回家,那就再学习会 ActiveMQ 吧!现在官网的文档没啥好看的了,毕竟是入门学习,太深奥的东西也理解不了.然后看官网上有推荐书籍& ...