由于平时看个电影,各种找资源太费劲了,而且好多磁力资源网站的广告那叫一个多啊,到处都是坑。一个不小心就跳转到什么 澳门金冠赌场,什么 性感荷官在线发牌的网站,整的搜个资源跟玩扫雷一下,真实令人头大。
所以我找了一些比较靠谱的磁力种子网站《【资源搜集】最新的磁力种子搜索网站汇总(亲测可用)》,用爬虫技术调用他们的搜索接口,直接提取他们的搜索结果,省的花时间花精力跟它们网页上的各种广告各种链接斗智斗勇。
我找了 17 个磁力种子网站,算下来应该是 17 篇爬虫教程,这个应该算是磁力种子爬虫系列吧,哈!如果有对这个系列爬虫感兴趣的朋友,请关注我的博客哦。
今天要爬的网站是 BT种子( https://btzzii.me/ )。
一、目标网站分析
按照惯例,先分析一波网页,伸手党如果懒得看,可以跳过直接去后面看代码实现部分。
有了上一篇《Python网络爬虫实战:磁力种子搜索站爬虫(一) BT蚂蚁》的分析,这个网站的爬取就要容易一些了,因为两个网站的页面结构,包含的数据,爬取的方式等,基本一致。
所以我们这个分析的部分比较简略的讲一下,详细的分析过程可以参考 BT蚂蚁爬虫 教程文章。
1. 页面中包含哪些数据以及如何获取
通过上面的截图我们可以得知,搜索结果列表页面中,我们可以获取到磁力种子的以下五个信息:
- 电影名称
- 时间,包括创建时间和最近下载时间
- 下载热度
- 文件大小
- 下载链接,包括磁力链接和迅雷链接
通过 F12 开发者工具,我们可以很快的定位到这些数据在网页中的存放位置,方便后续提取。
由截图可知,
每条磁力种子记录存放在一个 <div class="cili-item"> 下。其中,
电影名称存放在 <div class="item-title"> / <h3> / <a> 中,
创建时间存放在 <div class="item-bar"> / <span>(第2个 span ) / <b> 中,
文件大小存放在 <div class="item-bar"> / <span>(第3个 span ) / <b> 中,
下载热度存放在 <div class="item-bar"> / <span>(第4个 span ) / <b> 中,
磁力链接存放在 <div class="item-bar"> / <a>(第1个 a )中。
2. URL 构造规则分析
搜索结果每页仅展示 10 条,要想获取所有的磁力种子,就必须搞清楚,它是怎么翻页的。
跟 BT蚂蚁 一样,BT种子 网站也是通过 URL 来实现翻页,以及搜索结果排序的。
URL 示例: https://btzzii.me/bt/战狼2/rela-1.html
构成规则 :https://btzzii.me/bt/<搜索关键字>/<排序方式>-<页码>.html
其中,搜索关键字,指的是你要搜索的电影名,如战狼2。
排序方式有四种,热门下载(默认,default),最新收录(time),文件大小(size),相关下载(rela)。
页码从1开始计数,直到最大页码。
二、编码实现环节
依我的习惯,我将这个爬虫根据功能模块,拆分为了 5 个函数。
- fetchURL 函数,用来发起网络请求,
- getPageNum 函数,用来获取搜索结果的总页码,从而限定翻页参数的范围
- parseHTML 函数,用来解析网页,提取网页中的关键数据
- saveData 函数,用来将提取出的数据存储至本地文件中
- Main 函数,用来作为爬虫调度器。
相比于前面的 BT蚂蚁爬虫,这个爬虫主要改动的地方在于 getPageNum 函数,parseHTML 函数,和 main 函数。
毕竟不同的网站页面的具体解析方法会有些许的差异。
而其他部分,发起网络请求,保存数据的操作都是一样的,可以通用。
def parseHTML(html):
'''
功能:解析网页,提取需要的数据
参数:目标网页的 html 源码
返回:需要提取的数据
'''
#提取的数据有 title,date,hot,size,link
bsobj = bs4.BeautifulSoup(html,"html.parser")
movieList = bsobj.find_all("div", attrs = {"class" :"cili-item"})
movieInfo = []
for item in movieList:
movieItem = []
title = item.find("div", attrs = {"class": "item-title"}).h3.a.text
bar = item.find("div", attrs = {"class": "item-bar"}).find_all("span")
date = bar[1].b.text
hot = bar[3].b.text
size = bar[2].b.text
link = item.find("div", attrs = {"class": "item-bar"}).find_all("a")[0]["href"]
movieItem.append(title)
movieItem.append(date)
movieItem.append(hot)
movieItem.append(size)
movieItem.append(link)
movieInfo.append(movieItem)
return movieInfo
获取总页码数这里我多说一句,因为 BT蚂蚁 网站是有 “最后一页” 这个选项的,所以我们可以直接从页面中获取它的最后一页链接,然后提取总页码数。
而 BT种子 网站没有尾页这个按钮,只有上一页和下一页,也就是说,我们没有办法直接得知最后一页是第几页。
不过机智的我很快找到了解决方法,在搜索结果顶部,有这么一条数据,显示一共搜索到多少条磁力链接,而我们之前有分析知道,每一页展示 10 条结果,所以。。。直接总条数除以10,向上取整即可得到总页数。
def getPageNum(html):
'''
功能:获取总页码数
'''
bsobj = bs4.BeautifulSoup(html,"html.parser")
pageText = bsobj.find("div", attrs = {"id" : "wall"}).find_all("div")[0].span.text
itemNum = int(pageText.split(" ")[1])
page = int(itemNum / 10) + 1
return page
主函数这里控制整个爬虫的进程,由用户输入要搜索的电影名,然后根据规则构造初始 URL,获取搜索结果的总页数,然后循环爬取每一页的数据,将数据保存至本地 csv 文件中,直到爬取完成。
if __name__ == '__main__':
name = input("请输入要查找的电影名或番号:")
url = 'https://btzzii.me/bt/'+ name + '/default-1.html'
html = fetchURL(url)
page = getPageNum(html)
print(page)
path = "Data/BT种子/"
filename = name + ".csv"
for index in range(0,page):
index += 1
print("-----------第" + str(index) + "页----------")
url = 'https://btzzii.me/bt/'+ name + '/default-' + str(index) + '.html'
html = fetchURL(url)
data = parseHTML(html)
save_data(data,path,filename)
还是那句话,因为两个爬虫实在是太像了,唯一有点区别的地方也就是获取总页数的那儿。
所以我这儿没有赘述分析过程,也没有贴全部完整的代码(完整代码在 BT蚂蚁 那篇博客中已经有了,有需要的话自行把代码整合一下用),如果都这样了你还不会。。。。。。那在留言区评论一下,我手把手教你。
爬取结果展示
三、交流答疑区
2019年8月9日更新
bt 种子的这个域名 https://btzzii.me/ 好像变了,网站上不去了,导致爬虫也没有办法直接使用了。
新的域名我暂时还没有找到,如果读者朋友们,有知道 BT种子的最新网址的话,请评论区里留言,特别感谢。
上面的爬虫程序也并非完全不能用了,只需要在知道了 BT种子最新网址之后,替换代码中的网址 https://btzzii.me/ 即可。
如果文章中有哪里没有讲明白,或者讲解有误的地方,欢迎在评论区批评指正,或者扫描下面的二维码,加我微信,大家一起学习交流,共同进步。