Youtube这个网站,我很早以前就想拿下它。但是它又和其他一般的网站不一样。
它只有左边几个简单的频道:音乐,体育,游戏,电影,新闻,直播,里面只有很少的一部分视频。所以,通过Youtube的精选频道没办法作为入口,爬取整站。怎样可以爬取整站,我也没什么思路。后来有一天,我的小组leader和我说:“要不就以单个视频为入口,从里面找寻其他视频作为新的入口,就像nutch一样。”我当时灵光一闪,觉得可行。
像上图看到的一样,我打开一个视频,然后找到右边的视频链接作为新的入口,打开,再找新的视频链接。就这样辐射开来,钻遍Youtube的每一个角落,当然这只是我的YY。
这个代码不难写,就两个函数的事情,我用的是scrapy框架
#writer: LeonYao
#caution:别复制我的代码了,跑不起来的,还有其他项目文件我没放出来,给你看我的思路而已,懂的自己改下就可以跑起来了。
#May I have your attention pls:别找我要代码了,自己try写一下,又不难
import scrapy
from bs4 import BeautifulSoup
from Youtube_ultra.utils import MGClient
class Youtube_ultra(scrapy.Spider):
name = "ultra"
start_urls=['https://www.youtube.com/watch?v=Ol58Mo98AOE']
def __init__(self):
self.db = MGClient().get_mongo_client()
def parse(self, response):
soup = BeautifulSoup(response.body,'html.parser')
for i in soup.find('div',id='watch7-sidebar-modules').find_all('a'):
url = 'https://www.youtube.com/' + i.get('href')
if not self.db.Youtube_test.find_one({'source_url':url}):
self.db.Youtube_test.insert({'source_url':url})
print '>>>>>>>>>>>>>>>>>insert success<<<<<<<<<<<<<<<'
yield scrapy.Request(url=url,callback=self.parse_again)
else:
print '>>>>>>>>>>>>>>>>>>alread exists<<<<<<<<<<<<<<'
def parse_again(self,response):
soup = BeautifulSoup(response.body,'html.parser')
for i in soup.find('div',id='watch7-sidebar-modules').find_all('a'):
url = 'https://www.youtube.com/' + i.get('href')
if not self.db.Youtube_test.find_one({'source_url':url}):
self.db.Youtube_test.insert({'source_url':url})
print '>>>>>>>>>>>>>>>>>insert success<<<<<<<<<<<<<<<'
yield scrapy.Request(url=url,callback=self.parse)
else:
print '>>>>>>>>>>>>>>>>>>alread exists<<<<<<<<<<<<<<'
然后我就把整个爬虫怼到我的香港服务器去,让他跑一个晚上看看效果。今早回来上班,看了下数据库
而且爬虫依然在运行,到这里觉得我的思路初步可行。正当我开始幻想着以后再也不用人肉手动的找频道爬取视频的时候。。。我点开了里面的一些内容。。。。发现了很危险的事
好多真主阿拉的教育视频。。。。如果我把这些都怼到公司的APP去。。。。。接下来应该就是蹲几年的问题了吧。。。我还是继续去做人肉爬虫算了。。。