碎片时间学Python-16抓取资源链接
前情回顾
前面章节,我们通过抓取电影榜单数据,获取到了电影名称的列表,这些数据我们该怎么用?所以我们梳理了手动搜索单个资源时的流程:
- 我们会将电影名称作为查询条件,在资源网站中进行搜索
- 如果在搜索结果页面有数据(即:电影名称查询到了资源),我们将点击进入详情界面
- 在详情界面复制获取资源的下载链接
Python实现
将上述手动过程通过程序化思维的方式转换为函数。
首先:我们需要一个函数,通过传入电影名称,就能类似搜索一般,返回搜索的结果。只不过这里我们返回的是一个详情界面的网址,因为手动过程中我们可以看到,搜索出来的电影信息都是可以点击打开另一个页面。如图红框:
代码实现:
def get_movie_detail_url(url, movie_name):
'''
获取电影详情页链接
:param url: 电影资源网站url
:param movie_name: 电影名称
:return: 返回电影详情页链接
'''
# post荷载的参数
data = {
'wd' : movie_name,
'p' : 1,
't': 'MIfVRL7daDheqyB0HbsPPw==', # 从浏览器调试工具中获取
}
# 拼接搜索url
search_url = url + '/search/'
# 通过requests库发送POST请求,进行电影搜索
response = requests.post(search_url, headers=headers, data=data, timeout=(5, 10))
# 对搜索结果进行网页解析
soup = BeautifulSoup(response.content, 'html.parser')
# 搜索结果网页中,是否查询到电影
movies = soup.find_all('div', class_='text_info')
# 如果没有查询到电影,返回空
detail_url = None
# 如果查询到电影
if len(movies) > 0:
# 取出第一个电影的链接,格式为 /detail/451.html
detail = movies[0].find('a').get('href')
if len(detail) > 0:
# 拼接完整的电影详情页链接
detail_url = url + detail
# 返回电影详情页链接
return detail_url
测试运行:
我们传入站点地址和一个电影的名称,结果如图:
这个链接就是电影详情页的地址
然后,需要将电影详情页中的下载链接获取到。我们对详情页的地址再通过requests发起一次,并通过bs4解析。就可以得到资源的下载链接。代码如下:
def get_movie_download_url(detail_url):
'''
获取电影资源的下载链接
:param detail_url: 电影详情页链接
:return: 返回电影资源的下载链接
'''
# 老样子,发起请求
detail_response = requests.get(detail_url, headers=headers, timeout=(5, 10))
if detail_response != None:
# 解析网页内容
detail_soup = BeautifulSoup(detail_response.content, 'html.parser')
# 分析网页html结构,找出下载链接对应的页面元素
downlist = detail_soup.find_all('div', class_='url-left')
# 过滤出ed2k 开头,且1080p的资源
download_link = ''
if len(downlist) > 0:
for item in downlist:
link = item.find('a').get('href')
if link.startswith('ed2k'):
if link.find('1080p') != -1:
download_link = link
break
return download_link
测试看一下效果:
至此,根据手动流程抽象出来的函数,功能正常。
最后
单条电影数据的流程测试通过。我们可以着手开始编写完整代码了。下一篇我们将串连整个流程,提供从抓取电影榜单数据,到获取下载链接的完整代码