-
爬虫简介:
查看全部 -
爬虫的调度端来启动爬虫,停止爬虫,或监视爬虫的运行情况;
爬虫程序有三个模块:URL管理器、网页下载器、网页解析器
URL管理器用来管理已经抓取过得URL和将要抓取的URL
查看全部 -
urllib2下载网页方法1
查看全部 -
# -*- coding: gb2312 -*-
import urllibclass HtmlDownloader(object):
def download(self,url):
if url is None:
return None
response = urllib.request.urlopen(url) #请求这个URL的内容结果存在respon'
# 如果值不等于200则请求失败
if response.getcode() != 200:
return
return response.read() #返回下载好的内容
查看全部 -
class UrlManager(object):
def __init__(self):
"""URL管理器需要维护两个列表,①待爬取的URL列表new_urls;②已爬取的URL列表old_urls"""
self.new_urls = set()
self.old_urls = set()
def add_new_url(self,url):
""" 向管理器中添加一个新的URL,"""
if url is None: #如果URL为空,不进行添加
return
if url not in self.new_urls and url not in self.old_urls:
self.new_urls.add(url) #如果URL就没在待爬取的URL列表里面,又没在已爬取的URL列表里面,将其添加到待爬取的URL列表中
def add_new_urls(self,urls):
""" 向管理器中添加批量的URL"""
if urls is None or len(urls)==0:
return #如果URL列表不存在或为空,不进行添加
for url in urls:
self.add_new_url(url) #如果存在,单个添加到待爬取的URL
def has_new_url(self):
"""判断管理器中是否有新的URL"""
return len(self.new_urls)!=0 #如果new_url列表部位空,就说明还有待爬取的URL,def get_new_url(self):
"""从URL管理器中获取一个新的待爬取的URL"""
new_url = self.new_urls.pop() #获取一个待爬取的URL,pop会讲待爬取的URL取出,然后移除该URL
self.old_urls.add(new_url) #将这个待爬取的URL添加到已爬取的URL列表
return new_url查看全部 -
from baike_spider import html_downloader, html_outputer, url_manager
from lxml.html import html_parser
from astropy.units import countclass SpiderMain(object):
"""爬虫总调度程序,会使用HTML的下载器,解析器,输出器来完成功能"""
def __init__(self):
"""在构造函数中初始化所需要的各个对象"""
self.urls = url_manager.UrlManager() #URL管理器
self.downloader = html_downloader.HtmlDownloader() #URL下载器
self.parser = html_parser.HtmlParser() #URL解析器
self.output = html_outputer.HtmlOutputer() #URL输出器
def craw(self,root_url):
"""爬虫的调度程序,root_url就是入口url,将其添加到URL管理器"""
count = 1
self.urls.add_new_url(root_url) #添加一个新的未爬取的URL
while self.urls.has_new_url():
try:
"""设置一个异常处理,用来处理网页中已经失效的URL和空的URL"""
new_url = self.urls.get_new_url() #获取一个待爬取的URL
print("crow %d: %s"%(count,new_url))
html_cont = self.downloader.download(new_url) #下载URL页面
new_urls, new_data =self.parser.parse(new_url,html_cont)
#调用解析器解析页面数据,得到新的URL列表和新的数据,传入两个参数,传入该URL,和下载的数据
self.urls.add_new_urls(new_urls) #新的URL列表补充到URLS
self.output.collect_data(new_data) #收集数据
if count == 100:
"""设置一个循环控制URL的爬取个数"""
break
count += 1
except:
print("craw failed")
self.outputer.output_html()if __name__ == '__main__':
root_url = "http://baike.baidu.com/view/21087.html" #爬虫入口URL
obj_spider = SpiderMain() #调用主函数
obj_spider.craw(root_url) #启动爬虫查看全部 -
class UrlManeger(object):
def __init__(self):
self.new_urls = set()
self.old_urls = set()
def add_new_url(self,url):
# 如果没有URL就返回
if url is None:
return
# 如果URL既没有在待爬取的URL又没有在已爬取的URL,则添加到待爬取 的URL
if url not in self.new_urls and url not in self.old_urls:
self.new_urls.add(url)
def add_new_urls(self,urls):
# 如果urls不存在或列表为空,不进行添加
if urls is None or len(urls)==0:
return
# 将urls列表总的URL逐个添加到new_urls
for url in urls:
self.add_new_url(url)
def has_new_url(self):
return len(self.new_urls) != 0
def get_new_url(self):
# pop会从列表中获取一个URL,并将其移除
new_url = self.new_urls.pop()
self.old_urls.add(new_url )查看全部 -
该下载器有以下三种下载方法:
①最简洁的方法:给定一个URL,将其传送给urllib2的urlopen方法,就可以实现。对应代码如下:
②添加http header向服务器提交http的头信息,添加data可以向服务器提交需要用户输入的数据,
我们生成三个参数,将其传送给request类,生成一个request对象,再用urllib2的urlopen方法以request为参数,发送网页请求。
③添加特殊情景的处理器:
例:有的网页需要用户登录才能访问,我们就需要添加cookie的处理,我们使用HTTPCookieProcessor;有的网页需要代理才能访问,我们使用ProxyHandle;有的网页的协议是HTTPS加密访问的,我们使用HTTPSHandler;有的网页的URL是相互自动的跳转,我们使用HTTPRedirectHandler。
将这些handler传送给urllib2的bulid_opener方法来创建对象,我们给urllib2再install这个opener,这样这个urllib2就具有了处理这些场景的能力,然后依然并用urlopen方法来请求一个URL,或请求一个request实现网页的下载。
查看全部 -
Python爬虫URL管理器的实现方式(三种)
(一)将已爬取或和待爬取的URL集合存放在内存中,用Python语言的话,可以将这两个URL集合放在set()数据结构中,Python的set结构可以自动去除重复的内容,
(二)将URL存放在关系数据库中,建立一个表,有两个字段(url,is_crawled),is_crawled字段标志这个URL的状态是待爬取还是已爬取。
(三)将URL存放在一个缓存数据库中,比如redis,本身支持set的结构,所以我们可以将待爬取的和已爬取的URL存放在set中。
查看全部 -
爬虫URL管理
URL管理器用来管理已经抓取过得URL集合和将要抓取的URL集合,主要是为了防止循环抓取和重复抓取,
URL管理器需要支持如下功能:
添加新URL到待爬取集合中;在添加的过程中判断是否已经存在该URL在管理器中;支持从容器中获取一个待爬取的URL;获取时需要判断容器中是否还有待爬取的URL;该URL被爬取后,我们需要将其移动到已爬取集合。
查看全部 -
首先,调度器询问URL管理器有没有待爬取的URL,URL管理器向调度器返回是或否,若为是,则调度器从URL管理器中获取一个待爬URL,URL管理器将这个URL返回给调度器,,,然后调度器将这个URL传送给下载器,让下载器开始下载,下载完成后,下载器将URL内容返回给调度器,,,然后调度器将URL内容传输给解析器进行解析,解析后,解析器返回有价值的数据和新URL列表给调度器,,,调度器将价值数据给应用去收集价值数据,将新的URL列表补充给URL管理器,直到URL全部爬取完毕。
查看全部 -
爬虫的调度端来启动爬虫,停止爬虫,或监视爬虫的运行情况;
爬虫程序有三个模块:URL管理器、网页下载器、网页解析器
URL管理器用来管理已经抓取过得URL和将要抓取的URL,从中取出一个待爬取的URL将其传送给网页下载器,网页下载器将指定网页内容下载为一个字符串,并将字符串传送给网页解析器进行解析,会解析出有价值的数据和获取该网页中指向其他网页的URL,将新获取的URL补充到URL管理器中,
查看全部 -
(二)爬虫简介
爬虫是一段获取自动抓取互联网页面信息的程序,
互联网的每个网页上都有一个其对应的URL,每个URL又会指向其他的URL,URL的指向关系是错综复杂的,正常情况下我们用人工的方法去获取信息,但是覆盖面太小;
爬虫可以根据关键词从一个人为指定的URL出发,提取到有关联的网页上的信息,并且提取数据;
查看全部 -
(一)本课程仅介绍简单的静态网页爬虫设计
URL管理器用来管理已经抓取过得URL和将要抓取的URL;
网页下载器:给定一个URL,需要将网页下载在你到本地以后才能去分析,使用urllib2这个包;
网页解析器:得到网页之后用解析器提取出我们想要的内容;
查看全部 -
(十五)实例爬虫
确定目标--->分析目标(URL格式,数据格式,网页编码)--->编写代码
分析目标:制定抓取网站数据的策略;
URL格式:用来限定我们要抓取的页面的范围,如果范围不进行限定的话就会抓取去多不相关的网页,造成资源浪费。
数据格式:分析每个词条页面的标题等,数据所在的标签的格式。
网页编码:在代码解析器上指定网页的编码格式,然后才能进行正确的解析。
词条页面URL不是一个完整的URL,所以需要在代码中补全;
数据格式在<h1>标签中,
查看全部
举报