网页抓取数据百度百科(爬虫常见优秀网络爬虫有以下几种类型类型分析及应用 )

优采云 发布时间: 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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线