利用python代码爬取torrentkitty上的种子并存放到mongodb数据库

Mac下mongdb数据库管理利器-Robo 3T

0x0 本代码用途前瞻


说明:TorrentKitty大家经常用吧,呵呵,冷门视频资源搜索利器,当然你下载什么我管不了啊哈~除了torrentkitty,别的搜索服务比如豆瓣Top250、的七日热门什么的也类似,只要是比较规则存放的、防爬虫弱的大家举一反三,将需要的内容存放到数据库,方便后续分析,大数据、科学计算啥的。


PS1:代码中会写详细的注释,解释每一行是什么用途/为何这样写。
PS2:BeautifulSoup的语法确实比xpath更加简洁容易懂,理清思路,分步一步一步循序渐进,就能够得到解决方案。

0x1 注意事项及代码功能

1.本代码会将结果加入Mongodb数据库!!!
2.一定要注意Python的缩进,缩进是代码段完整及正确与否的标志,这个经常容易出错!!!
3.编辑器推荐Sublime Text直接可以运行代码,而且主题也很漂亮,不用拖着庞大的Pycharm,机器运行噪音太大。
4.本代码是python2的代码,python3不适用。
以下是代码编写开始设计的目标,历时大概3-4天,利用搜索引擎逐渐完善了代码功能。
#任务1:筛选文件大小满足条件的文件                                              <<<<<>>>>>
#任务2:使用代理,而不是使用全局代理。使得其他软件的使用不受影响。                   <<<<<<这个暂时没实现,只是防止这个网址连接不上,我这不需要,因为SS可以搞定“墙”>>>>>>
#任务3:根据搜索内容,转换为正常字符,命名文件名保存,而不是每次都是同一个文件名。      <<<<<>>>>>
#任务4:每20个链接保存一个文件,之后另增加文件保存。                               <<<<<>>>>>
#任务5:将抓取内容存放到MySQL或者其他简单数据库。Monogodb                         <<<<<>>>>>
#任务6:增加用户输入,然后搜索用户输入的内容。                                    <<<<<>>>>>
#任务7:使用beautifulsoup方法实现抓取。实现高级筛选功能。                         <<<<<>>>>>

0x2 需求分析及实现构思

torrent_to_mongodb设计流程图.gif
关键1.如何实现搜索关键字的编码转换,使得网页请求得到正确结果?
关键2.如何定位种子文件标签位置?
关键3.如何根据html的特征筛选我们需要的那些种子文件?
关键4.如何建立与mongodb的链接并保存到数据库?

0x3.1 代码主体:

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

import urllib2
import urllib
from lxml import etree

import codecs
import requests
from bs4 import BeautifulSoup
import pymongo_imp

search_list=['keyword1','keyword2']   #这里建立一个关键字列表,一次性把想要搜索的内容全部搜索一遍,解放你的双手和眼睛。
for keys2x in search_list:

url = 'https://www.torrentkitty.tv/search/'
#    keys2x = raw_input("请输入搜索关键字:")
keyword = urllib.quote(keys2x)  # 这是python2的语法
pages = 30
file_name = '/Users/llm/PycharmProjects/' + keys2x + '.txt'
ks = file_name
for page in range(0, pages):
    page = str(page)
    print "当前页码:%s" % page

    site = url + keyword + '/' + page

    h = urllib2.Request(site)  ###

    h.add_header('User-Agent',
             'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.14) Gecko/20080404 (FoxPlus) Firefox/2.0.0.14')

    try:      #引入异常处理机制
        ht = urllib2.urlopen(h)     #网页请求
     

        html = ht.read(ht)
        soup = BeautifulSoup(html, "lxml")                                              #####>>>>>>1     创建美丽汤。
        movie_list_soup = soup.find('table', attrs={'id': 'archiveResult'})             #####>>>>>>2     定位到列表所在位置。#archiveResult
        movie_name_list = []                                                            #####>>>>>>3     新建列表,存放查找内容。
        search_flag=0
        for movie_li in movie_list_soup.find_all('tr'):                                 #####>>>>>>4     设置过滤器。找到所有tr标签。
            search_flag=search_flag+1
            if search_flag > 1:                                                         #####>>>>>>4.1   设置查找标志,跳过第一个,因为第一个是表头。
                detail = movie_li.find('td', attrs={'class': 'size'}).getText()         #####>>>>>>5     定位所有的size标签,得到字符串。
        #上面获取了文件大小。
        #print "%s \n" % detail
                if movie_li.find('a', attrs={'rel': 'magnet'}) is None:
                    pass
                else:
                    detail_name1 = movie_li.find('a', attrs={'rel': 'magnet'})['title']
                    FHD_flag=detail_name1.find('FHD')
                    Thz_flag=detail_name1.find('Thz.la')
                if FHD_flag<>-1 or Thz_flag<>-1:                                         #####>>>>>>5.1     如果是高清或者是tha.lz那么就存档。
        ##if detail.find('mb')<>-1:                                               #####>>>>>>6     如果文件大小满足要求,那么下一步寻找兄弟节点。
            #文件名称
                    if movie_li.find('a', attrs={'rel': 'magnet'}) is None:
                        pass
                    else:
                        detail_name=movie_li.find('a', attrs={'rel': 'magnet'})['title']
                #上面获取了文件名称。❕
                        print detail_name
            # 文件大小  detail
                    print detail
            #链接地址
                    file_name = ks + '_' + page  # 让文件按页码保存,避免一个文件中链接数量太多。
                    if movie_li.find('a', attrs={'rel': 'magnet'}) is None:                ####>>>>>>>      如果为非空,那么就获取。
                        pass
                    else:
                        detail_mag=movie_li.find('a', attrs={'rel': 'magnet'})['href']      #####>>>>>>7     获取磁力链接地址。
                #上面获取了磁力链接。❕
                        print detail_mag
                #with open(file_name, 'a') as p:  # '''Note''':Append mode, run only once!
                #    p.write("%s \n \n" % detail_mag)  ##!!encode here to utf-8 to avoid encoding

                #获取了磁力链接之后开始存入数据库。
                        print "开始进行mongodb数据库操作:"
                #存入数据库
                        db=pymongo_imp.get_db()
                        my_collection = pymongo_imp.get_collection(db)

                        pymongo_imp.insert_one_doc(db,detail_name,detail,detail_mag)

                        print "截止目前,数据库中存放条目数量:%s个" % int(my_collection.count())

    except:
        pass

