皮爷不知道你们有多少人是喜欢看美剧?html
反正皮爷是个美剧迷,不能说狂,可是看美剧的时间也有差很少10年了。硬生生的把好多部剧都追到了完结。linux
最先之前,网上资源还不是很严的时候,找个美剧是十分简单的。但是最近几年,网络资源愈来愈严格,寻找美剧确实不容易,并且,新出的美剧,好比《生活大爆炸》S12E11集,若是刚出来,你下载是彻底没问题的。但是,好比你最近很忙,过了几周,你想起来你还有3集《生活大爆炸》没有看,心中暗自窃喜,一会儿看3集,是很爽的事儿。当你打开网页,复制网页资源连接到迅雷里,迅雷过一下子给你弹出个提示:“网络资源已经下架”。你是否是很蛋疼?这种状况通常就发生在新出的美剧,隔了几周以后,就会有这种资源下架的问题。程序员
还有一种状况比较烦恼,就是,若是你同时追着不少剧,你是否是天天都得查看这个剧是否是更新了?或者这个剧通常是周二更新,可是你想看熟肉(熟肉就是有中文字幕的意思)资源,但是熟肉资源并非周二更新以后马上更新,最快也得周三,但也有可能周四周五。那么这三天,你是谁不也得每天网站看一遍是否更新啊?若是你有15部美剧更新,那么你是否是得天天还少打开5个网页来查看呢?浏览网页会不会须要费时间?一周浏览这种网页的时间会不会不少?其实你只是须要一个下载地址而已,并不须要看其余无关的消息。正则表达式
那么今天,既然皮爷会用Python,会写爬虫,并且这种天天追美剧的工做,实际上是一种机械的重复劳动,不值得投入大量时间重复浪费在检查美剧是否更新上。因此,皮爷用Scrapy写了一个爬虫,将本身追的美剧,天天按期的用代码扫描如下,而后将结果发送到皮爷的邮箱里。而后天天只要检查本身邮箱里面是否有美剧的更新就能够了。数据库
这样搞起来,是否是很方便??是否是很省时间???啊哈哈哈哈。别着急,今天这篇文章讲的只是爬虫相关部分,还有一篇文章,专门讲皮爷怎么讲这个爬虫放到网上,而后让你们本身填写配置信息,而后供你们使用,到时候只须要填写,你要接受美剧更新信息的邮箱,还有你要追的美剧就能够了。到时候会放到 https://peekpa.tech 网站里面。小程序
首先,皮爷如今一直在用的一个美剧网站:bash
http://www.ttmeiju.vip/服务器
就是『每天美剧』,这里更新的比较快。苦于以前的人人美剧被强制关停了,如今的人人影视又老是打一枪换个地方,而电影天堂的跟新又太慢,因此,皮爷就一直在这个网站追美剧。不过有一点,这个网站的美剧熟肉和生肉资源都有,并且随着美剧资源注解被收拢,可能有些片子就没有熟肉资源,可是这是个联系听力学习英语的好机会啊。微信
废话很少说,咱们就先拿《生活大爆炸》这个美剧来分析吧。网络
进入到《生活大爆炸》的页面:
http://www.ttmeiju.vip/meiju/The.Big.Bang.Theory.html
能够看到关键信息有这么几点:
咱们一条一条来分析:
像这种信息类的网页,他的URL不可能太特别,应该是个别规整的。为了分析出规则,咱们在拿几个美剧的URL对比一下:
http://www.ttmeiju.vip/meiju/Supergirl.html
http://www.ttmeiju.vip/meiju/The.Blacklist.html
http://www.ttmeiju.vip/meiju/S.W.A.T.html
上面不难看出,URL前面的格式都同样,是http://www.ttmeiju.vip/meiju/
,而后跟着就是美剧的英文名字,中间空格用.
来链接,最后再加一个html
就能够了。
为何要知道这个?目的就是若是我同事追着好几个美剧,那么我只须要把英文名字告诉爬虫就能够了,而后爬虫会根据URL的规则,来访问对应的网页,从而爬取美剧信息。
这个地方,在网页里面,是一个class=seedlink
的 div
标签里面的东西。
为何要知道这个?这里面,最主要的东西我我的认为是更新日
,状态
还有更新日期
这几个变量。咱们能够根据更新日期来判断个人爬虫是否须要继续寻找下面的下载连接。若是当前爬虫运行的时候,发现上回运行时间要晚于更新日期,那么此次爬取就能够直接放弃,由于没有更新。
因此这里的变量咱们得要获取。用来判断爬虫是否爬取当前页面。
由于一部美剧,可能有好几季,那么若是他更新了,出了最新的集,咱们是否是得按照季来爬取?
并且,当你点击这几个标签的时候,
你就会发现上面的URL其实悄悄的发生了变化。就是在原来的 .html
以前,多了一个/
加数字,这个数字就是当前的季数。因此,若是想要复杂一点,爬取指定季的美剧,那么咱们就得想办法得到当前是哪一季,对不对?
这个也很简单啊,这个美剧打开的网页,首先默认显示的是当前季,只不过在URL里面没有加当前季的数字而已,想要获取数字,只须要在一个h3
的标签,class=curseason
里面的文本信息就好。
可是这里,咱们拿到的文本信息好比是下面的:
text = "第12季"复制代码
咱们想要获取数字,只须要用正则表达式取一下就能够:
seacon_num = re.findall("\d{1,3}",text)[0]复制代码
这里咱们主要是去取数字,长度为1位,2位或者3位的数字。通常来讲,一部美剧的季数,最多也就不可能超过三位数了。
这个咱们能够看到每一集美剧中间都有几个按钮,他们分别是不一样的下载方式。
这里咱们看到,主要有这么几点:
OK,有了这五点,咱们就就能够写爬虫来爬取数据了。爬虫写起来没什么难度,关键是下载地址那块,这里要把对应的文件地址都整理好。每个图标都对应的是一个下载连接,以下图:
这里,咱们的代码就是整合成这样:
tbody_list = soup.find_all(name="tbody", attrs={"id":"seedlist"})if len(tbody_list) != 0: tr_list = tbody_list[0].find_all(name="tr") for item in tr_list: td_list = item.find_all(name="td") item_time = td_list[-1].text.strip() item_time_cur = datetime.datetime.strptime(item_time, "%Y-%m-%d") diff_day = (item_time_cur - play_last_update_day).days if diff_day >= 0 or play_last_update_day is "": item_name = td_list[1].text.strip() name_list = item_name.split(" ") title_ch = name_list[0] s_and_e_list = re.findall("S\d{2}E\d{2}", item_name) video_clarity = re.findall("\d{3,4}p", item_name) video_season_episode = s_and_e_list[0] video_season = video_season_episode[1:3] video_episode = video_season_episode[4:6] item_download_td = td_list[2] item_download_url = item_download_td.find_all(name="a") item_download_ed2k = str() item_download_magnet = str() item_download_bt = str() item_download_baidu = str() for download_item in item_download_url: if "magnet:" in download_item['href']: item_download_magnet = download_item['href'] if "ed2k:" in download_item['href']: item_download_ed2k = download_item['href'] if ".torrent" in download_item['href']: item_download_bt = download_item['href'] if "pan.baidu" in download_item['href']: item_download_baidu = download_item['href'] item_size = td_list[-4].text.strip() item_subscribe = td_list[-3].text.strip()复制代码
最后,只须要生成一个Scrapy Item
,而后 yield
出来就能够了:
class TtmjVideoItem(scrapy.Item): video_title_ch = scrapy.Field() video_title_en = scrapy.Field() video_title_total = scrapy.Field() video_season = scrapy.Field() video_episode = scrapy.Field() video_season_episode = scrapy.Field() video_clarity = scrapy.Field() video_size = scrapy.Field() video_has_subscribe = scrapy.Field() video_publish_time = scrapy.Field() video_create_time = scrapy.Field() video_download_magnet = scrapy.Field() video_download_ed2k = scrapy.Field() video_download_baidu = scrapy.Field() video_download_bt = scrapy.Field()复制代码
这里穿插一下,在云服务器部署 MongoDB 的操做,在皮爷本身的公众号『皮爷撸码』里面就有专门的详细的手把手的教学文章,让你从小白到王者,征服部署MongoDB到云服务器上的骚操做,具体参考如下文章:
这些都是每一个人必须掌握的骚操做。
以前的步骤,咱们经过 yield TtmjVideoItem
已经把这个 Item 交到了咱们的pipeline里面。
在 Pipeline
里面,咱们须要在 def process_item(self, item, spider):
函数里面执行存入数据库的操做,同时,在 def close_spider(self, spider):
函数里面,执行发送操做,由于这个时候,咱们的爬虫即将关闭,咱们此时的数据就是现成的,因此选择在这个时候发送 Email 来会比较好。
发送 Email 这里我就很少说了,由于在以前的文章里面已经说过了,感兴趣的能够关注微信公众号『皮爷撸码』,查看往期精选,关于 Email 的文章,请查看这篇:
『基于云服务的网站种子采集器,还能发送到邮箱,你不来考虑一下?』
这篇文章里面有很详细的配置说明。皮爷在这里,把发送的邮件,封装成了 html
格式的文本。这样作就是方便在邮件里面,直接点击连接就能够下载了。
Scrapy爬虫都是能够部署到云服务器上的。 为啥要这么搞? 由于这样很方便啊,你能够利用linux的固定执行命令,天天定点执行你的Scrapy爬虫就能够了,并且,还很省心,再也不须要天天为了看电影而打开 IDE 或者 终端,去输入运行 Python 程序的命令。简单的一步到位,今后解放双手,何乐而不为呢。
关于部署 Scrapy 爬虫到云服务器上的文章,皮爷以前也很详细的写过,详情能够参考如下文章,这篇文章也在皮爷的公众号里面,查看『皮爷撸码』公众号的文章历史里面就有:
『【压岁钱来买服务器玩云爬虫】把Scrapy爬虫一步一步经过Scrapyd部署到腾讯云上(阿里云同理)』
最后,给你们看一下皮爷的成果,在皮爷邮箱里面:
打开以后,邮件长这个样子:
若是想下载的话,就直接点击连接就能够了。这样就不须要再天天抽时间去网站上看是否更新了,是否有熟肉资源啥的。天天爬虫定点执行,就会将没有更新的资源通通发送到你的邮箱里。你天天只须要作,打开邮箱,点击下载就能够了。
『代码改变生活,这话不假』
获取文章代码,只须要关注『皮爷撸码』,回复『代码』,便可找到你想要的代码。这么硬核的公众号,我本身从心里喜欢。
这篇文章还有个『下』篇,下回在写,主要就是怎样将这个爬虫部署到:https://peekpa.tech
上,而后服务更多的同窗。固然了,皮爷也有一个想法,就是结合小程序来作美剧的追剧。这个点子很不错,凭借『六十四卦』小程序的经验,我以为这个软件不难。之后给你们搞出来。
『皮爷撸码』是个很硬核的公众号,我写了不少爬虫的文章,我会慢慢分享给你们,并且和你们说一点,若是写爬虫写的好,是真的能赚到钱的,由于如今是信息时代,网络信息纷繁复杂,天天咱们耳朵听的,眼睛看到的信息就成千上万,古代都说学富五车,其实远远没有咱们如今面临的信息量大。如何高效的处理信息,抓住重点,避免重复阅读或者重复操做而浪费时间,这个是很须要技术的。并且,如今社会,对于我的而言什么最值钱?固然是时间。你天天刷抖音,逛微博,看点知乎,觉得知道了些常识,就认为本身学习了东西,其实不是的。写爬虫的目的其实有一部分就是能够过滤信息,节省时间。因此,身为一个程序员,我是从心里真真切切的感受到,写代码是一件颇有意思的事儿。
后续皮爷还会有更多的东西给你们分享,点子有不少,并且都颇有意思,很具备实战性。很少说了,若是以为皮爷这里干货不少,那就麻烦转发,分享,点击个好看呗。皮爷谢谢你们了。
关注『皮爷撸码』,你,不吃亏。