zoukankan      html  css  js  c++  java
  • Spider -- 多级页面 爬取

    # 整体思路 
    1、爬取一级页面,提取 所需数据+链接,继续跟进
    2、爬取二级页面,提取 所需数据+链接,继续跟进
    3、... ... 
    # 代码实现思路
    1、所有数据最终都会在一级页面遍历每条数据时全部拿到
    2、避免重复代码 - 请求、解析需定义函数

    电影天堂二级页面抓取案例

    领取任务

    # 地址
    电影天堂 - 2019年新片精品 - 更多
    # 目标
    电影名称、下载链接
    ​
    # 分析
    *********一级页面需抓取***********
            1、电影详情页链接
            
    *********二级页面需抓取***********
            1、电影名称
                2、电影下载链接

    实现步骤

    • 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">.*?</table>
    2、二级页面正则表达式
       <div class="title_all"><h1><font color=#07519a>(.*?)</font></h1></div>.*?<td style="WORD-WRAP.*?>.*?>(.*?)</a> 
    • 4、代码实现

    from urllib import request
    import re
    from useragents import ua_list  # 自己写的一个模块,提供 随机 User-Agent
    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,one_url):
        html = self.get_html(one_url)
        re_bds = r'<table width="100%".*?<td width="5%".*?<a href="(.*?)".*?ulink">.*?</table>'
        # one_page_list: ['/html/xxx','/html/xxx','/html/xxx']
        one_page_list = self.re_func(re_bds,html)
    ​
        for href in one_page_list:
          two_url = 'https://www.dytt8.net' + href
          self.parse_two_page(two_url)
          # uniform: 浮点数,爬取1个电影信息后sleep
          time.sleep(random.uniform(1, 3))
    ​
    ​
      # 解析二级页面数据
      def parse_two_page(self,two_url):
        item = {}
        html = self.get_html(two_url)
        re_bds = r'<div class="title_all"><h1><font color=#07519a>(.*?)</font></h1></div>.*?<td style="WORD-WRAP.*?>.*?>(.*?)</a>'
        # two_page_list: [('名称1','ftp://xxxx.mkv')]
        two_page_list = self.re_func(re_bds,html)
    ​
        item['name'] = two_page_list[0][0].strip()
        item['download'] = two_page_list[0][1].strip()
    ​
        print(item)
    ​
    ​
      def main(self):
        for page in range(1,201):
          one_url = self.url.format(page)
          self.parse_page(one_url)
          # uniform: 浮点数
          time.sleep(random.uniform(1,3))
    ​
    if __name__ == '__main__':
      spider = FilmSkySpider()
      spider.main()

     

  • 相关阅读:
    上周热点回顾(6.5-6.11)团队
    云计算之路-阿里云上:14:20-14:55博客后台2台服务器都CPU 100%引发的故障团队
    牛客网Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤
    牛客网Java刷题知识点之equals和hashcode()
    spark运行时出现Neither spark.yarn.jars nor spark.yarn.archive is set错误的解决办法(图文详解)
    大数据的结构类型(结构化数据、半结构化数据、准结构化数据、非结构化数据)
    Spark 1.6.2 + Beam 2.0.0读取Mongodb数据进行相应逻辑处理
    Docker的基本概念
    Docker的基本构架
    Docker概念学习系列之Docker是什么?(1)
  • 原文地址:https://www.cnblogs.com/gengyufei/p/12643294.html
Copyright © 2011-2022 走看看