美文网首页
【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