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命令获取,如下:
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界面
设计完成之后,保存即可生成.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_())
到此自制番号搜索神器就完成了,好东西需要自己动手做出来。你还在犹豫什么呢?