手撕包菜SSBC DHT磁力链一键安装包

[2017.07.05]
在冰剑的增加入库黑名单功能的基础上,修复了爬虫爬一段时间就挂掉的bug,再也不用使用爬虫自动重启脚本了,即可以跳过下面第2个步骤。

安装
系统要求:Centos7纯净版,主机内存最好1G或以上且有swap。
使用方法:解析域名到主机IP上。
提示:本方法还不算是完全的一键安装,适合喜欢折腾的人

1、安装脚本
使用ssh登录vps运行:

wget --no-check-certificate https://www.moerats.com/usr/down/ssbc/ssbc1.4.sh && sh ssbc1.4.sh
#!/bin/bash
#我本戏子 2017.6
#changelog:
#1.1添加开机自启动功能
#1.2修改pip获取方式
#1.3考虑到精简版系统的情况,自动安装wget与net-tools
#1.4抛弃django自带的web server,使用主流的nginx静态+gunicorn动态方案
echo "安装脚本前请先解析域名到本主机!"
python -V          
systemctl stop firewalld.service  
systemctl disable firewalld.service   
systemctl stop iptables.service  
systemctl disable iptables.service  
yum -y install wget net-tools unzip
#如果使用linode主机,请取消下面4行的注释
#wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyuncs.com/repo/Centos-7.repo
#wget -qO /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#yum clean metadata
#yum makecache
cd /root/
wget https://github.com/78/ssbc/archive/master.zip
unzip master.zip
#解压后 源码在/root/ssbc-master目录
yum -y install gcc gcc-c++ python-devel mariadb mariadb-devel mariadb-server nginx
cd ssbc-master
yum -y install epel-release 
yum -y install  python-pip
pip install -r requirements.txt
pip install  pygeoip
systemctl start  mariadb.service 
mysql -uroot  -e"create database ssbc default character set utf8;"  
sed -i '/!includedir/a\wait_timeout=2880000\ninteractive_timeout = 2880000\nmax_allowed_packet = 512M' /etc/my.cnf
mkdir  -p  /data/bt/index/db /data/bt/index/binlog  /tem/downloads
chmod  755 -R /data
chmod  755 -R /tem
yum -y install unixODBC unixODBC-devel postgresql-libs
wget http://sphinxsearch.com/files/sphinx-2.2.9-1.rhel7.x86_64.rpm
rpm -ivh sphinx-2.2.9-1.rhel7.x86_64.rpm
systemctl restart mariadb.service  
systemctl enable mariadb.service 
searchd --config ./sphinx.conf
python manage.py makemigrations
python manage.py migrate
indexer -c sphinx.conf --all 
ps aux|grep searchd|awk '{print $2}'|xargs kill -9
searchd --config ./sphinx.conf
#设置nginx为前端
systemctl start  nginx.service
read -p "请输入网站域名,多个域名用空格隔开:" name
cat << EOF > /etc/nginx/nginx.conf
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user root;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '\$remote_addr - \$remote_user [\$time_local] "\$request" '
                      '\$status \$body_bytes_sent "\$http_referer" '
                      '"\$http_user_agent" "\$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;


    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _ $name;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
         proxy_pass http://127.0.0.1:8000;
         proxy_set_header Host \$host;
         proxy_set_header X-Real-IP \$remote_addr;
         proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
        }
        location /static/ {
         root /root/ssbc-master/web/; 
        }
        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

}
EOF
nginx -s reload
ln -s /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin /root/ssbc-master/web/static/admin
cd /root/ssbc-master
sed -i "42a\    'gunicorn'," /root/ssbc-master/ssbc/settings.py
#gunicorn启动网站并在后台运行
nohup gunicorn ssbc.wsgi:application -b 127.0.0.1:8000 --reload>/dev/zero 2>&1&  
myip=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`
while true; do
    read -p "确定浏览器能访问网站  http://$myip  吗?[y/n]" yn
    case $yn in
        [Yy]* ) cd workers; break;;
        [Nn]* ) exit;;
        * ) echo "请输入yes 或 no";;
    esac
done
#运行爬虫并在后台运行
nohup python simdht_worker.py >/dev/zero 2>&1&
#定时索引并在后台运行
nohup python index_worker.py >/dev/zero 2>&1&  
cd /root/ssbc-master
python manage.py createsuperuser
#开机自启动
chmod +x /etc/rc.d/rc.local
echo "systemctl start  mariadb.service " >> /etc/rc.d/rc.local
echo "cd /root/ssbc-master " >> /etc/rc.d/rc.local
echo "indexer -c sphinx.conf --all " >> /etc/rc.d/rc.local
echo "searchd --config ./sphinx.conf " >> /etc/rc.d/rc.local
echo "nohup gunicorn ssbc.wsgi:application -b 127.0.0.1:8000 --reload>/dev/zero 2>&1&" >> /etc/rc.d/rc.local
echo "cd workers " >> /etc/rc.d/rc.local
echo "nohup python simdht_worker.py >/dev/zero 2>&1& " >> /etc/rc.d/rc.local
echo "nohup python index_worker.py >/dev/zero 2>&1& " >> /etc/rc.d/rc.local

3、上传程序
中文模板下载地址:ssbczw
下载模板后解压然后用WinSCP等ftp工具上传到/root/ssbc-master/web/目录,再执行命令:

ln -s /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin /root/ssbc-master/web/static/admin
killall gunicorn
cd /root/ssbc-master/
nohup gunicorn ssbc.wsgi:application -b 127.0.0.1:8000 --reload>/dev/zero 2>&1&

冰剑新增功能:增加入库黑名单机制。下载地址:手撕包菜爬虫增加入库黑名单 修复崩溃bug 201707.rar,下载后可直接使用,内附使用说明书。

常见问题及解决
1.必须centos7吗?
非常建议使用centos7,centos6可能会有意想不到的错误
2.如何设置首页关键字?
登录管理员后台,点击Rec keywordss,右上角新增
3.怎么查看入库的文件?
登录管理员后台,点击 Hashs
4.怎么查看每天入库了多少文件,以便清楚入库效率?
登录管理员后台,点击 Status reports
5.如何确认web服务器、采集、入库正在运行?
运行 ps -ef|grep python|grep -v grep
结果里面有
gunicorn ssbc.wsgi:application -b 127.0.0.1:8000 --reload
python simdht_worker.py
python index_worker.py
即表示正在运行。
——————————————————————————————————————
去除搜索页 右下角广告
[root@localhost ssbc-master]# cd web/static/js
[root@localhost js]# vi ssbc.js 找到如下3行,在前面添加//进行注释,保存
// document.write('");
// document.writeln("");
——————————————————————————————————————
如何修改扩展名归类?
workers/metautils.py文件中有如下代码:
def get_category(ext):
ext = ext + '.'
cats = {
u'video': '.avi.mp4.rmvb.m2ts.wmv.mkv.flv.qmv.rm.mov.vob.asf.3gp.mpg.mpeg.m4v.f4v.',
u'image': '.jpg.bmp.jpeg.png.gif.tiff.',
u'document': '.pdf.isz.chm.txt.epub.bc!.doc.ppt.',
u'music': '.mp3.ape.wav.dts.mdf.flac.',
u'package': '.zip.rar.7z.tar.gz.iso.dmg.pkg.',
u'software': '.exe.app.msi.apk.'
}

意思是:扩展名为.exe、.app、.msi、,.apk的文件都属于software类型。
如果你把u'software': '.exe.app.msi.apk.' 改为 u'software': 'app.msi.apk.',那么exe将会被归为other类型。
所以在这里修改归类设置。
——————————————————————————————————————
如何禁止某些格式/分类的文件入库?
workers/metadata.py文件中有如下代码:
info['extension'] = metautils.get_extension(bigfname).lower()
info['category'] = metautils.get_category(info['extension'])
所以如果你要排除扩展名为.exe的文件,或者类型为software,可以在上面代码后面加上
##########这是增加的过滤-开始############
#按扩张名过滤,禁止扩展名为.exe的入库
if info['extension'] == 'exe':
return # 直接返回,跳过下面的入库
#按文件类型过滤,禁止类型为software的入库
if info['category'] == 'software':
return
#禁止类型为other的入库
if info['category'] == 'other':
return
##########这是增加的过滤-结束############
——————————————————————————————————————
如何重建索引?
第一步:
删除/data目录
第二步:
进入数据库,把search_hash表中所有记录的tagged字段置为0。
UPDATE search_hash SET tagged=0
然后启动sphinx、index_worker.py。
——————————————————————————————————————
MySQL server has gone away提示怎么办?
ssbc 运行一段时间后,大概半个小时,就莫名奇妙停止不爬了。 错误提示如下:
MySQL server has gone away
通过错误提示可以看出,其实是ssbc与mysql(maridb)断开连接了,导致程序异常,当然就插入不了数据了。
有3种解决办法:
方法1是写个脚本,定时重启爬虫。
方法2是修改下代码,当mysql断开连接时,再次重连mysql就可以拉。
方法3是修改Mysql配置,将闲置时间wait_timeout设置长一点。
——————————————————————————————————————
哪里设置爬虫线程?让爬虫爬快/慢点?
在workers/simdht_worker.py里面把MAX_QUEUE_LT、MAX_QUEUE_PT、max_node_qsize设大/小一点。
如何关闭调试模式?设置404页面?
请参考 http://www.githubs.cn/post/19
——————————————————————————————————————
如何在搜索结果页面添加迅雷链接?
在web/views.py文件加入以下代码生成迅雷链接:
import base64
xunleiurl = 'AAmagnet:?xt=urn:btih:' + d['info']['info_hash'] + 'ZZ'
d['xunlei_url'] = 'thunder://' + base64.b64encode(xunleiurl)
可以在模板中用“ {{xunlei_url}} ”调用。位置要放在return render(request, 'info.html', d)的前面。
——————————————————————————————————————
SSBC如何搬家?
数据库用mysqldump导出sql,在新服务器上运行一键包,再导入刚才的sql。
——————————————————————————————————————
提示duplicate id 'xxxx'解决办法
进入数据库,执行语句
update search_hash set tagged=True where id=xxxx;

点赞