日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python语言磁力搜索引擎源码公开,基于DHT协议

發(fā)布時(shí)間:2024/8/1 python 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python语言磁力搜索引擎源码公开,基于DHT协议 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/qq_34844199/article/details/51558175
之前我在寫(xiě)百度網(wǎng)盤(pán)爬蟲(chóng),百度圖片爬蟲(chóng)的時(shí)候答應(yīng)網(wǎng)友說(shuō),抽時(shí)間要把ok搜搜的的源碼公開(kāi),如今是時(shí)候兌現(xiàn)諾言了,下面就是爬蟲(chóng)的所有代碼,完全,徹底的公開(kāi),你會(huì)不會(huì)寫(xiě)程序都可以使用,不過(guò)請(qǐng)先裝個(gè)linux系統(tǒng),具備公網(wǎng)條件,然后運(yùn)行:?


python startCrawler.py

有必要提醒你,數(shù)據(jù)庫(kù)字段代碼中都有,請(qǐng)你自己建張表格,這個(gè)太簡(jiǎn)單了,就不多說(shuō)了。同時(shí)我也提供一下下載地址,源碼都在:下載地址1?下載地址2
#!/usr/bin/env python
# encoding: utf-8
"""
author:haoning
create time:2015.8.1
"""
import hashlib
import os
import time
import datetime
import traceback
import sys
import random
import json
import socket
import threading
from hashlib import sha1 #進(jìn)行hash加密
from random import randint
from struct import unpack
from socket import inet_ntoa
from threading import Timer, Thread
from time import sleep
from collections import deque
from Queue import Queue
?
import MySQLdb as mdb ?#數(shù)據(jù)庫(kù)連接器
?
import metautils
import downloadTorrent
from bencode import bencode, bdecode
import pygeoip
?
DB_HOST = '127.0.0.1'
DB_USER = 'root'
DB_PASS = 'root'
?
BOOTSTRAP_NODES = (
? ? ("67.215.246.10", 6881),
? ? ("82.221.103.244", 6881),
? ? ("23.21.224.150", 6881)
)
RATE = 1 #調(diào)控速率
TID_LENGTH = 2
RE_JOIN_DHT_INTERVAL = 3
TOKEN_LENGTH = 2
INFO_HASH_LEN = 500000 #50w數(shù)據(jù)很小,限制內(nèi)存不至于消耗太大
CACHE_LEN = 100 #更新數(shù)據(jù)庫(kù)緩存
WAIT_DOWNLOAD = 80
?
?
geoip = pygeoip.GeoIP('GeoIP.dat')
?
def is_ip_allowed(ip):
? ? country = geoip.country_code_by_addr(ip)
? ? if country in ('CN','TW','JP','HK', 'KR'):
? ? ? ? return True
? ? return False
?
def entropy(length):
? ? return "".join(chr(randint(0, 255)) for _ in xrange(length))
?
def random_id():
? ? h = sha1()
? ? h.update(entropy(20))
? ? return h.digest()
?
?
def decode_nodes(nodes):
? ? n = []
? ? length = len(nodes)
? ? if (length % 26) != 0:
? ? ? ? return n
?
? ? for i in range(0, length, 26):
? ? ? ? nid = nodes[i:i+20]
? ? ? ? ip = inet_ntoa(nodes[i+20:i+24])
? ? ? ? port = unpack("!H", nodes[i+24:i+26])[0]
? ? ? ? n.append((nid, ip, port))
?
? ? return n
?
?
def timer(t, f):
? ? Timer(t, f).start()
?
?
def get_neighbor(target, nid, end=10):
? ? return target[:end]+nid[end:]
?
?
class KNode(object):
?
? ? def __init__(self, nid, ip, port):
? ? ? ? self.nid = nid
? ? ? ? self.ip = ip
? ? ? ? self.port = port
?
?
class DHTClient(Thread):
?
? ? def __init__(self, max_node_qsize):
? ? ? ? Thread.__init__(self)
? ? ? ? self.setDaemon(True)
? ? ? ? self.max_node_qsize = max_node_qsize
? ? ? ? self.nid = random_id()
? ? ? ? self.nodes = deque(maxlen=max_node_qsize)
?
? ? def send_krpc(self, msg, address):
? ? ? ? try:
? ? ? ? ? ? self.ufd.sendto(bencode(msg), address)
? ? ? ? except Exception:
? ? ? ? ? ? pass
?
? ? def send_find_node(self, address, nid=None):
? ? ? ? nid = get_neighbor(nid, self.nid) if nid else self.nid
? ? ? ? tid = entropy(TID_LENGTH)
? ? ? ? msg = {
? ? ? ? ? ? "t": tid,
? ? ? ? ? ? "y": "q",
? ? ? ? ? ? "q": "find_node",
? ? ? ? ? ? "a": {
? ? ? ? ? ? ? ? "id": nid,
? ? ? ? ? ? ? ? "target": random_id()
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? self.send_krpc(msg, address)
?
? ? def join_DHT(self):
? ? ? ? for address in BOOTSTRAP_NODES:
? ? ? ? ? ? self.send_find_node(address)
?
? ? def re_join_DHT(self):
? ? ? ? if len(self.nodes) == 0:
? ? ? ? ? ? self.join_DHT()
? ? ? ? timer(RE_JOIN_DHT_INTERVAL, self.re_join_DHT)
?
? ? def auto_send_find_node(self):
? ? ? ? wait = 1.0 / self.max_node_qsize
? ? ? ? while True:
? ? ? ? ? ? try:
? ? ? ? ? ? ? ? node = self.nodes.popleft()
? ? ? ? ? ? ? ? self.send_find_node((node.ip, node.port), node.nid)
? ? ? ? ? ? except IndexError:
? ? ? ? ? ? ? ? pass
? ? ? ? ? ? try:
? ? ? ? ? ? ? ? sleep(wait)
? ? ? ? ? ? except KeyboardInterrupt:
? ? ? ? ? ? ? ? os._exit(0)
?
? ? def process_find_node_response(self, msg, address):
? ? ? ? nodes = decode_nodes(msg["r"]["nodes"])
? ? ? ? for node in nodes:
? ? ? ? ? ? (nid, ip, port) = node
? ? ? ? ? ? if len(nid) != 20: continue
? ? ? ? ? ? if ip == self.bind_ip: continue
? ? ? ? ? ? n = KNode(nid, ip, port)
? ? ? ? ? ? self.nodes.append(n)
?
?
class DHTServer(DHTClient): #獲得info_hash
?
? ? def __init__(self, master, bind_ip, bind_port, max_node_qsize):
? ? ? ? DHTClient.__init__(self, max_node_qsize)
?
? ? ? ? self.master = master
? ? ? ? self.bind_ip = bind_ip
? ? ? ? self.bind_port = bind_port
? ? ? ? self.speed=0
?
? ? ? ? self.process_request_actions = {
? ? ? ? ? ? "get_peers": self.on_get_peers_request,
? ? ? ? ? ? "announce_peer": self.on_announce_peer_request,
? ? ? ? }
?
? ? ? ? self.ufd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
? ? ? ? self.ufd.bind((self.bind_ip, self.bind_port))
?
? ? ? ? timer(RE_JOIN_DHT_INTERVAL, self.re_join_DHT)
?
?
? ? def run(self):
? ? ? ? self.re_join_DHT()
? ? ? ? while True:
? ? ? ? ? ? try:
? ? ? ? ? ? ? ? (data, address) = self.ufd.recvfrom(65536)
? ? ? ? ? ? ? ? msg = bdecode(data)
? ? ? ? ? ? ? ? self.on_message(msg, address)
? ? ? ? ? ? except Exception:
? ? ? ? ? ? ? ? pass
?
? ? def on_message(self, msg, address):
? ? ? ? global RATE #設(shè)為全局量
? ? ? ? try:
? ? ? ? ? ? if msg["y"] == "r":
? ? ? ? ? ? ? ? if msg["r"].has_key("nodes"):
? ? ? ? ? ? ? ? ? ? self.process_find_node_response(msg, address) #發(fā)現(xiàn)節(jié)點(diǎn)
? ? ? ? ? ? elif msg["y"] == "q":
? ? ? ? ? ? ? ? try:
? ? ? ? ? ? ? ? ? ? self.speed+=1
? ? ? ? ? ? ? ? ? ? if self.speed % 10000 ==0:
? ? ? ? ? ? ? ? ? ? ? ? RATE=random.randint(1,3)
? ? ? ? ? ? ? ? ? ? ? ? if RATE==2:
? ? ? ? ? ? ? ? ? ? ? ? ? ? RATE=1
? ? ? ? ? ? ? ? ? ? ? ? if RATE==3:
? ? ? ? ? ? ? ? ? ? ? ? ? ? RATE=10
? ? ? ? ? ? ? ? ? ? ? ? if self.speed>100000:
? ? ? ? ? ? ? ? ? ? ? ? ? ? self.speed=0
? ? ? ? ? ? ? ? ? ? if self.speed % RATE==0: #數(shù)據(jù)過(guò)多,占用cpu太多,劃分限速,1,1,10
? ? ? ? ? ? ? ? ? ? ? ? self.process_request_actions[msg["q"]](msg, address) #處理其他節(jié)點(diǎn)的請(qǐng)求,這個(gè)過(guò)程獲取info_hash
? ? ? ? ? ? ? ? ? ? #self.process_request_actions[msg["q"]](msg, address) #處理其他節(jié)點(diǎn)的請(qǐng)求,這個(gè)過(guò)程獲取info_hash
? ? ? ? ? ? ? ? except KeyError:
? ? ? ? ? ? ? ? ? ? self.play_dead(msg, address)
? ? ? ? except KeyError:
? ? ? ? ? ? pass
?
? ? def on_get_peers_request(self, msg, address):
? ? ? ? try:
? ? ? ? ? ? infohash = msg["a"]["info_hash"]
? ? ? ? ? ? tid = msg["t"]
? ? ? ? ? ? nid = msg["a"]["id"]
? ? ? ? ? ? token = infohash[:TOKEN_LENGTH]
? ? ? ? ? ? msg = {
? ? ? ? ? ? ? ? "t": tid,
? ? ? ? ? ? ? ? "y": "r",
? ? ? ? ? ? ? ? "r": {
? ? ? ? ? ? ? ? ? ? "id": get_neighbor(infohash, self.nid),
? ? ? ? ? ? ? ? ? ? "nodes": "",
? ? ? ? ? ? ? ? ? ? "token": token
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? self.master.log(infohash, address)
? ? ? ? ? ? self.send_krpc(msg, address)
? ? ? ? except KeyError:
? ? ? ? ? ? pass
?
? ? def on_announce_peer_request(self, msg, address):
? ? ? ? try:
? ? ? ? ? ? infohash = msg["a"]["info_hash"]
? ? ? ? ? ? token = msg["a"]["token"]
? ? ? ? ? ? nid = msg["a"]["id"]
? ? ? ? ? ? tid = msg["t"]
?
? ? ? ? ? ? if infohash[:TOKEN_LENGTH] == token:
? ? ? ? ? ? ? ? if msg["a"].has_key("implied_port ") and msg["a"]["implied_port "] != 0:
? ? ? ? ? ? ? ? ? ? port = address[1]
? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? port = msg["a"]["port"]
? ? ? ? ? ? ? ? self.master.log_announce(infohash, (address[0], port))
? ? ? ? except Exception:
? ? ? ? ? ? print 'error'
? ? ? ? ? ? pass
? ? ? ? finally:
? ? ? ? ? ? self.ok(msg, address)
?
? ? def play_dead(self, msg, address):
? ? ? ? try:
? ? ? ? ? ? tid = msg["t"]
? ? ? ? ? ? msg = {
? ? ? ? ? ? ? ? "t": tid,
? ? ? ? ? ? ? ? "y": "e",
? ? ? ? ? ? ? ? "e": [202, "Server Error"]
? ? ? ? ? ? }
? ? ? ? ? ? self.send_krpc(msg, address)
? ? ? ? except KeyError:
? ? ? ? ? ? pass
?
? ? def ok(self, msg, address):
? ? ? ? try:
? ? ? ? ? ? tid = msg["t"]
? ? ? ? ? ? nid = msg["a"]["id"]
? ? ? ? ? ? msg = {
? ? ? ? ? ? ? ? "t": tid,
? ? ? ? ? ? ? ? "y": "r",
? ? ? ? ? ? ? ? "r": {
? ? ? ? ? ? ? ? ? ? "id": get_neighbor(nid, self.nid)
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? self.send_krpc(msg, address)
? ? ? ? except KeyError:
? ? ? ? ? ? pass
?
?
class Master(Thread): #解析info_hash
?
? ? def __init__(self):
? ? ? ? Thread.__init__(self)
? ? ? ? self.setDaemon(True)
? ? ? ? self.queue = Queue()
? ? ? ? self.cache = Queue()
? ? ? ? self.count=0
? ? ? ? self.mutex = threading.RLock() #可重入鎖,使單線程可以再次獲得已經(jīng)獲得的?
? ? ? ? self.waitDownload = Queue()
? ? ? ? self.metadata_queue = Queue()
? ? ? ? self.dbconn = mdb.connect(DB_HOST, DB_USER, DB_PASS, 'oksousou', charset='utf8')
? ? ? ? self.dbconn.autocommit(False)
? ? ? ? self.dbcurr = self.dbconn.cursor()
? ? ? ? self.dbcurr.execute('SET NAMES utf8')
? ? ? ? self.visited = set()
? ? ? ? ? ? ? ? ?
? ? def lock(self): #加鎖
? ? ? ? self.mutex.acquire()
?
? ? def unlock(self): #解鎖
? ? ? ? self.mutex.release()
? ? ? ? ?
? ? def work(self,item):
?
? ? ? ? print "start thread",item
? ? ? ? while True:
? ? ? ? ? ? self.prepare_download_metadata()
? ? ? ? ? ? self.lock()
? ? ? ? ? ? self.download_metadata()
? ? ? ? ? ? self.unlock()
?
? ? ? ? ? ? self.lock()
? ? ? ? ? ? self.got_torrent()
? ? ? ? ? ? self.unlock()
? ? ? ? ? ? ? ? ? ? ?
? ? def start_work(self,max):
? ? ?
? ? ? ? for item in xrange(max):
? ? ? ? ? ? t = threading.Thread(target=self.work, args=(item,))
? ? ? ? ? ? t.setDaemon(True)
? ? ? ? ? ? t.start()
? ? ? ? ?
? ? #入隊(duì)的種子效率更高
? ? def log_announce(self, binhash, address=None):
? ? ? ? if self.queue.qsize() < INFO_HASH_LEN : #大于INFO_HASH_LEN就不要入隊(duì),否則后面來(lái)不及處理
? ? ? ? ? ? if is_ip_allowed(address[0]):
? ? ? ? ? ? ? ? self.queue.put([address, binhash]) #獲得info_hash
? ? ? ? ?
? ? def log(self, infohash, address=None):
? ? ? ? if self.queue.qsize() < INFO_HASH_LEN: #大于INFO_HASH_LEN/2就不要入隊(duì),否則后面來(lái)不及處理
? ? ? ? ? ? if is_ip_allowed(address[0]):
? ? ? ? ? ? ? ? self.queue.put([address, infohash])
? ? ?
? ? def prepare_download_metadata(self):
? ? ? ? ?
? ? ? ? if self.queue.qsize() == 0:
? ? ? ? ? ? sleep(2)
? ? ? ? #從queue中獲得info_hash用來(lái)下載
? ? ? ? address, binhash= self.queue.get()?
? ? ? ? if binhash in self.visited:
? ? ? ? ? ? return
? ? ? ? if len(self.visited) > 100000: #大于100000重置隊(duì)列,認(rèn)為已經(jīng)訪問(wèn)過(guò)了
? ? ? ? ? ? self.visited = set()
? ? ? ? self.visited.add(binhash)
? ? ? ? #跟新已經(jīng)訪問(wèn)過(guò)的info_hash
? ? ? ? info_hash = binhash.encode('hex')
? ? ? ? utcnow = datetime.datetime.utcnow()
? ? ? ? ?
? ? ? ? self.cache.put((address,binhash,utcnow)) #裝入緩存隊(duì)列
? ? ?
? ? def download_metadata(self):
? ? ?
? ? ? ? if self.cache.qsize() > CACHE_LEN/2: #出隊(duì)更新下載
? ? ? ? ? ? while self.cache.qsize() > 0: #排空隊(duì)列
? ? ? ? ? ? ? ? address,binhash,utcnow = self.cache.get()
? ? ? ? ? ? ? ? info_hash = binhash.encode('hex')
? ? ? ? ? ? ? ? self.dbcurr.execute('SELECT id FROM search_hash WHERE info_hash=%s', (info_hash,))
? ? ? ? ? ? ? ? y = self.dbcurr.fetchone()
? ? ? ? ? ? ? ? if y:
? ? ? ? ? ? ? ? # 更新最近發(fā)現(xiàn)時(shí)間,請(qǐng)求數(shù)
? ? ? ? ? ? ? ? ? ? self.dbcurr.execute('UPDATE search_hash SET last_seen=%s, requests=requests+1 WHERE info_hash=%s', (utcnow, info_hash))
? ? ? ? ? ? ? ? else:?
? ? ? ? ? ? ? ? ? ? self.waitDownload.put((address, binhash))
? ? ? ? ? ? self.dbconn.commit()
? ? ? ? ? ? if self.waitDownload.qsize() > WAIT_DOWNLOAD:
? ? ? ? ? ? ? ? while self.waitDownload.qsize() > 0:
? ? ? ? ? ? ? ? ? ? address,binhash = self.waitDownload.get()
? ? ? ? ? ? ? ? ? ? t = threading.Thread(target=downloadTorrent.download_metadata, args=(address, binhash, self.metadata_queue))
? ? ? ? ? ? ? ? ? ? t.setDaemon(True)
? ? ? ? ? ? ? ? ? ? t.start()
?
? ? def decode(self, s):
? ? ? ? if type(s) is list:
? ? ? ? ? ? s = ';'.join(s)
? ? ? ? u = s
? ? ? ? for x in (self.encoding, 'utf8', 'gbk', 'big5'):
? ? ? ? ? ? try:
? ? ? ? ? ? ? ? u = s.decode(x)
? ? ? ? ? ? ? ? return u
? ? ? ? ? ? except:
? ? ? ? ? ? ? ? pass
? ? ? ? return s.decode(self.encoding, 'ignore')
?
? ? def decode_utf8(self, d, i):
? ? ? ? if i+'.utf-8' in d:
? ? ? ? ? ? return d[i+'.utf-8'].decode('utf8')
? ? ? ? return self.decode(d[i])
? ? ?
? ? def parse_metadata(self, data): #解析種子
? ? ? ? info = {}
? ? ? ? self.encoding = 'utf8'
? ? ? ? try:
? ? ? ? ? ? torrent = bdecode(data) #編碼后解析
? ? ? ? ? ? if not torrent.get('name'):
? ? ? ? ? ? ? ? return None
? ? ? ? except:
? ? ? ? ? ? return None
? ? ? ? detail = torrent
? ? ? ? info['name'] = self.decode_utf8(detail, 'name')
? ? ? ? if 'files' in detail:
? ? ? ? ? ? info['files'] = []
? ? ? ? ? ? for x in detail['files']:
? ? ? ? ? ? ? ? if 'path.utf-8' in x:
? ? ? ? ? ? ? ? ? ? v = {'path': self.decode('/'.join(x['path.utf-8'])), 'length': x['length']}
? ? ? ? ? ? ? ? else:
? ? ? ? ? ? ? ? ? ? v = {'path': self.decode('/'.join(x['path'])), 'length': x['length']}
? ? ? ? ? ? ? ? if 'filehash' in x:
? ? ? ? ? ? ? ? ? ? v['filehash'] = x['filehash'].encode('hex')
? ? ? ? ? ? ? ? info['files'].append(v)
? ? ? ? ? ? info['length'] = sum([x['length'] for x in info['files']])
? ? ? ? else:
? ? ? ? ? ? info['length'] = detail['length']
? ? ? ? info['data_hash'] = hashlib.md5(detail['pieces']).hexdigest()
? ? ? ? return info
?
? ? def got_torrent(self):
? ? ? ? if self.metadata_queue.qsize() == 0:
? ? ? ? ? ? return
? ? ? ? binhash, address, data,start_time = self.metadata_queue.get()
? ? ? ? if not data:
? ? ? ? ? ? return
? ? ? ? try:
? ? ? ? ? ? info = self.parse_metadata(data)
? ? ? ? ? ? if not info:
? ? ? ? ? ? ? ? return
? ? ? ? except:
? ? ? ? ? ? traceback.print_exc()
? ? ? ? ? ? return
?
? ? ? ? temp = time.time()
? ? ? ? x = time.localtime(float(temp))
? ? ? ? utcnow = time.strftime("%Y-%m-%d %H:%M:%S",x) # get time now
? ? ? ? ?
? ? ? ? info_hash = binhash.encode('hex') #磁力
? ? ? ? info['info_hash'] = info_hash
? ? ? ? # need to build tags
? ? ? ? info['tagged'] = False
? ? ? ? info['classified'] = False
? ? ? ? info['requests'] = 1
? ? ? ? info['last_seen'] = utcnow
? ? ? ? info['create_time'] = utcnow
? ? ? ? info['source_ip'] = address[0]
? ? ? ? ?
? ? ? ? if info.get('files'):
? ? ? ? ? ? files = [z for z in info['files'] if not z['path'].startswith('_')]
? ? ? ? ? ? if not files:
? ? ? ? ? ? ? ? files = info['files']
? ? ? ? else:
? ? ? ? ? ? files = [{'path': info['name'], 'length': info['length']}]
? ? ? ? files.sort(key=lambda z:z['length'], reverse=True)
? ? ? ? bigfname = files[0]['path']
? ? ? ? info['extension'] = metautils.get_extension(bigfname).lower()
? ? ? ? info['category'] = metautils.get_category(info['extension'])
?
? ? ? ? try:
? ? ? ? ? ? try:
? ? ? ? ? ? ? ? print '\n', 'Saved', info['info_hash'], info['name'], (time.time()-start_time), 's', address[0]
? ? ? ? ? ? except:
? ? ? ? ? ? ? ? print '\n', 'Saved', info['info_hash']
? ? ? ? ? ? ret = self.dbcurr.execute('INSERT INTO search_hash(info_hash,category,data_hash,name,extension,classified,source_ip,tagged,' +?
? ? ? ? ? ? ? ? 'length,create_time,last_seen,requests) VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)',
? ? ? ? ? ? ? ? (info['info_hash'], info['category'], info['data_hash'], info['name'], info['extension'], info['classified'],
? ? ? ? ? ? ? ? info['source_ip'], info['tagged'], info['length'], info['create_time'], info['last_seen'], info['requests']))
? ? ? ? ? ? if self.count %50 ==0:
? ? ? ? ? ? ? ? self.dbconn.commit()
? ? ? ? ? ? ? ? if self.count>100000:
? ? ? ? ? ? ? ? ? ? self.count=0
? ? ? ? except:
? ? ? ? ? ? print self.name, 'save error', self.name, info
? ? ? ? ? ? traceback.print_exc()
? ? ? ? ? ? return
?
if __name__ == "__main__":
? ? ?
? ? #啟動(dòng)客戶端
? ? master = Master()
? ? master.start_work(150)
? ? ?
? ? #啟動(dòng)服務(wù)器
? ? dht = DHTServer(master, "0.0.0.0", 6881, max_node_qsize=200)
? ? dht.start()
? ? dht.auto_send_find_node()

注意,上面的代碼有一段代碼需要下載種子,所以下面的這段代碼十分重要:

#!/usr/bin/env python
# encoding: utf-8
"""
author:haoning
create time:2015.8.1
"""
from hashlib import sha1
import math
from socket import inet_ntoa
import socket
from struct import pack, unpack
from threading import Timer, Thread
from time import sleep, time
?
from bencode import bencode, bdecode?
from startCrawler import entropy
?
?
BT_PROTOCOL = "BitTorrent protocol"
BT_MSG_ID = 20
EXT_HANDSHAKE_ID = 0
?
def random_id():
? ? hash = sha1()
? ? hash.update(entropy(20))
? ? return hash.digest()
?
def send_packet(the_socket, msg):
? ? the_socket.send(msg)
?
def send_message(the_socket, msg):
? ? msg_len = pack(">I", len(msg))
? ? send_packet(the_socket, msg_len + msg)
?
def send_handshake(the_socket, infohash):
? ? bt_header = chr(len(BT_PROTOCOL)) + BT_PROTOCOL
? ? ext_bytes = "\x00\x00\x00\x00\x00\x10\x00\x00"
? ? peer_id = random_id()
? ? packet = bt_header + ext_bytes + infohash + peer_id
?
? ? send_packet(the_socket, packet)
?
def check_handshake(packet, self_infohash):
? ? try:
? ? ? ? bt_header_len, packet = ord(packet[:1]), packet[1:]
? ? ? ? if bt_header_len != len(BT_PROTOCOL):
? ? ? ? ? ? return False
? ? except TypeError:
? ? ? ? return False
?
? ? bt_header, packet = packet[:bt_header_len], packet[bt_header_len:]
? ? if bt_header != BT_PROTOCOL:
? ? ? ? return False
?
? ? packet = packet[8:]
? ? infohash = packet[:20]
? ? if infohash != self_infohash:
? ? ? ? return False
?
? ? return True
?
def send_ext_handshake(the_socket):
? ? msg = chr(BT_MSG_ID) + chr(EXT_HANDSHAKE_ID) + bencode({"m":{"ut_metadata": 1}})
? ? send_message(the_socket, msg)
?
def request_metadata(the_socket, ut_metadata, piece):
? ? """bep_0009"""
? ? msg = chr(BT_MSG_ID) + chr(ut_metadata) + bencode({"msg_type": 0, "piece": piece})
? ? send_message(the_socket, msg)
?
def get_ut_metadata(data):
? ? ut_metadata = "_metadata"
? ? index = data.index(ut_metadata)+len(ut_metadata) + 1
? ? return int(data[index])
?
def get_metadata_size(data):
? ? metadata_size = "metadata_size"
? ? start = data.index(metadata_size) + len(metadata_size) + 1
? ? data = data[start:]
? ? return int(data[:data.index("e")])
?
def recvall(the_socket, timeout=5):
? ? the_socket.setblocking(0)
? ? total_data = []
? ? data = ""
? ? begin = time()
?
? ? while True:
? ? ? ? sleep(0.05)
? ? ? ? if total_data and time()-begin > timeout:
? ? ? ? ? ? break
? ? ? ? elif time()-begin > timeout*2:
? ? ? ? ? ? break
? ? ? ? try:
? ? ? ? ? ? data = the_socket.recv(1024)
? ? ? ? ? ? if data:
? ? ? ? ? ? ? ? total_data.append(data)
? ? ? ? ? ? ? ? begin = time()
? ? ? ? except Exception:
? ? ? ? ? ? pass
? ? return "".join(total_data)
?
def download_metadata(address, infohash, metadata_queue, timeout=5):
? ? metadata = None
? ? start_time = time()
? ? the_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
? ? try:?
? ? ? ? the_socket.settimeout(timeout)
? ? ? ? the_socket.connect(address)
?
? ? ? ? # handshake
? ? ? ? send_handshake(the_socket, infohash)
? ? ? ? packet = the_socket.recv(4096)
?
? ? ? ? # handshake error
? ? ? ? if not check_handshake(packet, infohash):
? ? ? ? ? ? return
?
? ? ? ? # ext handshake
? ? ? ? send_ext_handshake(the_socket)
? ? ? ? packet = the_socket.recv(4096)
?
? ? ? ? # get ut_metadata and metadata_size
? ? ? ? ut_metadata, metadata_size = get_ut_metadata(packet), get_metadata_size(packet)
?
? ? ? ? # request each piece of metadata
? ? ? ? metadata = []
? ? ? ? for piece in range(int(math.ceil(metadata_size/(16.0*1024)))): #piece是個(gè)控制塊,根據(jù)控制塊下載數(shù)據(jù)
? ? ? ? ? ? request_metadata(the_socket, ut_metadata, piece)
? ? ? ? ? ? packet = recvall(the_socket, timeout) #the_socket.recv(1024*17)
? ? ? ? ? ? metadata.append(packet[packet.index("ee")+2:]) ? ? ? ?
? ? ? ? metadata = "".join(metadata)
?
? ? except socket.timeout:
? ? ? ? pass
? ? except Exception, e:
? ? ? ? pass
? ? finally:
? ? ? ? #print "metadata= %s" %(metadata)
? ? ? ? the_socket.close() #確保沒(méi)回都關(guān)閉socket
? ? ? ? if metadata != None: #只讓不空的種子入? ? ? ? ? ? ?
? ? ? ? ? ? metadata_queue.put((infohash, address, metadata,start_time))

其實(shí)下載種子還有一種方式就是借助libtorrent,但這個(gè)太耗費(fèi)cpu了,所以我一般不用他,如下:

#coding: utf8
import threading
import traceback
import random
import time
import os
import socket
?
import libtorrent as lt
?
threading.stack_size(200*1024)
socket.setdefaulttimeout(30)
?
def fetch_torrent(session, ih, timeout):
? ? name = ih.upper()
? ? url = 'magnet:?xt=urn:btih:%s' % (name,)
? ? data = ''
? ? params = {
? ? ? ? 'save_path': '/tmp/downloads/',
? ? ? ? 'storage_mode': lt.storage_mode_t(2),
? ? ? ? 'paused': False,
? ? ? ? 'auto_managed': False,
? ? ? ? 'duplicate_is_error': True}
? ? try:
? ? ? ? handle = lt.add_magnet_uri(session, url, params)
? ? except:
? ? ? ? return None
? ? status = session.status()
? ? handle.set_sequential_download(1)
? ? meta = None
? ? down_time = time.time()
? ? down_path = None
? ? for i in xrange(0, timeout):
? ? ? ? if handle.has_metadata():
? ? ? ? ? ? info = handle.get_torrent_info()
? ? ? ? ? ? down_path = '/tmp/downloads/%s' % info.name()
? ? ? ? ? ? #print 'status', 'p', status.num_peers, 'g', status.dht_global_nodes, 'ts', status.dht_torrents, 'u', status.total_upload, 'd', status.total_download
? ? ? ? ? ? meta = info.metadata()
? ? ? ? ? ? break
? ? ? ? time.sleep(1)
? ? if down_path and os.path.exists(down_path):
? ? ? ? os.system('rm -rf "%s"' % down_path)
? ? session.remove_torrent(handle)
? ? return meta
?
?
def download_metadata(address, binhash, metadata_queue, timeout=20):
? ? metadata = None
? ? start_time = time.time()
? ? try:
? ? ? ? session = lt.session()
? ? ? ? r = random.randrange(10000, 50000)
? ? ? ? session.listen_on(r, r+10)
? ? ? ? session.add_dht_router('router.bittorrent.com',6881)
? ? ? ? session.add_dht_router('router.utorrent.com',6881)
? ? ? ? session.add_dht_router('dht.transmission.com',6881)
? ? ? ? session.add_dht_router('127.0.0.1',6881)
? ? ? ? session.start_dht()
? ? ? ? metadata = fetch_torrent(session, binhash.encode('hex'), timeout)
? ? ? ? session = None
? ? except:
? ? ? ? traceback.print_exc()
? ? finally:
? ? ? ? metadata_queue.put((binhash, address, metadata,start_time))
這個(gè)爬蟲(chóng)還是耗費(fèi)了本人和其他網(wǎng)上高手的很多時(shí)間的,請(qǐng)看到這篇博客的朋友保持鉆研精神,開(kāi)源精神,多多交流,秉承分享。本人建立個(gè)qq群作為去轉(zhuǎn)盤(pán)網(wǎng)的官方群,人數(shù)現(xiàn)在也不多,如果有興趣的話來(lái)逛逛吧,多個(gè)粉絲去轉(zhuǎn)盤(pán)多一份熱鬧,qq群號(hào):512245829
————————————————
版權(quán)聲明:本文為CSDN博主「qq_34844199」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_34844199/article/details/51558175

總結(jié)

以上是生活随笔為你收集整理的python语言磁力搜索引擎源码公开,基于DHT协议的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

欧美一区二区在线免费观看 | 小草av在线播放 | 九九精品视频在线观看 | 大片网站久久 | 亚洲高清视频在线播放 | 欧美日韩视频在线观看一区二区 | 久久这里只有精品久久 | 男女全黄一级一级高潮免费看 | 少妇搡bbbb搡bbb搡69 | 国产精品中文字幕在线 | 国产福利中文字幕 | 久久精品视频4 | 亚洲精品午夜久久久 | 综合精品久久久 | 四虎国产精品免费观看视频优播 | 免费av免费观看 | 深夜免费福利网站 | 日日碰狠狠躁久久躁综合网 | 91麻豆产精品久久久久久 | 999ZYZ玖玖资源站永久 | 欧美久久久影院 | 亚洲精品国产自产拍在线观看 | 国产成人免费高清 | 在线视频日韩精品 | 97精品国产97久久久久久 | 欧美日韩18| 婷婷精品进入 | 欧美成人手机版 | 狠狠色香婷婷久久亚洲精品 | 国产韩国日本高清视频 | 亚洲精品网站在线 | 国产精品久久麻豆 | 日韩18p| 国产美女精品视频免费观看 | 在线a视频免费观看 | 国内小视频在线观看 | 天天天天爱天天躁 | 婷婷亚洲综合五月天小说 | 天天干,天天射,天天操,天天摸 | 久久激情小说 | 久青草视频在线观看 | 国产精品福利无圣光在线一区 | 欧美一级黄色视屏 | 99欧美视频 | 精品国产乱码一区二区三区在线 | 手机在线观看国产精品 | 手机在线看永久av片免费 | 国产96在线观看 | 福利电影一区二区 | 国产又粗又猛又爽又黄的视频先 | 国产青青青 | 91精品在线免费 | 日韩中文在线观看 | 免费美女久久99 | 在线观看中文字幕dvd播放 | 亚洲影视九九影院在线观看 | 在线免费观看视频一区二区三区 | 亚洲最新av网站 | 日韩欧美中文 | 日韩中文久久 | 亚州国产精品久久久 | 国产亚洲视频在线 | 狠狠干成人综合网 | 最近免费中文视频 | 97电影手机 | 色网站在线看 | 天天草天天色 | 手机av电影在线 | 美女亚洲精品 | 久久影视网 | 国产精品久久久久永久免费观看 | 欧美精品亚洲二区 | 亚洲不卡av一区二区三区 | 久久艹在线观看 | 久久国产精品一国产精品 | 国产精品久久99综合免费观看尤物 | 美女福利视频 | 一区二区不卡高清 | 国语黄色片 | www.日本色| 欧美成人xxxxxxxx | 黄色毛片在线看 | 97av免费视频 | 免费看色的网站 | 国产在线91在线电影 | 视频在线观看一区 | 久久综合色影院 | 国产精品女教师 | 成人午夜电影在线播放 | 狠狠躁日日躁狂躁夜夜躁av | 国产黄色片一级三级 | 久久艹国产视频 | 婷婷开心久久网 | 一区二区三区日韩视频在线观看 | 亚洲国产日本 | 97国产情侣爱久久免费观看 | 久久视频这里有久久精品视频11 | 国产高清免费视频 | 国产手机视频在线观看 | 国产中文字幕大全 | 免费在线观看黄网站 | 三级a视频 | 91亚色视频在线观看 | 91成人精品国产刺激国语对白 | 精品国产自在精品国产精野外直播 | 久操视频在线观看 | 97成人精品区在线播放 | 13日本xxxxxⅹxxx20| 亚洲作爱 | 国产亚洲在线视频 | 色噜噜在线观看 | 日韩久久久久久久久 | 亚洲精品视频在线观看免费 | 国产一卡二卡四卡国 | 九九av| 国产精品123 | 午夜视频在线观看一区二区 | 色的网站在线观看 | 不卡电影免费在线播放一区 | 久久国产福利 | 亚洲 欧美 综合 在线 精品 | 日日日干 | 国产精品免费不卡 | 人人爽人人射 | 欧美日本在线视频 | 成人国产精品久久久春色 | 精品国产伦一区二区三区观看体验 | 91在线你懂的| 欧美日韩在线看 | 在线观看视频国产 | 在线观看欧美成人 | 国产特级毛片aaaaaa高清 | 视频 天天草 | 黄色一级大片在线观看 | 欧美最新大片在线看 | 久久这里只有精品9 | 九九九视频在线 | 99这里精品 | 日韩成人免费在线观看 | 亚洲精品国偷拍自产在线观看 | 国产成人专区 | 中文字幕网站视频在线 | 中国一区二区视频 | 96av在线| 在线a亚洲视频播放在线观看 | 日日干干夜夜 | 国产视频久久久 | 久久久国产影院 | 日本久久久久久久久久 | 蜜臀91丨九色丨蝌蚪老版 | 日韩在线视频一区 | 日韩欧美不卡 | 九九亚洲视频 | 超碰公开在线 | 91网在线 | 国产91免费在线观看 | 成人免费在线观看av | 国外av在线 | 美女久久久久久 | 久久视频一区 | 国产精品视频地址 | 偷拍视频一区 | 天天干天天插 | 亚洲免费av电影 | 天堂网一区 | 在线 精品 国产 | 欧美日韩中文国产一区发布 | 久久夜色精品国产欧美乱 | 五月天天色 | 成人动漫视频在线 | 99久久精品国产一区 | 中文字幕 国产视频 | 毛片3 | 黄色软件在线观看免费 | 国产在线观看,日本 | 国内外成人免费在线视频 | 日本在线精品视频 | 91少妇精拍在线播放 | 国产精品免费观看视频 | 久久欧美综合 | 在线不卡a | 美女免费黄网站 | 色香蕉在线 | 很黄很色很污的网站 | 香蕉视频在线免费 | 久久午夜免费观看 | 碰超人人 | 黄色成人小视频 | 国产亚洲午夜高清国产拍精品 | 久久综合中文色婷婷 | 国产精品久久久久久久久久免费 | 丁香网五月天 | 91精品秘密在线观看 | 在线免费中文字幕 | 最近高清中文字幕 | 久久试看 | 久久av一区二区三区亚洲 | 国产黄色大片免费看 | 免费黄在线看 | 久久视频在线看 | 中文字幕日本在线 | 欧美巨大荫蒂茸毛毛人妖 | av超碰在线观看 | bbb搡bbb爽爽爽 | av成人在线播放 | 色91在线| 欧美日韩1区 | 国产99久久久国产精品免费看 | 91精品国产欧美一区二区成人 | 在线免费观看亚洲视频 | 精品久久久久久国产偷窥 | 国产色秀视频 | 天堂视频一区 | 三级视频国产 | 久久免费视频一区 | 国产精品免费看久久久8精臀av | www黄色大片| 色综合中文字幕 | 人人看人人做人人澡 | 久久国产亚洲精品 | 欧美大片aaa | 黄色www免费 | av成人黄色 | 国产精品18久久久久久不卡孕妇 | 成人午夜电影在线 | 午夜精品久久久久久久99婷婷 | 国产99久久久国产精品成人免费 | 精品黄色视| 97热视频 | 久精品视频在线观看 | 一本一道波多野毛片中文在线 | 国产精品视频全国免费观看 | 久久调教视频 | 99色免费 | 国产一级淫片免费看 | 国产免费视频一区二区裸体 | 日本久久综合视频 | 夜夜骑日日操 | 亚州av成人 | 国产 在线 高清 精品 | 久久久午夜精品福利内容 | 日韩一区二区三区高清免费看看 | 不卡的av在线 | 一区二区三区日韩视频在线观看 | 成人性生爱a∨ | 午夜精品一二三区 | wwwav视频| 久久精品国产亚洲a | 手机av在线免费观看 | 成人a视频在线观看 | 欧美日韩在线看 | 中文字幕在线看视频国产 | 激情视频久久 | 欧美一级片免费观看 | 狠狠操狠狠干天天操 | 日韩高清一区在线 | 91福利区一区二区三区 | 日韩久久精品 | 美国人与动物xxxx | 亚洲欧洲精品一区二区 | 国产99精品在线观看 | 国产91免费在线 | 视频 国产区 | 操老逼免费视频 | www.色就是色 | 视频一区二区免费 | 99国产一区 | 亚洲激情在线观看 | 亚洲日本成人网 | 久久99精品国产麻豆宅宅 | 精品久久免费 | 青青河边草免费观看 | 欧美激情精品久久久久久免费 | 久久香蕉电影网 | 黄色三级免费看 | 成人性生交大片免费看中文网站 | 国产精品色 | 狠狠操欧美 | 欧美日韩国产在线 | 日韩亚洲欧美中文字幕 | 国产丝袜美腿在线 | 久草视频观看 | 最新精品国产 | 黄色大片网 | 免费合欢视频成人app | 久草在在线 | 天天干天天干天天操 | 97免费在线观看视频 | 国产成人av电影在线观看 | 免费观看一级一片 | 久久天天躁夜夜躁狠狠85麻豆 | 国产一级黄色片免费看 | 日韩三级视频在线观看 | 精品国产免费看 | 欧美 日韩 性 | 日韩av影视在线观看 | 97国产精品免费 | 色www精品视频在线观看 | 欧美日韩裸体免费视频 | 成人播放器 | 97碰在线视频| 国产在线毛片 | 五月天综合色激情 | 爱色av.com| 久久国产高清 | 天天操天天摸天天爽 | 国产护士av | 五月婷婷激情综合网 | 日本黄区免费视频观看 | 国产成人av片 | 4p变态网欧美系列 | 五月天天在线 | 麻豆成人小视频 | 亚洲黄色在线免费观看 | 国产成人av在线 | 国产精品爽爽爽 | 免费看91的网站 | 99精品视频免费在线观看 | 亚洲高清在线视频 | 国产五月婷 | 亚洲国产影院av久久久久 | 在线观看日本高清mv视频 | 丁香九月激情 | 久草91视频| 国产精品视频专区 | 亚洲理论在线观看电影 | 四川妇女搡bbbb搡bbbb搡 | 成人福利在线 | 中文av字幕在线观看 | 国产精品一区二区精品视频免费看 | 一区二精品 | 免费看网站在线 | 欧美国产日韩一区二区 | 国产中文字幕在线 | 国产麻豆精品在线观看 | 国产成人亚洲精品自产在线 | 天天天天爽 | 久久男人中文字幕资源站 | 在线免费黄 | 久久久免费在线观看 | 激情www| 亚洲国产中文字幕在线 | 99视频在线观看一区三区 | 亚洲狠狠操 | 最近免费中文字幕大全高清10 | 色偷偷中文字幕 | 欧美精选一区二区三区 | 久久麻豆精品 | 在线观看av麻豆 | 色视频网站在线 | 色婷婷丁香 | 2020天天干夜夜爽 | 黄色的片子 | 日韩av片在线 | 久久 国产一区 | 2018亚洲男人天堂 | 成人午夜网 | 国产精品99久久久久的智能播放 | 亚洲老妇xxxxxx | 精品久久久久久久久久久久久久久久 | 人人澡人人添人人爽一区二区 | 久草电影免费在线观看 | 爱爱一区| 日韩av区 | 日韩综合一区二区 | 男女啪啪免费网站 | 亚洲最大av在线播放 | 亚洲一区二区三区在线看 | 亚洲精品国产精品99久久 | 在线 视频 亚洲 | 欧美日韩精品电影 | 中文字幕一二三区 | 天天干中文字幕 | 日本免费一二三区 | 天天久久综合 | 超碰在线观看av.com | 91色蜜桃 | 久久狠狠婷婷 | 五月天久久久久久 | 久久a久久 | 日韩欧美精品在线视频 | 99视频导航 | 91桃色免费观看 | 五月天婷婷综合 | 精品国产自在精品国产精野外直播 | 亚洲精品合集 | 国产黄色在线观看 | 97色综合 | 中文字幕日韩电影 | 国产成人一区二区精品非洲 | 久久精品视频4 | 日韩激情视频在线 | www国产亚洲精品久久麻豆 | 日本精品一二区 | 六月丁香综合网 | 丁香婷婷久久久综合精品国产 | x99av成人免费 | 成年人在线免费视频观看 | 国内综合精品午夜久久资源 | 午夜影院三级 | 久久久久久免费毛片精品 | 国产又粗又猛又黄视频 | 国产精品久久一卡二卡 | 免费久久99精品国产婷婷六月 | 99资源网 | 国产成在线观看免费视频 | 午夜视频在线观看一区 | 免费在线国产视频 | 亚洲 欧美 日韩 综合 | 国产亚洲情侣一区二区无 | 国产精品黄色在线观看 | 中文字幕刺激在线 | 日本三级全黄少妇三2023 | 亚洲不卡123 | 午夜视频色 | 久久99精品国产麻豆宅宅 | 日韩亚洲在线观看 | 伊人中文在线 | 国产老太婆免费交性大片 | 国产精品一区二区你懂的 | 国产一区在线视频观看 | 三级黄免费看 | 欧美色图亚洲图片 | 91成人观看 | 精品一区二区在线免费观看 | 亚洲视频 中文字幕 | 在线观看www视频 | 日日草天天草 | 国产精品毛片一区二区 | 国产精品自产拍在线观看 | 久久精品视频在线观看免费 | 97超碰人人干 | 在线免费观看涩涩 | 久久视频这里有精品 | 天天爱天天操天天干 | 婷婷综合久久 | 亚洲美女精品区人人人人 | 99999精品视频| 911精品美国片911久久久 | 亚洲成人网在线 | 国产精品999久久久 久产久精国产品 | 久久久久免费精品 | 天天操网址 | 成人a大片 | 国产不卡精品 | 免费看黄在线观看 | 91精品视频一区 | 国产成人精品999 | 欧美在线日韩在线 | 中文免费| 婷婷伊人五月天 | 97免费视频在线 | 欧美一级视频免费看 | 亚洲国产偷 | 久久精品理论 | 欧洲亚洲国产视频 | 狠狠狠色丁香婷婷综合久久五月 | 欧美精品生活片 | 久久免费在线观看视频 | 天天鲁天天干天天射 | 色噜噜狠狠狠狠色综合久不 | 日韩免费一区二区在线观看 | 激情五月婷婷激情 | 日韩视频一区二区 | 人人草人| 狠狠躁天天躁 | 国产视频在线免费 | 成人教育av | 国产精品久久久久久久av大片 | 美女网站黄在线观看 | 国产在线观看你懂得 | 成人黄色国产 | 中文字幕亚洲欧美日韩 | 中文字幕视频网站 | 亚洲成熟女人毛片在线 | 天天躁天天操 | 亚洲天堂精品 | 欧美黄在线 | 丁香九月婷婷 | 黄色在线看网站 | 天天操天天色综合 | 国产精品自产拍在线观看桃花 | 国产一级大片免费看 | 人人艹人人 | 免费看的黄色小视频 | 天堂va在线高清一区 | 色综合久久久久网 | 美女网站在线播放 | 美腿丝袜av | 狠狠操综合| 二区视频在线 | 97超碰免费 | 国产高清视频在线 | 日韩素人在线观看 | 99久久影院| 96久久精品 | 欧美成人区 | 国产99久| 亚洲 欧洲 国产 日本 综合 | 亚洲精品视频在线观看免费 | 99中文字幕 | 四虎成人精品在永久免费 | 久久草草热国产精品直播 | 日本爽妇网| 久久人人添人人爽添人人88v | 91手机视频 | 天天干,夜夜操 | 黄色成人在线观看 | 午夜免费福利片 | 韩国视频一区二区三区 | 久久免费看 | 久久美女电影 | 欧美一区二区三区免费观看 | 99久久精品无码一区二区毛片 | 国内精品视频一区二区三区八戒 | 视频一区二区在线观看 | 日本激情视频中文字幕 | 综合色中色 | 狠狠色狠狠综合久久 | 成人av电影在线 | 精品福利片 | 国产麻豆精品一区二区 | av中文国产 | 免费黄色a级毛片 | 人人爽久久涩噜噜噜网站 | 国产一级做a爱片久久毛片a | 久久亚洲综合色 | 亚州国产精品 | 丁香五月亚洲综合在线 | 香蕉久久国产 | 亚洲婷婷在线视频 | wwwwww黄| 成人久久| 人人插人人玩 | 日日操日日| 欧美一级免费黄色片 | 婷婷激情欧美 | 日韩欧美有码在线 | 91精品国产欧美一区二区 | 四虎成人免费影院 | 毛片无卡免费无播放器 | 日本午夜免费福利视频 | 日韩在线观看中文字幕 | 一区二区欧美在线观看 | 久久另类小说 | 日韩电影在线视频 | 在线精品一区二区 | 亚洲视频1 | 国产精品手机视频 | 免费看一及片 | 最近中文字幕mv | 亚洲成人999| 99热这里只有精品1 av中文字幕日韩 | www·22com天天操 | 亚洲综合小说 | 天天天插 | 国产亚洲精品女人久久久久久 | 亚洲日本一区二区在线 | 国产又粗又硬又长又爽的视频 | 韩国av免费 | 丁香激情网 | 日韩高清免费在线观看 | 一区二区精品在线观看 | 中文字幕在 | 天天综合色网 | 亚洲女人天堂成人av在线 | 欧美成a人片在线观看久 | 日韩av手机在线看 | 国产高清视频网 | 午夜影视一区 | 99热在线网站 | 国产理论一区二区三区 | 天天操天天色天天 | 成人久久久久久久久 | 在线免费观看视频你懂的 | 黄色网www | 日日碰狠狠添天天爽超碰97久久 | 少妇搡bbbb搡bbb搡忠贞 | 黄色片免费电影 | 又黄又网站 | 免费av大片 | 中文字幕一区二区三区四区视频 | 欧美日韩天堂 | 日韩性xxxx | 日韩欧美精品一区二区 | www.久久com| 亚洲女人天堂成人av在线 | 成人午夜电影在线播放 | 在线观看va | 国产精彩视频 | 天天色天天操综合 | 亚洲精品乱码久久久久久蜜桃欧美 | 欧美精品久久久久久久久老牛影院 | 久久精品视频在线播放 | 欧美日韩在线免费观看视频 | 欧美在线91 | 激情视频91 | 91日韩在线播放 | 久久中文精品视频 | 天天色天天上天天操 | 国产日产av | 亚洲人成综合 | 香蕉影视app| 91超级碰碰 | 狠狠网 | 美女网站视频色 | 开心激情五月网 | 日韩天堂网| 久久免费电影网 | 国产亚洲精品久久网站 | 天天躁日日躁狠狠 | 亚洲91精品在线观看 | 黄色小网站在线观看 | 免费高清无人区完整版 | 欧美成年网站 | 五月婷婷综合激情 | 天天综合色天天综合 | 黄色录像av | 成人天堂网 | 国产精品手机看片 | 国产午夜精品福利视频 | 国产福利不卡视频 | 日本成人黄色片 | 欧美成人精品欧美一级乱黄 | 人人澡超碰碰 | 久久久久久久综合色一本 | 国产福利精品视频 | 色悠悠久久综合 | 国产精品 美女 | 在线天堂v | 久久久久免费精品视频 | 人人爽人人爽人人片 | 9在线观看免费高清完整 | 国产在线精品国自产拍影院 | 在线观看视频中文字幕 | 国产精品久久久久久高潮 | 在线观看中文字幕一区 | 男女激情免费网站 | 99热在| 91视频久久 | 久久综合婷婷综合 | 色婷婷国产在线 | 91福利视频网站 | 激情黄色av | 久久亚洲综合国产精品99麻豆的功能介绍 | 久久激情视频 久久 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 亚洲精品一区二区在线观看 | 日韩二区三区在线 | 免费高清在线一区 | a在线免费观看视频 | 激情久久网 | 久久理论电影 | 亚洲另类久久 | 成人黄色毛片 | 三级小视频在线观看 | 国内精品久久久久影院优 | 成人黄色小说视频 | 亚洲欧洲成人精品av97 | 国产精品美女 | 欧美一区在线观看视频 | 91视视频在线直接观看在线看网页在线看 | 国产高清不卡av | 香蕉久久久久久av成人 | 国产成人精品一区二区三区免费 | 色久天 | 色噜噜在线观看视频 | 亚洲国产精品va在线看黑人 | 国产五码一区 | 国产精品亚 | 精品国产一区二区三区噜噜噜 | 国产精品白浆 | 婷婷久久精品 | 日韩精品不卡 | 成人a视频在线观看 | 99视频精品| 亚洲天天 | www.com黄色 | 人人精品久久 | 欧美日韩国产在线一区 | 成人午夜剧场在线观看 | 欧美成年网站 | 久日视频| 麻豆 free xxxx movies hd| 亚州av一区| 日本黄色免费观看 | 欧美网站黄色 | 久久久久久久久久福利 | 国产精品6 | 亚洲精品欧美精品 | 日日夜夜免费精品视频 | 亚洲综合精品视频 | 久久精品视频网 | 在线观看国产www | 黄色一级免费电影 | 久久福利综合 | 久久精品亚洲一区二区三区观看模式 | 13日本xxxxxⅹxxx20 | 成人国产网站 | 97超碰免费在线 | 欧美激情综合五月 | 玖玖爱免费视频 | 日韩精品一区二区在线观看 | 右手影院亚洲欧美 | 久久99精品久久久久久久久久久久 | 国产成人1区 | 久久成人一区二区 | 美女网站视频一区 | 日本久久久精品视频 | 91麻豆精品国产91久久久更新时间 | 最近中文字幕完整高清 | 国产伦精品一区二区三区… | 黄色片网站免费 | 免费看片成人 | 欧美成人xxx | 五月婷婷视频在线观看 | 国产精品99久久久久久宅男 | 精品a在线 | 天堂视频一区 | 精品一区在线看 | 99热国内精品 | 国产精品久久久久久久av电影 | 在线免费看黄色 | 日韩精品极品视频 | 天天干天天拍 | 国产福利91精品张津瑜 | 欧美日韩一区二区在线 | av一本久道久久波多野结衣 | 日韩精品久久久久久 | 麻豆视频在线免费观看 | 视频三区 | 日韩av中文字幕在线 | 成 人 黄 色 视频播放1 | 91手机视频在线 | 天天狠狠干 | 久久久久久久久久福利 | 久久免费毛片视频 | 天天天天爽 | 日韩区欧美久久久无人区 | 亚洲精品久久久久中文字幕二区 | 成 人 黄 色 视频播放1 | 日韩av不卡在线观看 | 91片黄在线观看 | 日韩精品五月天 | 激情综合色综合久久 | 九九在线高清精品视频 | 国产资源在线免费观看 | 午夜视频99 | 综合色中文| 99久久99久久精品国产片果冰 | 黄色av一级 | 97国产超碰 | 免费国产一区二区视频 | 亚洲欧美精品一区二区 | 国产精品久久久久久久久久ktv | 免费色视频网址 | 欧美三级在线播放 | 久久99网| 亚洲乱码国产乱码精品天美传媒 | 天天躁日日躁狠狠躁av麻豆 | 国产破处在线播放 | 欧美日韩亚洲在线 | 久久精品网| 国产精品原创在线 | 久久久私人影院 | 高清在线一区二区 | 亚洲精品免费观看视频 | 亚州激情视频 | 久久久毛片| 综合色在线观看 | 亚洲区精品视频 | 国产成人免费av电影 | 成人性生交视频 | 日韩国产欧美在线视频 | 青青草久草在线 | 99精品视频免费全部在线 | 四虎亚洲精品 | 国产精品白虎 | 日韩欧美69 | a成人v在线 | 欧美日韩国产欧美 | 日本公妇在线观看高清 | 国产一区久久久 | 欧美永久视频 | 99久久电影 | 国产成人精品一区二区三区网站观看 | 爱射综合 | 婷婷五月色综合 | 狠狠操狠狠干天天操 | 国产婷婷vvvv激情久 | 999精品 | 亚洲精品乱码久久久久久蜜桃欧美 | 插婷婷| 成人网在线免费视频 | www亚洲国产 | 婷婷激情网站 | 一级做a爱片性色毛片www | 丁香六月天婷婷 | 丝袜美腿av| 欧美日韩不卡一区二区三区 | 国产色视频123区 | 久久精品国产第一区二区三区 | 九九视频这里只有精品 | 天天操 夜夜操 | 久久99久久99精品免视看婷婷 | 成年人看片网站 | 日韩欧美在线一区二区 | av网站在线观看免费 | 久久国产网 | 超碰在线人人97 | 99久久电影 | 久久久免费高清视频 | 亚洲开心色 | 欧美在线视频一区二区三区 | 日日干天天爽 | 国产精品理论片在线观看 | 免费av大全| 天天爱天天色 | 久久久精品欧美 | 免费91麻豆精品国产自产在线观看 | 99在线视频网站 | 国产亚洲成av人片在线观看桃 | 五月丁婷婷 | 免费日韩一区二区三区 | 91精品1区 | 免费日韩av电影 | 国产97在线看 | 日日爽天天 | 色婷婷免费 | 黄色精品免费 | 欧美日韩在线看 | 国产91区| 欧美激情综合五月色丁香 | 久久高清国产 | 免费观看一区 | zzijzzij亚洲成熟少妇 | 色天天综合久久久久综合片 | 亚洲综合精品在线 | www.久草视频 | 福利视频午夜 | 国产手机视频在线观看 | 97色噜噜 | 热久久精品在线 | 99久热精品 | 国产精品久久久久久久久久 | 国产亚洲免费的视频看 | 黄色精品免费 | 国产成人香蕉 | 黄色网在线播放 | 成年人免费在线观看 | 久久久久久久国产精品视频 | 欧美一区中文字幕 | 最新中文字幕在线资源 | 亚洲电影一级黄 | 日日爱网站 | 手机av在线网站 | 欧美日韩国产综合一区二区 | 亚洲日本韩国一区二区 | 色偷偷男人的天堂av | 黄污网站在线 | 99精品国产99久久久久久97 | 九九九视频精品 | 六月色丁 | 欧美男女爱爱视频 | 黄色小说视频网站 | 在线精品视频在线观看高清 | 日韩视频免费观看高清完整版在线 | 又爽又黄又刺激的视频 | 香蕉在线视频观看 | 天天干夜夜干 | 日韩一区二区三区高清在线观看 | www.久艹 | 一区精品在线 | 欧美三级高清 | 三级黄色片在线观看 | 99国产精品视频免费观看一公开 | www.av在线.com| 永久免费的啪啪网站免费观看浪潮 | 日韩电影在线看 | 亚洲成色777777在线观看影院 | av一级片 | 波多野结衣一区二区三区中文字幕 | 国产精品 日本 | 激情在线网址 | 爱情影院aqdy鲁丝片二区 | 精品久久久成人 | 在线观看www91 | 女人高潮特级毛片 | 久久久久免费精品国产小说色大师 | 久久免费视频网站 | 婷婷久月| 欧美日韩1区 | 国产国语在线 | www.夜夜操.com | 成人啪啪18免费游戏链接 | 99色免费| 色香天天 | 91中文字幕在线 | 国产一级视频在线免费观看 | 99色在线视频 | 国产一区在线视频 | 夜夜操狠狠干 | 久草视频免费在线播放 | 国产精品乱码一区二区视频 | 天天爱天天操 | 成人亚洲综合 | 中文字幕日韩在线播放 | 亚洲精品视频免费 | 日韩专区中文字幕 | 欧美成人黄色片 | 综合久久婷婷 | 91桃花视频 | 欧美亚洲精品在线观看 | 国产在线观 | 国精产品满18岁在线 | 日韩欧美国产免费播放 | 国产成人久久av977小说 | 成人免费观看视频大全 | 日韩久久精品一区二区三区下载 | 国产精品毛片久久久久久久 | 国产99久久九九精品免费 | 中文十次啦| 欧美久久久久久久久 | av免费网站 | 精品一区二区6 | 91大片网站 | 色综合网在线 | 欧美先锋影音 | 国产在线 一区二区三区 | 亚州精品天堂中文字幕 | 国产第一页精品 | 国产亚洲成av人片在线观看桃 | 国外调教视频网站 | 亚洲精品综合在线观看 | 日韩精品 在线视频 | 国产一线二线三线在线观看 | 久草资源在线观看 | 久久无码av一区二区三区电影网 | 久草视频在线观 | 日韩欧美不卡 | 亚洲视频 一区 | 日韩av一区二区三区 | a成人在线 | 国产黄在线播放 | 粉嫩av一区二区三区四区在线观看 | 亚洲一区 av | 99久久99久久| 不卡的av在线 | 在线电影 一区 | 五月丁色 | 久久久www成人免费毛片麻豆 | 91麻豆精品国产午夜天堂 | 亚洲成人av在线电影 | 精品久久久久久久久久岛国gif | 亚洲天天综合网 | 免费网站在线观看成人 | 国产一区二区三区在线免费观看 | 肉色欧美久久久久久久免费看 | 9999毛片| 91福利国产在线观看 | 日本激情中文字幕 | 一本一本久久a久久精品综合妖精 | 久久夜色精品国产欧美乱极品 | 西西444www大胆高清图片 | 91在线文字幕 | 中文字幕刺激在线 | 久久久精品 一区二区三区 国产99视频在线观看 | 亚洲电影黄色 | 久久久久99精品国产片 | 最近中文字幕大全 | 日韩精品中文字幕一区二区 | 激情xxxx| 欧美精品v国产精品v日韩精品 | 狠狠干.com| 探花视频在线观看免费 | 日本高清dvd | 999国内精品永久免费视频 | 91精品国产综合久久福利 | 91在线入口| 97碰碰视频 | 久久综合久久综合久久综合 | 69亚洲视频 | 亚洲乱码在线 | 天天性天天草 | www国产在线 | 亚洲在线不卡 | 国产精品一区二区久久国产 | 久久你懂的 | 免费观看的av网站 | 久久视频在线观看中文字幕 | 成人国产精品久久久春色 | 国产亚洲人成网站在线观看 | 亚洲综合成人婷婷小说 | 日韩高清av | 一区二区精| 一区二区三区高清不卡 | 成年人精品 | 一区二区三区在线视频观看58 |