美文网首页
【Python爬虫作业】- 第16,17次,xpath整站抓取阳

【Python爬虫作业】- 第16,17次,xpath整站抓取阳

作者: 丽雁解 | 来源:发表于2018-01-09 00:27 被阅读0次
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)

相关文章

网友评论

      本文标题:【Python爬虫作业】- 第16,17次,xpath整站抓取阳

      本文链接:https://www.haomeiwen.com/subject/sdninxtx.html