from lxml import etree
import requests
import os
from multiprocessing import pool
# -----------------------------------------------
# 一、xpath过滤标签练习
# 学完视频将阳光电影网首页导航栏前9个菜单url抓取,输出结果为可以正常访问的url, 并过滤掉"经典影片"的菜单url
def get_pageUrl(root_url):
url_list = []
req=requests.get(root_url)
req.encoding='gb2312'
html=req.text
selector=etree.HTML(html)
infos=selector.xpath('//*[@id="menu"]/div/ul//li[position()<10]/a')
for info in infos:
menus_text=info.xpath('text()')
menus_href=info.xpath('@href')
if len(menus_text[0])>0 and menus_text[0]!='经典影片':
menu_text=menus_text[0]
menu_href=root_url+menus_href[0]
# print(menu_text,menu_href)
# ------------------------------------------------------------------------------------------------------------------
# 二、循环内请求解析
# 对第一题解析出来的url进行请求,解析出每个菜单的分页总数,每个菜单的id,并构造出全部的菜单分页请求url,全部存进一个url_list变量,url_list变量为列表
req2=requests.get(menu_href)
req2.encoding='gb2312'
html2=req2.text
selector2=etree.HTML(html2)
page_info=selector2.xpath('//div[@class="x"]//text()')[1].split('/')[0].replace('共','').replace('页','').strip()
list_id=selector2.xpath('//div[@class="x"]//a/@href')[0].split('.')[0].split('_')[1]
# print(menu_text,menu_href,'TotalPage:',page_info,'list_id:',list_id)
for ipage in range(int(page_info)):
page_url=menu_href.replace('index.html','')+'list_'+list_id+'_'+str(ipage+1)+'.html'
item = {} #每个元素为字典类型
item['menu_name'] = menu_text
item['page_url'] = page_url
url_list.append(item)
return url_list
# 一、解析电影url
# 请求15题构造出的每个电影菜单的分页url,解析出每个电影url
# 二、xpath解析电影资源
# 对第一题解析出来的电影url进行请求,解析出最终的电影名称 电影下载地址
# 三、对代码进行分装成函数
def get_source(url_list):
i=0 #每个menu下的影片文件编号,便于调试
for url in url_list:
base_dir=os.path.abspath(__file__)
parent_dir=os.path.dirname(base_dir)
menu_dir=os.path.join(parent_dir,url['menu_name'])
if os.path.isdir(menu_dir):
pass
else:
print(menu_dir)
os.mkdir(menu_dir)
os.chdir(menu_dir)
req3=requests.get(url['page_url'])
req3.encoding='gb2312'
html3=req3.text
selector3=etree.HTML(html3)
movies_url=selector3.xpath('//div[@class="co_content8"]//a[@class="ulink"]/@href')
for movie_url in movies_url:
movie_url=root_url+movie_url
req4=requests.get(movie_url)
req4.encoding='gb2312'
html4=req4.text
selector4=etree.HTML(html4)
movie_names=selector4.xpath('//div[@class="title_all"]/h1/font/text()')
movie_sources=selector4.xpath('//td[@style="WORD-WRAP: break-word"]/a/@href')
movie_name = movie_names[0]
if len(movie_sources)>0: #可能存在多个source,因此需要判断,并均保存下来
i=i+1
filename=str(i)+'_'+movie_name.split('《')[1].split('》')[0].replace('/','_')+'.txt'
ff = open(filename, 'w', encoding='utf-8')
for movie_source in movie_sources:
print(url['page_url'],movie_url, movie_name, movie_source,filename)
ff.write(movie_name+'\n')
ff.write(movie_url+'\n')
ff.write(movie_source+'\n')
ff.close()
# 一、os创建目录用法
# 二、函数传参
# 三、多进程调用
if __name__=='__main__':
root_url = 'http://www.ygdy8.com'
url_list=get_pageUrl(root_url)
get_source(url_list)
网友评论