“追新番”网站

追新番网站提供最新的日剧和日影下载地址,更新比较快。

个人比较喜欢看日剧,因此想着通过爬取该网站,做一个资源地图

可以查看网站到底有哪些日剧,并且随时可以下载。

资源地图

爬取的资源地图如下:

在linux系统上通过 ls | grep keywords 可以轻松找到想要的资源(windows直接搜索就行啦)

爬取脚本开发

1. 确定爬取策略

进入多个日剧,可以查看到每个剧的网址都是如下形式:

可以看出,每个日剧网页都对应一个编号。

因此我们可以通过遍历编号来爬取。

2. 获取日剧的名字

打开其中一个日剧的网页,查看标题的源代码如下:

可以看到,标题的标签ID为"pdtname", 我们只要获取该标签的文本即可获取日剧名字

通过beautifulSoup的接口,获取该标签内容(去除了名字中多余东西)

     # try get tv name
     tag_name = soup.find(id='pdtname')
     if None == tag_name:
         print('tv_{:0>4d}: not exist.'.format(num))
         return None

     # remove signs not need
     name = tag_name.get_text().replace(' ', '')
     try:
         name = name.replace(re.search('【.*】', name).group(0), '')
         name = name.replace(re.search('\(.*\)', name).group(0), '')
         name = name.replace('《', '')
         name = name.replace('》', '')
         name = name.replace('/', '')
     except :
         pass

3. 获取资源链接

在每个日剧页面中同时也包含了资源链接的地址,查看源代码如下:

可以看到资源链接使用了一个表块,并且表块的ID为"ajax_tbody"

其中每一集都是表的行元素,每一行又包含了几列来显示资源的各个信息

我们通过遍历表的元素来获取每一集的资源链接

    # try get tv resources list
    tag_resources = soup.find(id='ajax_tbody')
    if None == tag_resources:
        print('tv_{:0>4d}: has no resources.'.format(num))
        return None

    # walk resources
    for res in tag_resources.find_all('tr'):

        # get link tag
        tag_a = res.find('a')
        info = res.find_all('td')
        print('resource: ', tag_a.get_text())

        # get download link
        downlink = get_resources_link(session, tag_a.get('href'))

        # record resouces
        tv.resources.append([tag_a.get_text(), info[2].get_text(), downlink, ''])
        delay(1)

4. 获取下载链接

点击其中一个资源,进入下载链接页面,查看源代码如下

可以看到电驴的下载链接标签ID为"emule_url",因此我们只需要获取该标签的文本就可以了(磁力链接类似)

不过首先我们还需要先获取该下载页面,整体操作代码如下

def get_resources_link(session, url):
    ''' get tv resources download link  '''

    global domain
    res_url = domain + url

    # open resources page
    resp = session.get(res_url, timeout = 10)
    resp.raise_for_status()

    soup = page_decode(resp.content, resp.encoding)

    tag_emule = soup.find(id='emule_url')
    return tag_emule.get_text() if tag_emule != None else ''

5. 将资源下载链接保存到本地

其中,由于爬取所有日剧的下载链接比较耗时,前面做了判断可以只爬取标题,日后根据序号再爬取下载链接

def save_tv(tv):
    ''' save tv infomation on disk '''

    filename = os.path.join(os.path.abspath(save_dir), '{:0>4d}_{}.txt'.format(tv.num, tv.name))

    global only_catalog
    if only_catalog == True:
        with open(filename, 'a+') as f:
            pass
    else:
        with open(filename, 'w') as f:
            for info in tv.resources:
                f.write(os.linesep.join(info))
                f.write('========' + os.linesep)

以上,就是整个爬取脚本的开发过程。

欢迎关注我的代码仓库: https://gitee.com/github-18274965/Python-Spider

以后还会开发其余网站的爬取脚本。

附录

