zoukankan      html  css  js  c++  java
  • 爬取电影天堂-二级页面抓取

    # 地址
      电影天堂 - 2019年新片精品 - 更多
    # 目标
      电影名称、下载链接

    # 分析
    *********一级页面需抓取***********
        1、电影名称
        2、电影链接

    *********二级页面需抓取***********
        1、下载链接

    实现步骤

    1、确定响应内容中是否存在所需抓取数据

     

    2、找URL规律

    第1页 :https://www.dytt8.net/html/gndy/dyzz/list_23_1.html
    第2页 :https://www.dytt8.net/html/gndy/dyzz/list_23_2.html
    第n页 :https://www.dytt8.net/html/gndy/dyzz/list_23_n.html

    3、写正则表达式

    1、一级页面正则表达式
       <table width="100%".*?<td width="5%".*?<a href="(.*?)".*?ulink">(.*?)</a>.*?</table>
    2、二级页面正则表达式
       <td style="WORD-WRAP.*?>.*?>(.*?)</a>

    4、代码实现

    from urllib import request
    import re
    from useragents import ua_list
    import time
    import random
    
    class FilmSkySpider(object):
      def __init__(self):
        # 一级页面url地址
        self.url = 'https://www.dytt8.net/html/gndy' 
                   '/dyzz/list_23_{}.html'
    
      # 获取html功能函数
      def get_html(self,url):
        headers = {
          'User-Agent':random.choice(ua_list)
        }
        req = request.Request(url=url,headers=headers)
        res = request.urlopen(req)
        # 通过网站查看网页源码,查看网站charset='gb2312'
        # 如果遇到解码错误,识别不了一些字符,则 ignore 忽略掉
        html = res.read().decode('gb2312','ignore')
    
        return html
    
      # 正则解析功能函数
      def re_func(self,re_bds,html):
        pattern = re.compile(re_bds,re.S)
        r_list = pattern.findall(html)
    
        return r_list
    
      # 获取数据函数 - html是一级页面响应内容
      def parse_page(self,html):
        re_bds = r'<table width="100%".*?<td width="5%".*?<a href="(.*?)".*?ulink">(.*?)</a>.*?</table>'
        # one_page_list: [('/html/xxx','幸福猎人'),()]
        one_page_list = self.re_func(re_bds,html)
        item = {}
        for film in one_page_list:
          item['name'] = film[1].strip()
          link = 'https://www.dytt8.net' + film[0]
          item['download'] = self.parse_two_page(link)
    
          # uniform: 浮点数,爬取1个电影信息后sleep
          time.sleep(random.uniform(1, 3))
    
          print(item)
    
      # 解析二级页面数据
      def parse_two_page(self,link):
        html = self.get_html(link)
        re_bds = r'<td style="WORD-WRAP.*?>.*?>(.*?)</a>'
        # two_page_list: ['ftp://xxxx.mkv']
        two_page_list = self.re_func(re_bds,html)
        download = two_page_list[0].strip()
    
        return download
    
      def main(self):
        for page in range(1,11):
          url = self.url.format(page)
          html = self.get_html(url)
          self.parse_page(html)
          # uniform: 浮点数
          time.sleep(random.uniform(1,3))
    
    if __name__ == '__main__':
      spider = FilmSkySpider()
      spider.main()
  • 相关阅读:
    【动画】看动画轻松理解「Trie树」
    浅析HTTP/2的多路复用
    HTTPS 详解
    PHP写时复制(Copy On Write)
    golang 几种字符串的拼接方式
    正排索引和倒排索引简单介绍
    传值还是传引用
    lvs与nginx区别
    Docker运行操作系统环境(BusyBox&Alpine&Debian/Ubuntu&CentOS/Fedora)
    原创-thanos组件(聚合多个prometheus组件)原理介绍
  • 原文地址:https://www.cnblogs.com/hooo-1102/p/12159824.html
Copyright © 2011-2022 走看看