项目三:爬取视频磁力链接
标签(空格分隔): 爬虫 BeautifulSoup
—具体技术实现原理类似项目二
1. 项目任务分析
类似上一个小项目中爬取图片的技术原理,本次小项目尝试对相同网站上的可供下载视频的磁力链接进行爬取
2. 项目功能分析
2.1 爬取视频列表
网页上视频信息如上图所示,所以要先定义一个模块来获取如图所示的视频列表信息,查看网页源代码如下图所示
显然每一个视频名称保存在a.string
即标签的非属性字符串里,而视频所在链接保存在a.attrs['href']
里,那么可以很容易得到视频名称和视频所在链接的信息,将这些信息保存在一个字典里,共后续爬取使用
2.2 爬取视频磁力链
根据上一步得到的视频链接,跳转至相应页面的结果如下图所示
可以看到每个视频页面上有磁力链,所以可以查看源代码来找到磁力链的具体获取方式,查看源代码如下图所示
通过content = soup.find('div', attrs={'class':'content'})
语句来找到包含有磁力链接的标签,因为该磁力链接没有保存在某个字标签的非属性字符串里,也不是某个子标签的某种属性,所以之前的方法不适用。那么这里可以使用tempList = content.text.split('\n')
得到content
标签里面包含的所有字符串并保存在列表中,再利用正则表达式对符合一定规则的列表各个元素进行匹配,得到正确的磁力链
2.3 文件存取
在得到视频的名称与磁力链并保存在字典里之后,需要将字典内容保存在文本文件中,本次小项目就事先建立好一个文本文件,直接将字典里的内容写入该文件即可。这个模块中的重点是对字典的遍历
3. 完整代码
import requests
from bs4 import BeautifulSoup
import re
def getHTMLText(url):
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
def getMagnetList(magnetURL, magnetsList):
html = getHTMLText(magnetURL)
soup = BeautifulSoup(html, 'html.parser')
# 抽取包含磁力文件名称和链接的标签,保存在列表里
title = soup.find_all('a', attrs={'class':'title'})
for t in title:
try:
link = 'http://www.99rblc.com' + t.attrs['href']
magnetsList.append(link)
except:
continue
def getMagnetInfo(magnetsDict, magnetsList):
for magnet in magnetsList:
html = getHTMLText(magnet)
try:
if html == "":
continue
soup = BeautifulSoup(html, 'html.parser')
# 磁力文件名称
title = soup.find('div', attrs={'class':'title'})
magnetName = title.text.split('\n')[1]
print( "已爬到资源 : " + magnetName + '\n' )
print( "继续爬取该资源的磁力链..." + '\n' )
# 磁力链接内容
content = soup.find('div', attrs={'class':'content'})
tempList = content.text.split('\n')
for item in tempList:
if re.findall(r"^magnet[A-Za-z0-9:?= ]+$", item) == []:
continue
magnetContent = re.findall(r"^magnet[A-Za-z0-9:?= ]+$", item)[0]
print( "爬到磁力链为 : " + magnetContent + '\n\n\n' )
magnetsDict[magnetName] = magnetContent
except:
continue
def saveMagnet(magnetsDict):
path = 'D://MagnetInfo//magnet.txt'
f = open(path, 'a')
for key in magnetsDict:
f.write( "电影名称 : " + key + '\n' )
f.write( "磁力链接 : " + magnetsDict[key] + '\n\n\n' )
f.close()
def main():
depth = 5
for i in range(depth):
print( "开始爬取第" + str(i+1) + "页" + '\n' )
magnetURL = 'http://www.99rblc.com/ozgq/38/' + str(i+1) + '.htm'
magnetsList = []
magnetsDict = {}
getMagnetList(magnetURL, magnetsList)
getMagnetInfo(magnetsDict, magnetsList)
saveMagnet(magnetsDict)
main()