网站程序自带的采集器采集文章(深网是网络的一部分,与浅网(surfaceWeb)对立)

优采云 发布时间: 2021-11-20 07:07

  网站程序自带的采集器采集文章(深网是网络的一部分,与浅网(surfaceWeb)对立)

  在上一篇文章中,我们意识到一个网站从一个链接随机跳转到另一个链接。但是,如果需要将整个网站按类别系统地归类,或者搜索网站上的每一页,则必须采集整个网站,这非常在消耗内存资源的过程,尤其是处理大的网站时,最合适的工具是使用数据库来存储采集的资源。

  1. 深网和暗网

  您可能听说过诸如深网、暗网或隐藏网之类的术语,尤其是在最近的媒体中。他们的意思是什么?深网是网的一部分,与表网相反。浅层网络是网络中可以被互联网上的搜索引擎捕获的部分。据不完全统计,大约90%的互联网实际上是一个深网。因为谷歌不能做表单提交之类的事情,也不能找到没有直接链接到顶级域名的网页,或者因为robots.txt禁止而无法查看网站,所以数浅网比较深。还是比较少的。

  暗网,也称为暗网或暗网,完全是另一种“怪物”。它们也是建立在现有网络的基础上,但使用 Tor 客户端,在 HTTP 之上运行一个新协议,并为信息交换提供安全隧道。这样的暗网也可以是采集,就像你的采集其他网站,不过这些内容超出了本章的范围。

  与暗网不同,深网相对容易采集。它可以让你采集那些谷歌爬虫机器人无法获取的深层网络信息。

  2.遍历整个网站网络数据采集有很多好处:

  (1)生成网站地图

  使用爬虫采集整个网站,采集所有的链接,然后将所有的页面组织成网站的实际形式。

  (2)采集数据

  创建专业垂直搜索平台,想采集一些文章(博客、新闻、故事等)。虽然这些网站采集并不费劲,但是需要爬虫有足够的深度(我们打算有网站的猴子应急数据不多)。所以创建一个爬虫来递归遍历每个网站,只采集那些网站页面上的数据。一种常见且耗时的网站采集方法是从首页(如首页)开始,然后搜索页面上的所有链接,形成一个列表。然后去这些链接的每一页采集,然后将每一页找到的链接组成一个新的列表,重复下一轮采集。

  显然,这是一种复杂性迅速增长的情况。如果每个页面有10个链接,而网站上有5个页面深度(中等规模的主流深度),那么如果你想要采集整个网站,一共采集 的网页数量为 10^5,即 100,000 页。不过,虽然“5页深度,每页10个链接”是网站的主流配置,但实际上,真正拥有10万个以上页面的网站却寥寥无几。这是因为大部分链是重复的。

  为了防止一个页面被采集两次,去除重复链接非常重要。代码运行时,将所有找到的链接放在一起,保存在一个方便查询的列表中(下面的例子指的是Python的set类型)。只有新链接会采集,然后从页面搜索其他链接。

  from urllib.request import urlopen

from bs4 import BeautifulSoup

import re

pages=set()

def getLinks(pageUrl):

global pages

html=urlopen("https://en.wikipedia.org"+pageUrl)

bsObj=BeautifulSoup(html,"html.parser")

for link in bsObj.findAll("a",href=re.compile("^(/wiki/)")):

if 'href' in link.attrs:

if link.attrs["href"] not in pages:

print(newPage)

newPage=link.attrs["href"]

pages.add(newPage)

getLinks(newPage)

getLinks("")

  为了充分展示这个网络数据 采集 示例的工作原理,我删除了“只查找内部链接”标准。不再限制爬虫采集的页面范围,只要遇到一个页面,就会查找所有以/wiki/开头的链接,无论链接是否收录分号。

  一开始用getLinks处理一个空的URL,其实就是维基百科的首页,因为空的URL在函数中。然后遍历首页的每个链接,查看是否已经在全局变量pages集合中。如果不是,则将其打印到屏幕并添加到页面集合中,然后使用 getLinks 递归处理该链接。这里需要注意的一点是python的默认递归限制是1000次,当达到递归限制时程序会自动停止。

  3. 采集整个 网站 数据

  当然,如果你只是从一个页面跳转到另一个页面,那么网络爬虫是很无聊的。为了有效地使用它们,我们需要在使用爬虫时在页面上做一些事情。让我们看看如何创建一个爬虫来采集页面标题、正文的第一段和编辑页面的链接(如果有的话)。

  和往常一样,决定如何做这些事情的第一步是观察网站上的一些页面,然后绘制一个采集模式。通过观察几个维基百科页面,包括条目页面和非术语页面,例如隐私政策页面,您将获得以下规则:

  (1)所有的标题(在所有页面上,无论是入口页面、编辑历史页面还是其他页面)都在h1-span标签中,页面上只有一个h1标签;

  (前面提到2),所有的正文文本都在div#bodyContent标签中。但是,如果我们想进一步获取第一段文本,我们可能使用div#mw-contet-text->p更好(仅选择第一段的标签。此规则适用于所有页面,除了文件页面,它不收录部分内容文本(内容文本)

  (3)编辑链接只出现在入口页面,如果有编辑链接,都在li#ca-edit->span->a。

  完整的程序代码如下:

  from urllib.request import urlopen

from bs4 import BeautifulSoup

import re

pages=set()

def getLinks(pageUrl):

global pages

html=urlopen("https://en.wikipedia.org"+pageUrl)

bsObj=BeautifulSoup(html,"html.parser")

try:

print(bsObj.h1.get_text())

print(bsObj.find(id="mw-content-text").findAll("p")[0])

print(bsObj.find(id="ca-edit").find("span").find("a").attrs['href'])

except AttributeError:

print("页面缺少一些属性,Don't worry")

for link in bsObj.findAll("a",href=re.compile("^(/wiki/)")):

if 'href' in link.attrs:

if link.attrs["href"] not in pages:

print("---------\n"+newPage)

newPage=link.attrs["href"]

pages.add(newPage)

getLinks(newPage)

getLinks("")

  因为我们不可能保证每一页上都有所有类型的数据,所以每个打印语句都是按照数据出现在页面上的概率降序排列的。换句话说,标题标签会出现在每一页上,所以我们首先尝试获取它的数据。正文内容会出现在大多数页面(文件页面除外),所以它是第二个获取的数据。“编辑”按钮只出现在获取了标题和正文内容的页面上,并不是所有页面都有,所以放在最后。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线