当前位置:   article > 正文

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

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

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

实现步骤

  • 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

  • 1
  • 2
  • 3
  • 4
  • 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> 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 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,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()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 练习

    把电影天堂数据存入MySQL数据库 - 增量爬取

    # 思路
    # 1、MySQL中新建表 urltab,存储所有爬取过的链接的指纹
    # 2、在爬取之前,先判断该指纹是否爬取过,如果爬取过,则不再继续爬取
    
    
    • 1
    • 2
    • 3
    • 4

    代码实现

    # 建库建表
    create database filmskydb charset utf8;
    use filmskydb;
    create table request_finger(
    finger char(32)
    )charset=utf8;
    create table filmtab(
    name varchar(200),
    download varchar(500)
    )charset=utf8;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    from urllib import request
    import re
    from useragents import ua_list
    import time
    import random
    import pymysql
    from hashlib import md5
    
    
    class FilmSkySpider(object):
        def __init__(self):
            # 一级页面url地址
            self.url = 'https://www.dytt8.net/html/gndy/dyzz/list_23_{}.html'
            self.db = pymysql.connect('192.168.153.151', 'tiger', '123456', 'filmskydb', charset='utf8')
            self.cursor = self.db.cursor()
    
        # 获取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
    
        # 获取数据函数
        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
                # 生成指纹 - md5加密
                s = md5()
                s.update(two_url.encode())
                two_url_md5 = s.hexdigest()
                # 判断链接是否需要抓取
                if self.is_go_on(two_url_md5):
                    self.parse_two_page(two_url)
                    # 爬取完成此链接后将指纹放到数据库表中
                    ins = 'insert into request_finger values(%s)'
                    self.cursor.execute(ins, [two_url_md5])
                    self.db.commit()
                    # uniform: 浮点数,爬取1个电影信息后sleep
                    time.sleep(random.uniform(1, 3))
    
    
        def is_go_on(self, two_url_md5):
            # 爬取之前先到数据库中查询比对
            sel = 'select finger from request_finger where finger=%s'
            # 开始抓取之前,先来判断该链接之前是否抓取过
            result = self.cursor.execute(sel, [two_url_md5])
            if not result:
                return True
    
    
        # 解析二级页面数据
        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()
    
            ins = 'insert into filmtab values(%s,%s)'
            film_list = [
                item['name'], item['download']
            ]
            self.cursor.execute(ins, film_list)
            self.db.commit()
            print(film_list)
    
    
        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()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号