Python自制番号搜索神器

Life is short, I use python.
有一句经典名言是这么说的,既然能成为经典,那么一定有他的道理。也就是python一定是一门优秀的编程语言,精简、方便。


        上述是国外大神对Python的称赞。OK,不废话,回到正题,番号。你懂的。相信对于番号各位大神不比我陌生,你们的武藤兰、饭岛爱、苍井空、吉泽明步、小泽玛利亚、波多野结衣、桃谷绘里香…… 好吧,又走远了。继续正题。。囧rz

        首先,你需要一套Python开发环境,这就不用多说了吧?以下作者用mac系统自带python为例。

需要下载的请到官方下载https://www.python.org

        番号搜索神器需要用到c++的QT库来负责UI界面的开发,所以需要使用PyQt作为第三方模块调用QT库。同时借助第三方搜索bt磁力站,后面需要用到pyquery来帮助解析html,因为pyquery对于熟悉jquery的童鞋来说很方便,不需要再去看文档怎么使用。拿来即可用上,所以作者选择pyquery。介绍完了,下面开始吧。如童鞋们环境跟我的不一样,请自行稍作修改即可。


1.下载Qt 并安装

http://qt-project.org/downloads
安装挺方便的,就不过多啰嗦了


2.下载SIP并安装

http://www.riverbankcomputing.co.uk/software/sip/download
下载后进行解压安装

cd sip-4.16
python configure.py -d /Library/Python/2.7/site-packages --arch=i386  
make 
sudo make install 

-d参数为sip模块安装路径,作者选择mac默认的目录。–arch参数为编译环境cpu构架的描述,根据不同情况而定,如i386,x86_64等。笔者通过mac终端arch命令获取,如下:
Python自制番号搜索神器_第1张图片


3.下载PyQt并安装

https://www.riverbankcomputing.com/software/pyqt/download
下载PyQt并安装

cd PyQt-mac-gpl-4.11 

python configure-ng.py -q /usr/local/bin/qmakeqmake -d /Library/Python/2.7/site-packages/ --sip /System/Library/Frameworks/Python.framework/Versions/2.7/bin/sip  --sysroot /System/Library/Frameworks/Python.framework/Versions/2.7

make  

sudo make install

-q为qmake路径,-d为pyqt模块安装路径, –sip为sip模块安装路径


4.下载安装pyquery

sudo easy_install pyquery 

笔者选用easy_install简单安装,当然也可以通过其它方式


5.下载安装pyquery依赖lxml

sudo easy_install lxml

        OK,安装完成之后。准备工作就好了,下面就开始可以做搜索神器开发了。作者选择借用http://www.sobt5.org这个bt站点来下手。


6.通过Qt的UI工具Qt Designer设计UI界面

Python自制番号搜索神器_第2张图片

设计完成之后,保存即可生成.ui文件。笔者只选用简单的输入框和按钮完成。


7.通过pyqt自带pyuic将.ui文件生成为python文件(生成代码形式描述UI布局)

pyuic4 -o myui.py myui.ui

笔者的生成代码如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'zhongzi.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName(_fromUtf8("Dialog"))
        Dialog.resize(400, 300)
        self.label = QtGui.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(170, 250, 231, 41))
        self.label.setObjectName(_fromUtf8("label"))
        self.label_2 = QtGui.QLabel(Dialog)
        self.label_2.setGeometry(QtCore.QRect(20, 60, 81, 41))
        self.label_2.setObjectName(_fromUtf8("label_2"))
        self.lineEdit = QtGui.QLineEdit(Dialog)
        self.lineEdit.setGeometry(QtCore.QRect(100, 60, 241, 31))
        self.lineEdit.setObjectName(_fromUtf8("textEdit"))
        self.pushButton = QtGui.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(260, 120, 110, 32))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(_translate("Dialog", "Dialog", None))
        self.label.setText(_translate("Dialog", "番号搜索神器 \n"
"                        designed by marco", None))
        self.label_2.setText(_translate("Dialog", "          番号:", None))
        self.pushButton.setText(_translate("Dialog", "搜索", None))


