影片資源如何更快獲取|Python 主題月

本文正在參加「Python主題月」,詳情查看 活動連接html

準備工做

在開始以前,咱們須要將對應的環境等等須要裝配好。python

因爲本地已經存在docker,直接拉取JupyterHub鏡像進行本地運行,使用JupyterHub進行代碼編寫。docker

  1. 首先去對應網站拉取對應鏡像。 image.png
  2. 將對應鏡像進行運行。 image.png
  3. 經過瀏覽器進行打開登陸。 帳號:jovyan 密碼:hipaddle。(密碼可進容器中:/etc/jupyter/jupyterhub_config.py查看)

代碼編寫

咱們首要獲取的資源都是來源於電影天堂,咱們須要先熟悉頁面,同時咱們也須要查看頁面源碼元素,這裏的獲取是經過解析網頁源碼中元素進行獲取的。macos

分析需求

  1. 首選查看首頁中,電影分頁列表url的規律。
  2. 進入每一個電影的詳情,查看咱們所須要的元素的在網頁源碼中的位置。
  3. 將每一個電影元素組裝爲一個obj,進行記錄,繼續查找下一個電影元素位置。

編寫代碼

  1. 首先,咱們須要將咱們須要循環獲取文件頁碼固定好:
for index in range(2, 3):
		# 1.電影列表的地址url
		url = base_url.format(index)
		# 2.獲取當前頁面包含的全部電影【詳情地址】
		detail_urls = get_detail_urls(url)
		# 3.解析每一項電影的詳情頁面
		for key, detail_url in enumerate(detail_urls):
			# print('索引:' + str(key) + ',地址:' + detail_url)
			# print('解析詳情頁面:' + detail_url)
			film = parse_detail_page(detail_url)
			films.append(film)
		# 4.每爬取一頁,就休眠2秒鐘
		time.sleep(1)
複製代碼
  1. 針對詳情頁獲取資源
......
        # 【數據 - 電影標題】 
                title = html_element.xpath('//div[@class="title_all"]//font[@color="#07519a"]/text()')[0]

	# 獲取zoom標籤
	zoom_element = html_element.xpath('//div[@id="Zoom"]')[0]

	# 【數據 - 電影封面和電影截圖】
	imgs = zoom_element.xpath(".//img/@src")
                ......
複製代碼
  1. 將對應所獲取的信息進行組裝
film = {
		'title': title,
		'cover': cover,
		'screen_shot': screen_shot,
		'year': year,
		'country': country,
		'type': type,
		'rating': rating,
		'duration': duration,
		'director': director,
		'actors': actors,
		'desc': desc,
		'download_url': download_url
	}
        ......
複製代碼

效果截圖

image.png

完整代碼:

import requests
from lxml import etree
import time

# 主頁地址
BASE_DOMAIN = 'http://www.dytt8.net'

HEADERS = {
	'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36',
}


def get_detail_urls(url):
	response = requests.get(url, headers=HEADERS)
	html_element = etree.HTML(response.text)
	# 【數據 - 字符串列表】詳情頁面地址
	detail_urls = html_element.xpath('//table[@class="tbspan"]//a/@href')
	# 過濾掉【綜合電影】致使的髒數據
	detail_urls_new = detail_urls
	for index, detail_url in enumerate(detail_urls_new):
		if detail_url == '/html/gndy/jddy/index.html':
			detail_urls.remove(detail_url)
	# 組裝詳情頁面的地址
	detail_urls = map(lambda x: BASE_DOMAIN + x, detail_urls)
	return detail_urls


def parse_detail_page(detail_url):
	response = requests.get(detail_url, headers=HEADERS)
	text = response.content.decode('gb18030')
	html_element = etree.HTML(text)

	# 【數據 - 電影標題】 
	title = html_element.xpath('//div[@class="title_all"]//font[@color="#07519a"]/text()')[0]

	# 獲取zoom標籤
	zoom_element = html_element.xpath('//div[@id="Zoom"]')[0]

	# 【數據 - 電影封面和電影截圖】
	imgs = zoom_element.xpath(".//img/@src")

	# 注意:爲了不髒數據致使應用掛掉,提早初始化
	year, country, type, rating, duration, director, actors, cover, screen_shot, download_url = '', '', '', '', '', '', '', '', '', ''

	if len(imgs) > 0:
		cover = imgs[0]

	# 【數據 - 電影截圖】
	if len(imgs) > 1:
		screen_shot = imgs[1]

	# 獲取div[@id='zoom']標籤下面的全部的文本數據【子孫全部的text文本數據】
	infos = zoom_element.xpath('.//text()')

	# 解析具體內容的函數
	def parse_info(info, rule):
		return info.replace(rule, '').strip()

	# 遍歷infos每一項去獲取有用的數據
	for key, info in enumerate(infos):

		# print('遍歷第{}項'.format(key))
		# print(info)
		# print('結束==================================================')

		if info.startswith('◎年  代'):
			# 年代
			year = parse_info(info, '◎年  代')
		elif info.startswith('◎產  地'):
			# 產地
			country = parse_info(info, '◎產  地')
		elif info.startswith('◎類  別'):
			# 類別
			type = parse_info(info, '◎類  別')
		elif info.startswith('◎豆瓣評分'):
			# 豆瓣評分
			rating = parse_info(info, '◎豆瓣評分')
		elif info.startswith('◎片  長'):
			# 片長
			duration = parse_info(info, '◎片  長')
		elif info.startswith('◎導  演'):
			# 導演
			director = parse_info(info, '◎導  演')
		elif info.startswith('◎主  演'):
			# 演員【第一個演員】
			actor_first = parse_info(info, '◎主  演')

			actors = [actor_first]

			# 繼續往下面遍歷
			for index in range(key + 1, len(infos)):
				item = infos[index].strip()
				if item.startswith('◎簡  介'):
					break
				# 獲取全部的演員
				# print(item)
				actors.append(item)
		elif info.startswith('◎簡  介'):
			# desc = parse_info(info, '◎簡  介')

			for index in range(key + 1, len(infos)):
				item = infos[index].strip()
				if item.startswith('【下載地址】'):
					break
				desc = item

	print(detail_url)

	# 下載地址
	if len(html_element.xpath('//td[@bgcolor="#fdfddf"]/a/text()')) > 0:
		download_url = html_element.xpath('//td[@bgcolor="#fdfddf"]/a/text()')[0]
	elif len(html_element.xpath('//td[@bgcolor="#fdfddf"]/text()')) > 0:
		download_url = html_element.xpath('//td[@bgcolor="#fdfddf"]/text()')[0]

	film = {
		'title': title,
		'cover': cover,
		'screen_shot': screen_shot,
		'year': year,
		'country': country,
		'type': type,
		'rating': rating,
		'duration': duration,
		'director': director,
		'actors': actors,
		'desc': desc,
		'download_url': download_url
	}

	return film


def spider():
	base_url = 'http://www.dytt8.net/html/gndy/dyzz/list_23_{}.html'
	films = []
	for index in range(2, 3):
	
		url = base_url.format(index)
		detail_urls = get_detail_urls(url)
		for key, detail_url in enumerate(detail_urls):
			# print('索引:' + str(key) + ',地址:' + detail_url)
			# print('解析詳情頁面:' + detail_url)
			film = parse_detail_page(detail_url)

			films.append(film)
		time.sleep(1)

	print(films)

if __name__ == '__main__':
	spider()
複製代碼
相關文章
相關標籤/搜索