网站程序自带的采集器采集文章(深网是网络的一部分,与浅网(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("")
因为我们不可能保证每一页上都有所有类型的数据,所以每个打印语句都是按照数据出现在页面上的概率降序排列的。换句话说,标题标签会出现在每一页上,所以我们首先尝试获取它的数据。正文内容会出现在大多数页面(文件页面除外),所以它是第二个获取的数据。“编辑”按钮只出现在获取了标题和正文内容的页面上,并不是所有页面都有,所以放在最后。