网页抓取数据百度百科(爬虫常见优秀网络爬虫有以下几种类型类型分析及应用 )
优采云 发布时间: 2022-04-07 10:01网页抓取数据百度百科(爬虫常见优秀网络爬虫有以下几种类型类型分析及应用
)
什么是网络爬虫,百度百科是这样定义的
网络爬虫(也称为网络蜘蛛、网络机器人,在 FOAF 社区中,更常被称为网络追逐者)是根据一定规则自动从万维网上爬取信息的程序或脚本。其他不太常用的名称是 ant、autoindex、emulator 或 worm。以下简称爬虫
爬虫作为一种自动化工具去代替人工操作,以此来节省成本和时间,爬虫不是乱爬,一个没有规则爬虫是没有存活的价值的,需要明确爬取的目标这样才能体现爬虫的价值,一般我们需要人为的设定一些规则,让爬虫按照这个规则去爬取。这里我从网络上找到了关于爬虫的几个分类
常见和优秀的网络爬虫有以下几种:
1.批量型网络爬虫:限制爬取的属性,包括爬取范围、具体目标、限制爬取时间、限制数据量、限制爬取页面,总之,明显的特征是有限的;
2.增量网络爬虫(万能爬虫):与前者相反,没有固定的限制,直到所有数据都被抓取完为止。这种类型一般用在网站或者搜索引擎的程序中;
3.垂直网络爬虫(焦点爬虫):可以简单理解为一个无限细化的增量网络爬虫,可以仔细筛选行业、内容、发布时间、页面大小等诸多因素。
以上内容来自:
除了这几类之外,还经常听到爬虫的搜索方式:
广度优先搜索
整个广度优先爬取过程从一系列*敏*感*词*节点开始,提取这些网页中的“子节点”(即超链接),放入队列依次爬取。处理后的链接需要放入一个表(通常称为已访问表)中。每次处理一个新的链接时,都需要检查该链接是否已经存在于Visited表中。如果存在,则证明该链接已被处理,跳过,不处理,否则进行下一步。(这就是我们后面提到的爬虫网址管理模块)
该算法的优势主要有以下三个原因:
重要的网页通常更接近*敏*感*词*。当我们浏览新闻网站时,热门信息通常会出现在比较显眼的位置。随着深入阅读,我们会发现得到的信息的价值已经不如从前了。
万维网的实际深度最多可以达到 17 层,但通往网页的路径总是很短。广度优先遍历会尽快到达页面。
广度优先有利于多个爬虫的协作爬取。多个爬虫的合作通常会先爬取站点中的链接,而且爬取非常封闭。
深度优先搜索
深度优先搜索是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) 。在一个HTML文件中,当一个超链被选择后,被链接的HTML文件将执行深度优先搜索,即在搜索其余的超链结果之前必须先完整地搜索单独的一条链。深度优先搜索沿着HTML文件上的超链走到不能再深入为止,然后返回到某一个HTML文件,再继续选择该HTML文件中的其他超链。当不再有其他超链可选择时,说明搜索已经结束。优点是能遍历一个Web 站点或深层嵌套的文档集合;缺点是因为Web结构相当深,,有可能造成一旦进去,再也出不来的情况发生,所以一般指定一个最大的深度。
最后,爬虫一般都有哪些模块?
网址管理器模块
一般用于维护已爬取的url和未爬取的url新增的url。如果当前爬取的url已经存在于队列中,则无需重复爬取,防止死循环。例如
我爬的列表中收录music.baidu.om,然后我继续爬取这个页面的所有链接,但是它收录,可想而知,如果不处理,会变成死循环,在百度首页和百度音乐页面循环,所以有一对列来维护URL很重要。
下面是一个python代码实现的例子。使用的deque双向队列,方便取出之前的url。
from collections import deque
class URLQueue():
def __init__(self):
self.queue = deque() # 待抓取的网页
self.visited = set() # 已经抓取过的网页
def new_url_size(self):
'''''
获取未爬取URL集合的大小
:return:
'''
return len(self.queue)
def old_url_size(self):
'''''
获取已爬取URL的大小
:return:
'''
return len(self.visited)
def has_new_url(self):
'''''
判断是否有未爬取的URL
:return:
'''
return self.new_url_size() != 0
def get_new_url(self):
'''''
获取一个未爬取的URL
:return:
'''
new_url = self.queue.popleft()#从左侧取出一个链接
self.old_urls.add(new_url)#记录已经抓取
return new_url
def add_new_url(self, url):
'''''
将新的URL添加到未爬取的URL集合
:param url: 单个url
:return:
'''
if url is None:
return False
if url not in self.new_urls and url not in self.old_urls:
self.new_urls.append(url)
def add_new_urls(self, urlset):
'''''
将新的URL添加到未爬取的URL集合
:param urlset: url集合
:return:
'''
if urlset is None or len(urlset) == 0:
return
for url in urlset:
self.add_new_url(url)
HTML下载模块
HTML下载模块
该模块主要根据提供的url下载url对应的网页内容。使用模块requets-HTML,添加重试逻辑,设置最大重试次数,限制访问时间,防止程序因长期无响应而死机。
根据返回的状态码判断,如果访问成功,则返回源代码,否则开始重试,如果发生异常,则进行重试操作。
<p>from requests_html import HTMLSession
from fake_useragent import UserAgent
import requests
import time
import random
class Gethtml():
def __init__(self,url="http://wwww.baidu.com"):
self.ua = UserAgent()
self.url=url
self.session=HTMLSession(mock_browser=True)
#关于headers有个默认的方法 self.headers = default_headers()
#mock_browser 表示使用useragent
def get_source(self,url,retry=1):
if retry>3:
print("重试三次以上,跳出循环")
return None
while retry