本文正在參加「Python主題月」,詳情查看 活動連接html
在開始以前,咱們須要將對應的環境等等須要裝配好。python
因爲本地已經存在docker,直接拉取JupyterHub
鏡像進行本地運行,使用JupyterHub
進行代碼編寫。docker
jovyan
密碼:hipaddle
。(密碼可進容器中:/etc/jupyter/jupyterhub_config.py
查看)咱們首要獲取的資源都是來源於電影天堂,咱們須要先熟悉頁面,同時咱們也須要查看頁面源碼元素,這裏的獲取是經過解析網頁源碼中元素進行獲取的。macos
url
的規律。obj
,進行記錄,繼續查找下一個電影元素位置。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)
複製代碼
......
# 【數據 - 電影標題】
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")
......
複製代碼
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
}
......
複製代碼
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()
複製代碼