8.代码实现

简单说明一下,自定义python文件,引用上述生成的UI对应的python文件即可。http请求通过urllib2模块进行,需要注意的是,如果跟笔者一样选用这个站点,需要使用urllib2。因为现在部分网站有防爬虫机制,也就是request请求头中的User-Agent需要填写,这样才能越过这个机制。另对于pyquery就不过多说明了,用法跟jquery一致。相信大家很快能够上手。

#! /usr/bin/python
#! -- encoding:utf-8 --
import sys
import os
import PyQt4 as qt
import urllib2
import time

from pyquery import PyQuery as pq
from lxml import etree
from myui import Ui_Dialog

#页面搜索工具
class UrlTool(object):
    def __init__(self):
        super(UrlTool, self).__init__()
        self.urlString = 'http://www.sobt5.org'
    def downLoadFromWebsite(self, text):
        try:
            newUrl = str(self.urlString) + '/q/' + str(text)
            req = urllib2.Request(newUrl)
            req.add_header('User-agent','Mozilla 5.10')
            f = urllib2.urlopen(req)
            result = f.read()
            return result
        except Exception, e:
            raise

#获取种子下载地址工具类
class DownloadTorrentTool(object):
    def __init__(self, url):
        super(DownloadTorrentTool, self).__init__()
        self.url = url

    def getTorrentUrl(self):
        try:
            req = urllib2.Request(self.url)
            req.add_header('User-agent', 'Mozilla 5.10')
            f = urllib2.urlopen(req)
            result = f.read()
            return result
        except Exception, e:
            raise

#UI主类
class Ui(qt.QtGui.QDialog):
    def __init__(self, parent=None):
        super(Ui, self).__init__(parent)
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.ui.pushButton.clicked.connect(self.btnClicked)
    #button点击事件回调方法
    def btnClicked(self):
        #url打开搜索url
        urlTool = UrlTool()
        result = urlTool.downLoadFromWebsite(self.ui.lineEdit.text())

        #pyquery解析搜索网页获取种子页面链接
        document = pq(result)
        torrentPages = document.find('.item-title')
        torrentPageInfos = document.find('.item-bar')
        for i in range(3, torrentPages.length):
            torrentPagePath = torrentPages.eq(i).find('a').attr('href')
            torrentPageUrl = str(urlTool.urlString) + str(torrentPagePath)
            #获取种子页面
            downloadTool = DownloadTorrentTool(torrentPageUrl)
            downloadResult =  downloadTool.getTorrentUrl()
            #解析种子页面获取下载链接
            torrentDocument = pq(downloadResult)
            torrentUrl = torrentDocument.find('.fileDetail').find('p').eq(5).find('a').eq(1).attr('onclick')
            hashcode = torrentUrl.split('\'')[1].split('=')[1]
            finalDownloadUrl = '%s%s' % ('http://www.sobt5.org/tool/downbt?info=', hashcode)
            file = '%s%s' % (hashcode, '.torrent')
            print hashcode
            print finalDownloadUrl
            try:
                time.sleep(1.0)
                req = urllib2.Request(finalDownloadUrl)
                req.add_header('User-agent', 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) App leWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53')
                f = urllib2.urlopen(req)
                with open(hashcode + '.torrent', 'wb') as output:
                    output.write(f.read())
                f.close()
            except Exception, e:
                raise

if __name__ == '__main__':
    app = qt.QtGui.QApplication(sys.argv)
    window = Ui()
    window.show()
    sys.exit(app.exec_())

效果如下:
Python自制番号搜索神器_第3张图片


最终效果图:
Python自制番号搜索神器_第4张图片

到此自制番号搜索神器就完成了,好东西需要自己动手做出来。你还在犹豫什么呢?

你可能感兴趣的:(Python)