整体代码:

 #!/usr/bin/python3
 # -*- coding:utf-8 -*-

 import os
 import sys
 import re
 import requests
 from bs4 import BeautifulSoup
 from time import sleep

 # website domain
 domain = 'http://www.zhuixinfan.com/'

 # spide infomation save directory
 save_dir = './tvinfo/'

 # only tv catalog
 only_catalog = False

 class TVInfo:
     ''' TV infomation class'''

     def __init__(self, num, name):
         self.num = num
         self.name = name
         self.resources = []

 def delay(seconds):
     ''' sleep for secondes '''

     while seconds > 0:
         sleep(1)
         seconds = seconds - 1

 def page_decode(content, encoding):
     ''' decode page '''

     # lxml may failed, then try html.parser
     try:
         soup = BeautifulSoup(content, 'lxml', from_encoding=encoding)
     except:
         soup = BeautifulSoup(content, 'html.parser', from_encoding=encoding)

     return soup

 def open_home_page(session):
     ''' open home page first as humain being '''

     global domain
     home_url = domain + 'main.php'

     # open home page
     resp = session.get(home_url, timeout = 10)
     resp.raise_for_status()

     # do nothing

 def get_resources_link(session, url):
     ''' get tv resources download link  '''

     global domain
     res_url = domain + url

     # open resources page
     resp = session.get(res_url, timeout = 10)
     resp.raise_for_status()

     soup = page_decode(resp.content, resp.encoding)

     tag_emule = soup.find(id='emule_url')
     return tag_emule.get_text() if tag_emule != None else ''

 def spider_tv(session, num):
     ''' fetch tv infomaion '''

     global domain
     tv_url = domain + 'viewtvplay-{}.html'.format(num)

     # open tv infomation page
     resp = session.get(tv_url, timeout = 10)
     resp.raise_for_status()

     soup = page_decode(resp.content, resp.encoding)

     # try get tv name
     tag_name = soup.find(id='pdtname')
     if None == tag_name:
         print('tv_{:0>4d}: not exist.'.format(num))
         return None

     # try get tv resources list
     tag_resources = soup.find(id='ajax_tbody')
     if None == tag_resources:
         print('tv_{:0>4d}: has no resources.'.format(num))
         return None

     # remove signs not need
     name = tag_name.get_text().replace(' ', '')
     try:
         name = name.replace(re.search('【.*】', name).group(0), '')
         name = name.replace(re.search('\(.*\)', name).group(0), '')
         name = name.replace('《', '')
         name = name.replace('》', '')
         name = name.replace('/', '')
     except :
         pass

     print('tv_{:0>4d}: {}'.format(num, name))

     tv = TVInfo(num, name)

     global only_catalog
     if only_catalog == True:
         return tv

     # walk resources
     for res in tag_resources.find_all('tr'):

         # get link tag
         tag_a = res.find('a')
         info = res.find_all('td')
         print('resource: ', tag_a.get_text())

         # get download link
         downlink = get_resources_link(session, tag_a.get('href'))

         # record resouces
         tv.resources.append([tag_a.get_text(), info[2].get_text(), downlink, ''])
         delay(1)

     return tv

 def save_tv(tv):
     ''' save tv infomation on disk '''

     filename = os.path.join(os.path.abspath(save_dir), '{:0>4d}_{}.txt'.format(tv.num, tv.name)) 

     global only_catalog
     if only_catalog == True:
         with open(filename, 'a+') as f:
             pass
     else:
         with open(filename, 'w') as f:
             for info in tv.resources:
                 f.write(os.linesep.join(info))
                 f.write('========' + os.linesep)

 def main():

     start = 1
     end = 999

     if len(sys.argv) > 1:
         start = int(sys.argv[1])

     if len(sys.argv) > 2:
         end = int(sys.argv[2])

     global only_catalog
     s = input("Only catalog ?[y/N] ")
     if s == 'y' or s == 'Y':
         only_catalog = True

     # headers: firefox_58 on ubuntu
     headers = {
         'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:58.0)'
                 + ' Gecko/20100101 Firefox/58.0',
         'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
         'Accept-Language': 'zh-CN,en-US;q=0.7,en;q=0.3',
         'Accept-Encoding': 'gzip, deflate',
         }

     # create spider session
     with requests.Session() as s:

         try:
             s.headers.update(headers)
             open_home_page(s)
             for num in range(start, end+1):
                 delay(3)
                 tv = spider_tv(s, num)
                 if tv != None:
                     save_tv(tv)

         except Exception as err:
             print(err)
             exit(-1)

 if __name__ == '__main__':
     main()

