`
blued
  • 浏览: 1174 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

基于python的百度云网盘资源搜索引擎设计架构

阅读更多
大家都知道百度云网盘上有很多分享的资源,包括软件、各类视频自学教程、电子书、甚至各种电影、BT种子应有尽有,但百度云却没有提供相应的搜索功能。个人平时要找一些软件、美剧觉得非常蛋疼。于是就尝试开发一个百度云资源的搜索系统。
资源爬虫思路:
搜索引擎么最重要的就是有海量的资源了,有了资源,只要再基于资源实现全文检索功能就是一个简单的搜索引擎了。首先我需要爬取百度云的分享资源,爬取思路,打开任意一个百度云分享者的主页yun.baidu.com/share/home?uk=xxxxxx&view=share#category/type=0,你可以发现分享者有订阅者和粉丝,你可以递归遍历订阅者和粉丝,从而获得大量分享者uk,进而获得大量的分享资源。
系统实现环境:
语言:python
操作系统:Linux
其他中间件:nginx mysql sphinx
系统包括几个独立的部分:
1、基于requests实现的独立资源爬虫
2、基于开源全文检索引擎sphinx实现的资源索引程序
3、基于Django+bootstrap3开发的简易网站,网站搭建采用nginx1.8+fastCGI(flup)+python。 演示网站http://www.itjujiao.com
PS:
目前爬虫爬取了4000W左右的数据,sphinx对内存的要求实在太大了,巨坑。
百度会对爬虫做ip限制,写了个简单的xicidaili代理采集程序,requests可以配置http代理。
分词是sphinx自带的实现,支持中文分词,中文基于一元分词,有点过度分词,分词效果不是特别理想,比如我搜关键词“叶问3”出现的结果中会有“叶子的问题第3版”,不符合预期。英文分词有很多可以改善的地方,比如我搜xart不会出现x-art的结果,而实际上x-art却也是我想要的结果集(你们懂的)。
数据库是mysql,资源表,考虑单表记录上限,分了10个表。第一次爬完sphinx做全量索引,后续做增量索引。
后续优化:
1、分词处理,目前分词搜索结果不是很理想,有大神可以指点下思路。比如我检索“功夫熊猫之卷轴的秘密”,一个结果都没有。而检索“功夫熊猫“有结果集(功丶夫熊猫⒊英语中英字幕.mp4,功丶夫熊猫2.Kung.Fu.Panda.2.2011.BDrip.720P.国粤英台四语.特效中英字幕.mp4,功丶夫熊猫3(韩版)2016.高清中字.mkv等)或搜索”卷轴的秘密“有结果集([美国]功夫潘达之卷轴的秘密.2016.1080p.mp4, g夫熊猫之卷轴的秘密.HD1280超清中英双字.mp4等)
2、数据去重,目前发现抓取的数据很多是共享资源,后续考虑基于MD5去重

爬虫部分实现代码(只是思路代码有点乱):
#coding: utf8

import re
import urllib2
import time
from Queue import Queue
import threading, errno, datetime
import json
import requests
import MySQLdb as mdb

DB_HOST = '127.0.0.1'
DB_USER = 'root'
DB_PASS = ''


re_start = re.compile(r'start=(\d+)')
re_uid = re.compile(r'query_uk=(\d+)')
re_pptt = re.compile(r'&pptt=(\d+)')
re_urlid = re.compile(r'&urlid=(\d+)')

ONEPAGE = 20
ONESHAREPAGE = 20

URL_SHARE = 'http://yun.baidu.com/pcloud/feed/getsharelist?auth_type=1&start={start}&limit=20&query_uk={uk}&urlid={id}'
URL_FOLLOW = 'http://yun.baidu.com/pcloud/friend/getfollowlist?query_uk={uk}&limit=20&start={start}&urlid={id}'
URL_FANS = 'http://yun.baidu.com/pcloud/friend/getfanslist?query_uk={uk}&limit=20&start={start}&urlid={id}'

QNUM = 1000
hc_q = Queue(20)
hc_r = Queue(QNUM)

success = 0
failed = 0

PROXY_LIST = [[0, 10, "42.121.33.160", 809, "", "", 0],
                [5, 0, "218.97.195.38", 81, "", "", 0],
                ]

def req_worker(inx):
    s = requests.Session()
    while True:
        req_item = hc_q.get()
        
        req_type = req_item[0]
        url = req_item[1]
        r = s.get(url)
        hc_r.put((r.text, url))
        print "req_worker#", inx, url
        
def response_worker():
    dbconn = mdb.connect(DB_HOST, DB_USER, DB_PASS, 'baiduyun', charset='utf8')
    dbcurr = dbconn.cursor()
    dbcurr.execute('SET NAMES utf8')
    dbcurr.execute('set global wait_timeout=60000')
    while True:
        
        metadata, effective_url = hc_r.get()
        #print "response_worker:", effective_url
        try:
            tnow = int(time.time())
            id = re_urlid.findall(effective_url)[0]
            start = re_start.findall(effective_url)[0]
            if True:
                if 'getfollowlist' in effective_url: #type = 1
                    follows = json.loads(metadata)
                    uid = re_uid.findall(effective_url)[0]
                    if "total_count" in follows.keys() and follows["total_count"]>0 and str(start) == "0":
                        for i in range((follows["total_count"]-1)/ONEPAGE):
                            try:
                                dbcurr.execute('INSERT INTO urlids(uk, start, limited, type, status) VALUES(%s, %s, %s, 1, 0)' % (uid, str(ONEPAGE*(i+1)), str(ONEPAGE)))
                            except Exception as ex:
                                print "E1", str(ex)
                                pass
                    
                    if "follow_list" in follows.keys():
                        for item in follows["follow_list"]:
                            try:
                                dbcurr.execute('INSERT INTO user(userid, username, files, status, downloaded, lastaccess) VALUES(%s, "%s", 0, 0, 0, %s)' % (item['follow_uk'], item['follow_uname'], str(tnow)))
                            except Exception as ex:
                                print "E13", str(ex)
                                pass
                    else:
                        print "delete 1", uid, start
                        dbcurr.execute('delete from urlids where uk=%s and type=1 and start>%s' % (uid, start))
                elif 'getfanslist' in effective_url: #type = 2
                    fans = json.loads(metadata)
                    uid = re_uid.findall(effective_url)[0]
                    if "total_count" in fans.keys() and fans["total_count"]>0 and str(start) == "0":
                        for i in range((fans["total_count"]-1)/ONEPAGE):
                            try:
                                dbcurr.execute('INSERT INTO urlids(uk, start, limited, type, status) VALUES(%s, %s, %s, 2, 0)' % (uid, str(ONEPAGE*(i+1)), str(ONEPAGE)))
                            except Exception as ex:
                                print "E2", str(ex)
                                pass
                    
                    if "fans_list" in fans.keys():
                        for item in fans["fans_list"]:
                            try:
                                dbcurr.execute('INSERT INTO user(userid, username, files, status, downloaded, lastaccess) VALUES(%s, "%s", 0, 0, 0, %s)' % (item['fans_uk'], item['fans_uname'], str(tnow)))
                            except Exception as ex:
                                print "E23", str(ex)
                                pass
                    else:
                        print "delete 2", uid, start
                        dbcurr.execute('delete from urlids where uk=%s and type=2 and start>%s' % (uid, start))
                else:
                    shares = json.loads(metadata)
                    uid = re_uid.findall(effective_url)[0]
                    if "total_count" in shares.keys() and shares["total_count"]>0 and str(start) == "0":
                        for i in range((shares["total_count"]-1)/ONESHAREPAGE):
                            try:
                                dbcurr.execute('INSERT INTO urlids(uk, start, limited, type, status) VALUES(%s, %s, %s, 0, 0)' % (uid, str(ONESHAREPAGE*(i+1)), str(ONESHAREPAGE)))
                            except Exception as ex:
                                print "E3", str(ex)
                                pass
                    if "records" in shares.keys():
                        for item in shares["records"]:
                            try:
                                dbcurr.execute('INSERT INTO share(userid, filename, shareid, status) VALUES(%s, "%s", %s, 0)' % (uid, item['title'], item['shareid']))
                            except Exception as ex:
                                #print "E33", str(ex), item
                                pass
                    else:
                        print "delete 0", uid, start
                        dbcurr.execute('delete from urlids where uk=%s and type=0 and start>%s' % (uid, str(start)))
                dbcurr.execute('delete from urlids where id=%s' % (id, ))
                dbconn.commit()
        except Exception as ex:
            print "E5", str(ex), id

        
        pid = re_pptt.findall(effective_url)
        
        if pid:
            print "pid>>>", pid
            ppid = int(pid[0])
            PROXY_LIST[ppid][6] -= 1
    dbcurr.close()
    dbconn.close()
    
def worker():
    global success, failed
    dbconn = mdb.connect(DB_HOST, DB_USER, DB_PASS, 'baiduyun', charset='utf8')
    dbcurr = dbconn.cursor()
    dbcurr.execute('SET NAMES utf8')
    dbcurr.execute('set global wait_timeout=60000')
    while True:

        #dbcurr.execute('select * from urlids where status=0 order by type limit 1')
        dbcurr.execute('select * from urlids where status=0 and type>0 limit 1')
        d = dbcurr.fetchall()
        #print d
        if d:
            id = d[0][0]
            uk = d[0][1]
            start = d[0][2]
            limit = d[0][3]
            type = d[0][4]
            dbcurr.execute('update urlids set status=1 where id=%s' % (str(id),))
            url = ""
            if type == 0:
                url = URL_SHARE.format(uk=uk, start=start, id=id).encode('utf-8')
            elif  type == 1:
                url = URL_FOLLOW.format(uk=uk, start=start, id=id).encode('utf-8')
            elif type == 2:
                url = URL_FANS.format(uk=uk, start=start, id=id).encode('utf-8')
            if url:
                hc_q.put((type, url))
                
            #print "processed", url
        else:
            dbcurr.execute('select * from user where status=0 limit 1000')
            d = dbcurr.fetchall()
            if d:
                for item in d:
                    try:
                        dbcurr.execute('insert into urlids(uk, start, limited, type, status) values("%s", 0, %s, 0, 0)' % (item[1], str(ONESHAREPAGE)))
                        dbcurr.execute('insert into urlids(uk, start, limited, type, status) values("%s", 0, %s, 1, 0)' % (item[1], str(ONEPAGE)))
                        dbcurr.execute('insert into urlids(uk, start, limited, type, status) values("%s", 0, %s, 2, 0)' % (item[1], str(ONEPAGE)))
                        dbcurr.execute('update user set status=1 where userid=%s' % (item[1],))
                    except Exception as ex:
                        print "E6", str(ex)
            else:
                time.sleep(1)
                
        dbconn.commit()
    dbcurr.close()
    dbconn.close()
        
    
for item in range(16):    
    t = threading.Thread(target = req_worker, args = (item,))
    t.setDaemon(True)
    t.start()

s = threading.Thread(target = worker, args = ())
s.setDaemon(True)
s.start()

response_worker()

分享到:
评论

相关推荐

    基于python的百度云网盘爬虫

    【标题】"基于Python的百度云网盘爬虫"是一个项目,旨在教用户如何使用Python编程语言编写程序来抓取并下载百度云网盘上的公开资源。该项目涵盖了网络爬虫技术,结合了百度云盘的API接口,以及可能涉及的前端和后端...

    基于python的百度网盘批量转存工具.zip

    基于python的百度网盘批量转存工具.zip基于python的百度网盘批量转存工具.zip基于python的百度网盘批量转存工具.zip基于python的百度网盘批量转存工具.zip基于python的百度网盘批量转存工具.zip基于python的百度网盘...

    百度网盘搜索引擎(基于python)

    【标题】:“百度网盘搜索引擎(基于python)” 在当今数字化时代,数据共享与存储变得至关重要,而百度网盘作为一款流行的云存储服务,深受广大用户的喜爱。然而,由于其私密性和搜索功能的局限性,查找特定资源...

    基于python的搜索引擎设计与实现

    本项目"基于Python的搜索引擎设计与实现"聚焦于利用Python技术来创建一个功能完备的搜索系统,涵盖从数据抓取、预处理到索引建立、查询处理等多个关键步骤。 1. **数据抓取**:搜索引擎的第一步是获取网页数据。...

    基于Python的百度网盘资源下载与CSS适配设计源码

    该项目为基于Python的百度网盘资源下载工具与CSS适配设计源码,共包含32个文件,涵盖11个Python脚本、10个Python字节码文件、2个Markdown文档、2个YAML配置文件、2个HTML文件、1个Git忽略文件、1个日志文件、1个文本...

    基于 Python 3.8+Tkinter百度网盘批量转存用于批量转存分享资源到自己网盘带批量分享和检测有效性源码.zip

    总的来说,这个基于Python 3.8和Tkinter的百度网盘批量转存工具结合了编程和GUI设计,为用户提供了便捷的网盘管理方案,尤其适合需要频繁处理大量分享资源的用户。通过深入学习和理解这个工具的实现,开发者可以扩展...

    python基础教程视频教程百度云-python视频教程免费下载,百度云网盘资源,全套!....pdf

    Python是一种广泛使用的高级编程语言,尤其适合初学者入门。这套92天的Python视频教程涵盖了从基础到前端、Web框架再到项目实战的全方位内容,旨在让学习者从零基础逐步达到熟练掌握的程度。 教程首先从Python的...

    基于Python与spimi的新闻搜索引擎设计与实现

    在新闻搜索引擎的设计中,Python爬虫负责从各个新闻网站抓取数据,为后续的处理和分析提供原始信息。 2.1.1 Python Python具有丰富的库支持,如requests用于发送HTTP请求,BeautifulSoup或lxml用于解析HTML文档,...

    百度云网盘搜索引擎 v1.0

    百度云网盘搜索引擎是一个以PHP+MySQL进行开发的网盘搜索引擎源码。运行环境:开始之前你需要安装* PHP 5.3.7 +* MySQL* Python 2.7 ~* [xunsearch](http9000; fastcgi_index index.php; include fastcgi.conf; ...

    python入门配套教程百度云分享.pdf

    千锋教育 Python 视频教程 www.qfedu.com/video 做真实的自己-用良心做教育 python 入门配套教程百度云分享 Python 由于其简单,快速,库丰富的特点在国内使用的越来越广泛。最 近几年它出现了爆发式的增长,而且与...

    Python毕业设计-基于Django的网盘系统的设计与实现+使用说明+全部资料(优秀项目).zip

    Python毕业设计-基于Django的网盘系统的设计与实现+使用说明+全部资料(优秀项目).zipPython毕业设计-基于Django的网盘系统的设计与实现+使用说明+全部资料(优秀项目).zip 【备注】 1、该资源内项目代码都经过...

    百度云网盘搜索引擎,包含爬虫 & 网站.zip

    网站.zip" 提供了这个资源的核心内容:一个搜索引擎,专门针对百度云网盘,它整合了爬虫技术和网站开发。这个搜索引擎可能是由Python爬虫实现的,因为标签中提到了"python爬虫",暗示了该项目可能使用Python作为...

    Python-图像检索资源论文列表

    标题 "Python-图像检索资源论文列表" 暗示了这是一个关于使用Python进行图像检索的学术资源集合。图像检索是计算机视觉领域的一个重要分支,它涉及到如何有效地在大量图像库中寻找与查询图像相似的图像。这个资源...

    Python3入门视频教程百度网盘.pdf

    Python3是一种广泛应用于数据分析、机器学习、Web开发和自动化任务的高级编程语言。这个入门视频教程涵盖了从基础到进阶的各个重要知识点,适合初学者系统地学习Python3。 首先,第一章“Python入门导学”将引导你...

    基于Python核心技术的全栈搜索引擎设计源码

    本项目是一款基于Python核心技术的全栈搜索引擎源码,总计包含126个文件,涵盖了33个JavaScript文件、17个Python字节码文件、16个Python源代码文件、15个CSS样式表文件、11个HTML文件、6个XML文件、6个PNG图片文件、...

    python24期全套视频编程课程百度网盘

    python24期全套视频课程是一套涵盖了Python编程的基础知识、Web开发、爬虫、数据分析等方面的视频教程。该课程共包含60个课时,每个课时时长约为1-2小时。以下是该课程的详细介绍: 1. Python基础语法:介绍Python...

    python的毕业设计云笔记平台分析与设计.zip

    基于python的云笔记平台分析与设计python的毕业设计云笔记平台分析与设计。基于python的云笔记平台分析与设计python的毕业设计云笔记平台分析与设计。基于python的云笔记平台分析与设计python的毕业设计云笔记平台...

    Python视频教程百度网盘.pdf

    其课程设计紧跟市场和技术趋势,充分满足行业对Python工程师的需求,极大地提升了学员的就业竞争力。 总结起来,这个Python视频教程系列是千锋教育精心打造的,涵盖了Python的初级、高级及数据分析等多方面内容,...

    python百度网盘api纯代码分片上传目录文件实现

    python百度网盘纯代码分片上传目录文件 不依赖第三方, AppKey等信息需要自己去申请。然后获取code码就可以一直使用。

    基于Python协程的多引擎搜索引擎设计源码

    该项目为基于Python协程的多引擎搜索引擎设计源码,包含23个文件,涵盖11个PNG图片文件、5个Python源代码文件、3个Python字节码文件、1个Git忽略文件、1个许可协议文件、1个Markdown文件和1个文本文件。该工具专注于...

Global site tag (gtag.js) - Google Analytics