0x3.2 Mongodb操作模块:

# -*- coding: utf-8 -*-
#!/usr/bin/env python

# 《Torrent magnet存入数据库思路》
'''
# 1.利用python字符串处理函数获取唯一✅标识,(先尝试是否可以手动增加_id进去)
# 2.每次保存数据之前,先搜索数据库,确保没有重复,然后再保存。
# 3.保存字段有:【文件名、文件大小、链接、时间、关键标识】
# 4.file_name0  filesize0   magnet0  datetime0  keywords0
# 5.
'''
import pymongo             #导入pymongo模块         。PS:让py2.7安装pymongo的命令是 pip2 install  ,相应的让3安装就是pip3 install
import datetime            #导入时间模块
import re #导入正则模块

def get_db():
# 建立连接
client = pymongo.MongoClient(host="127.0.0.1", port=27017)  #设置主机地址和端口,建立数据库链接。
db = client['torrentkitty']                                      #或者使用字典的方式获取链接。
#或者 db = client.example                                    #获取属性的方式
return db  #返回获取到的数据库

def get_collection(db):
# 选择集合(mongo中collection和database都是延时创建的)
coll = db['informations']       #选择这个集合。多个document的合体,就是集合。
#print db.collection_names()     #打印集合名字
return coll                     #返回集合

def insert_one_doc(db,file_name0,filesize0,magnet0):
# 插入一个document               #mongodb中每一条信息叫document
coll = db['informations']       #选择这个集合
#step1 获取magnet链接的keyid   21-61位为关键字串   [20:61]
keywords0=magnet0[20:60]
#step2 查找keywords0是否重复。
if coll.find_one({"Vedio_KeyID": keywords0}) == None:
    print "数据库中没有该文件。Will Add to the database!"
    information = {"Vedio_name": file_name0, "File_size": filesize0, "Magnet_Link": magnet0,
                   "Save_Time": datetime.datetime.utcnow(), "Vedio_KeyID": keywords0}  # 字典,准备插入的字典。
    information_id = coll.insert(information)  # 插入这一条字典,获取
    print information_id
else:
    print "数据库已经有该文件。忽略!"
    pass
    #print "else"

def get_many_docs(db,find_key):
# mongo中提供了过滤查找的方法,可以通过各种条件筛选来获取数据集,还可以对数据进行计数,排序等处理
coll = db['informations']
#ASCENDING = 1 升序;DESCENDING = -1降序;default is ASCENDING
item_list=[]
for item in coll.find({"Vedio_name":re.compile(find_key)}).sort("Vedio_name", pymongo.DESCENDING):
    print item
    item_list.append(item)

count = coll.count()
print "集合中所有数据 %s个" % int(count)
return item_list

#条件查询
#count = coll.find({"name":"quyang"}).count()
#print "quyang: %s"%count


if __name__ == '__main__':
print "Please use it by import!"
db = get_db()  # 建立链接
my_collection = get_collection(db)  # 获取集合
post = {"author": "Mike", "text": "My first blog post!", "tags": ["mongodb", "python", "pymongo"],
        "date": datetime.datetime.utcnow()}  # 设置需要插入的内容,为一个字典。
# 插入记录
my_collection.insert(post)  # 插入上面的字典
print my_collection.find_one({"x": "10"})
information = {"name": "quyang", "age": "25"}     #字典,准备插入的字典。
information_id = my_collection.insert(information)         #插入这一条字典,获取
print information_id

0x4 使用方法及运行结果:

  • 用法:将0x3中的两段代码(数据库操作脚本命名为pymongo_imp.py)分别拷贝并建立py文件并存放到一个目录下面,执行主代码即可。
  • 附上GitHub地址可以下载源代码,这上面的文件不会出现缩进错误:https://github.com/perfectswpuboy1/torrent_to_mongodb
    torrent_to_mongodb.py运行效果图

0x5 参考链接:

  1. MongoDB与python交互
  2. MacbookPro,寒假想学下Python,用什么软件好一点?
  3. 你是如何自学 Python 的?
  4. python爬虫torrentkitty的种子

你可能感兴趣的:(利用python代码爬取torrentkitty上的种子并存放到mongodb数据库)