Python爬虫: "追新番"网站资源链接爬取的更多相关文章

  1. Python爬虫教程-13-爬虫使用cookie爬取登录后的页面(人人网)(下)

    Python爬虫教程-13-爬虫使用cookie爬取登录后的页面(下) 自动使用cookie的方法,告别手动拷贝cookie http模块包含一些关于cookie的模块,通过他们我们可以自动的使用co ...

  2. [Python爬虫] 使用 Beautiful Soup 4 快速爬取所需的网页信息

    [Python爬虫] 使用 Beautiful Soup 4 快速爬取所需的网页信息 2018-07-21 23:53:02 larger5 阅读数 4123更多 分类专栏: 网络爬虫   版权声明: ...

  3. python爬虫学习之使用BeautifulSoup库爬取开奖网站信息-模块化

    实例需求:运用python语言爬取http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html这个开奖网站所有的信息,并且保存为txt文件和excel文件. 实 ...

  4. Python爬虫教程-12-爬虫使用cookie爬取登录后的页面(人人网)(上)

    Python爬虫教程-12-爬虫使用cookie(上) 爬虫关于cookie和session,由于http协议无记忆性,比如说登录淘宝网站的浏览记录,下次打开是不能直接记忆下来的,后来就有了cooki ...

  5. Python爬虫入门教程: 27270图片爬取

    今天继续爬取一个网站,http://www.27270.com/ent/meinvtupian/ 这个网站具备反爬,so我们下载的代码有些地方处理的也不是很到位,大家重点学习思路,有啥建议可以在评论的 ...

  6. Python爬虫实战(2):爬取京东商品列表

    1,引言 在上一篇<Python爬虫实战:爬取Drupal论坛帖子列表>,爬取了一个用Drupal做的论坛,是静态页面,抓取比较容易,即使直接解析html源文件都可以抓取到需要的内容.相反 ...

  7. Python爬虫小白入门(六)爬取披头士乐队历年专辑封面-网易云音乐

    一.前言 前文说过我的设计师小伙伴的设计需求,他想做一个披头士乐队历年专辑的瀑布图. 通过搜索,发现网易云音乐上有比较全的历年专辑信息加配图,图片质量还可以,虽然有大有小. 我的例子怎么都是爬取图片? ...

  8. Python爬虫入门教程 6-100 蜂鸟网图片爬取之一

    1. 蜂鸟网图片--简介 国庆假日结束了,新的工作又开始了,今天我们继续爬取一个网站,这个网站为 http://image.fengniao.com/ ,蜂鸟一个摄影大牛聚集的地方,本教程请用来学习, ...

  9. Python爬虫入门教程 5-100 27270图片爬取

    27270图片----获取待爬取页面 今天继续爬取一个网站,http://www.27270.com/ent/meinvtupian/ 这个网站具备反爬,so我们下载的代码有些地方处理的也不是很到位, ...

随机推荐

  1. C#调用C++动态库方法及动态库封装总结

    我只是粗浅的学习过一些C++语法, 变量类型等基础内容, 如有不对的地方还望指出. 如果你跟我一样, 对指针操作不了解, 对封装C++动态库头疼的话, 下面内容还是有帮助的. 转载请注明出处: htt ...

  2. ENode 2.0 - 整体架构介绍

    前言 今天是个开心的日子,又是周末,可以轻轻松松的写写文章了.去年,我写了ENode 1.0版本,那时我也写了一个分析系列.经过了大半年的时间,我对第一个版本做了很多架构上的改进,最重要的就是让ENo ...

  3. Weblogic11g下调WebService出现的一系列问题

    Weblogic11g下调WebService出现的一系列问题 今天在远程测试机上测试前天写的调用WebService接口方法,遇到的问题还真多啊! 首先说明一下weblogic加载jar包的顺序: ...

  4. php 将字符串中的连续多个空格转换为一个空格

    转载自:http://www.phpernote.com/php-function/633.html /** * 多个连续空格只保留一个 * * @param string $string 待转换的字 ...

  5. nyoj 456 邮票分你一半

    邮票分你一半 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述      小珂最近收集了些邮票,他想把其中的一些给他的好朋友小明.每张邮票上都有分值,他们想把这些邮票分 ...

  6. u盘启动openwrt

    opkg update opkg install kmod-usb-ohci kmod-usb2 kmod-fs-ext3 opkg install kmod-usb-storage reboot m ...

  7. 做的简单的一个静态web服务器,遇到个bug, 提示osError,这点一不小心就错了,特地记下来,加深记忆,socket须先绑定,再listen,如果是先listen再绑定,系统会自动分配一个端口,而程序绑定不了

    代码改正之前,先执行了listen,到了bind就报错:此程序只需将listen和改到bind后面即可 from socket import *from multiprocessing import ...

  8. [LeetCode] Second Minimum Node In a Binary Tree 二叉树中第二小的结点

    Given a non-empty special binary tree consisting of nodes with the non-negative value, where each no ...

  9. shader高级纹理学习总结

    最近看了shader的高级纹理 做个总结 复习! shader迟早是要拿下的

  10. 对java中的equals()方法的总结

    Java的基础学习总结--equals方法 一,等于方法介绍 1.1.通过下面的例子掌握等于的用法 1 package cn.galc.test; 2 3 public class TestEqual ...