【情报工具】如何利用Python抓取深网数据库?

优采云 发布时间: 2022-05-11 14:36

  【情报工具】如何利用Python抓取深网数据库?

  深网包含*敏*感*词*记录,人口普查数据,也可能包含旧报纸的档案。它主要是高度权威的学术数据库和政府档案。与表网相比,深网对资源进行审核要容易得多,而且速度更快,但深网无法通过表网看到。通过下面这张冰山图,我们就可以非常清晰地知道表网、深网和暗网之间的层级关系。

  

  通过 Python 抓取深层网络数据库,我们可以一次性搜索多个数据库,相比在每个网站上一次搜索一个会方便快捷很多,而且可以同时对数据库进行多个搜索,即一次搜索 20 个名称。

  开放网络数据则是指一类可以被任何人使用、再利用、再分发的数据,包括地理位置数据、交通数据、文化数据等。

  新闻服务 NPR 的网站则是开放网络数据库的其中的一个示例。如果你想要所有提及“互联网”一词的 NPR 文章,你可以从网站内搜索或使用谷歌搜索网站外(通过谷歌搜索“”和“互联网”)。这两种方法都可以获取关于关键词的文章列表。

  

  图源:摄图网可商用图片

  而相比之下,迈阿密戴德县的财产记录数据库是属于深层网络,通过简单的关键词搜索并不能搜索到很多信息。比如你想要获取迈阿密戴德县的一个叫“Smith”的人的财产记录,你会怎么做?

  如果直接在谷歌搜索“Miami-Dade County Smith Property records”,出现的页面仅仅是迈阿密戴德县物业查询网站。但如果你想抓取一个开放的 Web 数据库,则相对简单。

  

  例如你想抓取 NPR 提到“互联网”的文章,首先你可以使用网站的搜索功能,在搜索框输入“Internet”,然后就会出现一系列带有该关键词的结果页面。

  

  我们还可以编写一个 python 脚本来抓取上面 URL 的页面。这揭示了网站的搜索 URL 格式。输入到搜索功能中的关键字将出现在新 url 中“search?query=”部分之后。

  该URL可通过分析POST请求中的请求体得到,点击F12键或鼠标右键点击“检查”,可以查看Network的基本信息(进入之后需要刷新页面)。

  更多关于F12/检查元素的内容可以点击下方图片链接即可阅读福韵君之前发布的文章《探索谷歌浏览器的神秘用法,F12!》

  同样地,如果你还想在该网站上搜索其他信息,只需要将上述URL“=”后面的关键词替换为新的目标关键词即可。

  

  如何用python抓取深网数据?

  为了使用 Python 从深度网络数据库抓取信息,我们将向数据库服务器发送一个请求,该请求模仿网站向服务器发送请求的方式,就好像你实际通过网站提交了搜索一样。

  在这一点上,有人可能想知道为什么要我们使用 python 而不是仅仅使用网站,因为使用 python 我们可以一次性搜索大量数据库。比如我们正在研究某人并且你想了解他们是否存在法律问题。

  因此,我们可以在法庭记录中搜索它们,搜索*敏*感*词*记录的手动过程将需要我们搜索大量数据库,因为重叠的*敏*感*词*管辖区和每个数据库的单独数据库。

  如何抓取深度网络数据库:使用“参数”

  你可以使用下面这个名为 Basic_Scraper 的简单 Python 脚本来抓取你选择的数据库。脚本的工作方式是将信息(参数)发送到由 url 标识的位置。

  # Basic_Scraper<br />import requests<br />params = {'firstname': 'John', 'lastname': 'Smith'}<br />r = requests.post("http://FAKE-WEBSITE-URL/processing.php", data=params)<br />print(r.text)

  你需要输入 url、输入名称以及你想要查询的任何数据。这个怎么做呢?首先,导航到你要抓取的网站的搜索页面。

  我们可以使用了一个随机的商业注册表作为深度 Web 数据库示例。对于本演练,我使用的是 Chrome 浏览器,但任何浏览器都可以,浏览器功能的名称可能略有不同。

  我们想使用 html-viewer 来查看网站搜索功能的 html 代码。该网站有一个注册表搜索栏,因此我们右键单击文本区域(你输入搜索词的位置)并单击“检查”。开发者工具的浏览器中打开一个窗口,在功能选项卡下,网站的 html 可见,搜索栏文本区域的 html 代码突出显示。请参阅下面的屏幕截图。

  

  这标识了数据库搜索功能的“输入”元素或标签,我们将使用我们的代码与示例脚本 Basic_Scraper 中的“参数”进行模拟。html 告诉我们该元素被标识为“FindBox”,这与示例脚本中的标识符“firstname”相关。

  其次,输入一个随机搜索词“Jack”,然后按 ENTER 以查看示例搜索如何影响 html。网页上现在有一个标题中带有“Jack”一词的公司列表。浏览器的 html 查看器显示搜索功能的代码已刷新,输入元素添加了一些新内容。如下面屏幕截图的第二行所示,该元素具有额外的文本,内容为“value=”jack””。

  

  现在我们知道如何识别搜索函数的参数及其值了。这在 Python 中称为字典,因为有一个键 (FindBox) 和一个关联的值 (jack)。因此,为了从带有“Jack”这个词的公司中抓取该数据库,我们将示例脚本的参数更改为:

  参数 = {'FindBox': '杰克'}

  第三,我们通过 POST 请求将此信息发布到数据库的服务器。但是我们需要确定一个 url 来发送我们的请求。

  进入网页源代码,在 HTML 中找到 form 标签的“action”,其内容类似于“action=”,后跟一个 url。这将识别你将用于发送信息的 url。它会为你提供完整的网址或仅提供结尾部分。

  例如,它可能读取“action=/processing.php”,它确认相关的 url 以 processing.php 结尾。有时你只需将其添加到搜索页面的 url 末尾,或者有时你将使用它来替换该 url 的最后一段。

  最终产品(网址)将粘贴到上面的脚本中,将括号留在脚本中,其中显示:

  

  在我们的示例数据库中,目标 url 与我们之前所在网页的 url 相同。因此,我们使用参数向 url 发送 POST 请求,并将响应分配给值 r。它应该是这样的:

  

  接着我们可以输入“print(r)”来查看相应状态码来判断服务器的相应的状态,如果状态码为“200”,则表明返回数据成功。这时我们还可以输入“print(r.text)”,获取文本类型的相应内容,这些响应内容与我们再网站上发出HTTP请求时看到的响应体的结果是一致的。

  与任何 python 脚本一样,如果遇到问题,请尝试从命令行运行它并尝试输入 python3 而不是 python 并确保没有多余的行或换行符(在不小心按回车键并在新行上开始文本之后) # 后面的注释。

  import requests<br />from bs4 import BeautifulSoup<br /><br />#Scraping data<br />params = {'FindBox': 'Jack'}<br />r = requests.post('http://cr.justice.gov.lb/search/res_list.aspx', params)<br /><p>print(r)

  print(r.text)</p>

  然后,我们将收到的作为响应的结果数据如下:

  

  下面是同一脚本的一个版本,最后添加了一个部分来解析数据。这样,脚本不会检索大量数据,而只会列出你的搜索结果。

  # commercial registry scraper <br /><br />import requests<br />from bs4 import BeautifulSoup<br /><br />#Scraping data<br />params = {'FindBox': 'Jack'}<br />r = requests.post('http://cr.justice.gov.lb/search/res_list.aspx', params)<br />html = r.text<br /><br />#Parse the data<br />bs = BeautifulSoup(html, 'html.parser')<br />companies = bs.find_all('div', {'class' : {'res_line1' }})<br />dates = bs.find_all('div', {'class' : {'res_line2' }})<br />for company in companies:<br /> link = bs.find('a')<br /> for link in company: <br /> articleUrl = (link.attrs['href'])<br /> for date in dates:<br /> print(company.get_text(),<br /> 'registration date and region:', date.get_text(), <br /> 'registration link:', ('http://cr.justice.gov.lb/search/{}'.format(articleUrl)))

  此添加会解析数据,以便结果列出每个公司的名称、注册号以及指向其在目录中的文件的链接。结果如下所示:

  

  第二部分,标题为#Parse the data,使用 Python 的 BeatifulSoup 库使响应数据更易于理解。BeautifulSoup 是一个用于解析 html(以及其他)的复杂工具,它已经写了整本书,所以我们不会在这篇文章中讨论它。此处仅用于简化响应数据。

  如何抓取深层 Web 数据库:模拟浏览器操作

  上述方法通常用于查看浏览器开发者工具,来分析向数据库提交HTTP请求时服务器的响应状态。

  然而,我们在实际工作中,如果提交某个关键词来搜索相关信息,空白搜索页面的URL和输入关键词后的结果URL是相同的,就意味着上述方法在此可能不起作用。

  这是因为在实际动态网页中,很多Ajax请求的参数是加密的,用户很难通过分析Ajax请求获取真实的URL,还有一些动态加载数据并不是Ajax生成的,此时,可以使用Selenium模拟浏览器的方法来获取网页动态加载和渲染的数据。

  Selenium是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作(如单击、输入等操作)。同时还可以获取浏览器当前呈现的页面内容,做到可见即可爬。Python提供了Selenium库来实现操作。

  特此声明:本文旨在分享工具以交流学习,请广大读者在合情合理合法的范围内使用,时刻谨记法律红线,不得利用该工具和技术做出任何违法违规的事情。

  本篇文章为福韵原创内容,未经授权禁止转载

  福韵原创IP形象设计,原创勿盗,侵权必究

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线