Python爬虫: "追新番"网站资源链接爬取

“追新番”网站

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

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

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

资源地图

爬取的资源地图如下:

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

爬取脚本开发

1. 确定爬取策略

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

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

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

2. 获取日剧的名字

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

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

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

 1     # try get tv name
 2     tag_name = soup.find(id=‘pdtname‘)
 3     if None == tag_name:
 4         print(‘tv_{:0>4d}: not exist.‘.format(num))
 5         return None
 6
 7     # remove signs not need
 8     name = tag_name.get_text().replace(‘ ‘, ‘‘)
 9     try:
10         name = name.replace(re.search(‘【.*】‘, name).group(0), ‘‘)
11         name = name.replace(re.search(‘\(.*\)‘, name).group(0), ‘‘)
12         name = name.replace(‘《‘, ‘‘)
13         name = name.replace(‘》‘, ‘‘)
14         name = name.replace(‘/‘, ‘‘)
15     except :
16         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

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

附录

整体代码:

  1 #!/usr/bin/python3
  2 # -*- coding:utf-8 -*-
  3
  4 import os
  5 import sys
  6 import re
  7 import requests
  8 from bs4 import BeautifulSoup
  9 from time import sleep
 10
 11 # website domain
 12 domain = ‘http://www.zhuixinfan.com/‘
 13
 14 # spide infomation save directory
 15 save_dir = ‘./tvinfo/‘
 16
 17 # only tv catalog
 18 only_catalog = False
 19
 20 class TVInfo:
 21     ‘‘‘ TV infomation class‘‘‘
 22
 23     def __init__(self, num, name):
 24         self.num = num
 25         self.name = name
 26         self.resources = []
 27
 28
 29 def delay(seconds):
 30     ‘‘‘ sleep for secondes ‘‘‘
 31
 32     while seconds > 0:
 33         sleep(1)
 34         seconds = seconds - 1
 35
 36 def page_decode(content, encoding):
 37     ‘‘‘ decode page ‘‘‘
 38
 39     # lxml may failed, then try html.parser
 40     try:
 41         soup = BeautifulSoup(content, ‘lxml‘, from_encoding=encoding)
 42     except:
 43         soup = BeautifulSoup(content, ‘html.parser‘, from_encoding=encoding)
 44
 45     return soup
 46
 47 def open_home_page(session):
 48     ‘‘‘ open home page first as humain being ‘‘‘
 49
 50     global domain
 51     home_url = domain + ‘main.php‘
 52
 53     # open home page
 54     resp = session.get(home_url, timeout = 10)
 55     resp.raise_for_status()
 56
 57     # do nothing
 58
 59 def get_resources_link(session, url):
 60     ‘‘‘ get tv resources download link  ‘‘‘
 61
 62     global domain
 63     res_url = domain + url
 64
 65     # open resources page
 66     resp = session.get(res_url, timeout = 10)
 67     resp.raise_for_status()
 68
 69     soup = page_decode(resp.content, resp.encoding)
 70
 71     tag_emule = soup.find(id=‘emule_url‘)
 72     return tag_emule.get_text() if tag_emule != None else ‘‘
 73
 74
 75 def spider_tv(session, num):
 76     ‘‘‘ fetch tv infomaion ‘‘‘
 77
 78     global domain
 79     tv_url = domain + ‘viewtvplay-{}.html‘.format(num)
 80
 81     # open tv infomation page
 82     resp = session.get(tv_url, timeout = 10)
 83     resp.raise_for_status()
 84
 85     soup = page_decode(resp.content, resp.encoding)
 86
 87     # try get tv name
 88     tag_name = soup.find(id=‘pdtname‘)
 89     if None == tag_name:
 90         print(‘tv_{:0>4d}: not exist.‘.format(num))
 91         return None
 92
 93     # try get tv resources list
 94     tag_resources = soup.find(id=‘ajax_tbody‘)
 95     if None == tag_resources:
 96         print(‘tv_{:0>4d}: has no resources.‘.format(num))
 97         return None
 98
 99     # remove signs not need
100     name = tag_name.get_text().replace(‘ ‘, ‘‘)
101     try:
102         name = name.replace(re.search(‘【.*】‘, name).group(0), ‘‘)
103         name = name.replace(re.search(‘\(.*\)‘, name).group(0), ‘‘)
104         name = name.replace(‘《‘, ‘‘)
105         name = name.replace(‘》‘, ‘‘)
106         name = name.replace(‘/‘, ‘‘)
107     except :
108         pass
109
110     print(‘tv_{:0>4d}: {}‘.format(num, name))
111
112     tv = TVInfo(num, name)
113
114     global only_catalog
115     if only_catalog == True:
116         return tv
117
118     # walk resources
119     for res in tag_resources.find_all(‘tr‘):
120
121         # get link tag
122         tag_a = res.find(‘a‘)
123         info = res.find_all(‘td‘)
124         print(‘resource: ‘, tag_a.get_text())
125
126         # get download link
127         downlink = get_resources_link(session, tag_a.get(‘href‘))
128
129         # record resouces
130         tv.resources.append([tag_a.get_text(), info[2].get_text(), downlink, ‘‘])
131         delay(1)
132
133     return tv
134
135
136 def save_tv(tv):
137     ‘‘‘ save tv infomation on disk ‘‘‘
138
139     filename = os.path.join(os.path.abspath(save_dir), ‘{:0>4d}_{}.txt‘.format(tv.num, tv.name))
140
141     global only_catalog
142     if only_catalog == True:
143         with open(filename, ‘a+‘) as f:
144             pass
145     else:
146         with open(filename, ‘w‘) as f:
147             for info in tv.resources:
148                 f.write(os.linesep.join(info))
149                 f.write(‘========‘ + os.linesep)
150
151 def main():
152
153     start = 1
154     end = 999
155
156     if len(sys.argv) > 1:
157         start = int(sys.argv[1])
158
159     if len(sys.argv) > 2:
160         end = int(sys.argv[2])
161
162     global only_catalog
163     s = input("Only catalog ?[y/N] ")
164     if s == ‘y‘ or s == ‘Y‘:
165         only_catalog = True
166
167     # headers: firefox_58 on ubuntu
168     headers = {
169         ‘User-Agent‘: ‘Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:58.0)‘
170                 + ‘ Gecko/20100101 Firefox/58.0‘,
171         ‘Accept‘: ‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8‘,
172         ‘Accept-Language‘: ‘zh-CN,en-US;q=0.7,en;q=0.3‘,
173         ‘Accept-Encoding‘: ‘gzip, deflate‘,
174         }
175
176     # create spider session
177     with requests.Session() as s:
178
179         try:
180             s.headers.update(headers)
181             open_home_page(s)
182             for num in range(start, end+1):
183                 delay(3)
184                 tv = spider_tv(s, num)
185                 if tv != None:
186                     save_tv(tv)
187
188         except Exception as err:
189             print(err)
190             exit(-1)
191
192 if __name__ == ‘__main__‘:
193     main()

原文地址:https://www.cnblogs.com/tp1226/p/8419564.html

时间: 2024-10-15 00:39:22

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

(原)python爬虫入门(2)---排序爬取的辽宁科技大学热点新闻

发现科大网页的源码中还有文章的点击率,何不做一个文章点击率的降序排行.简单,前面入门(1)基本已经完成我们所要的功能了,本篇我们仅仅需要添加:一个通过正则获取文章点击率的数字:再加一个根据该数字的插入排序.ok,大功告成! 简单说一下本文插入排序的第一个循环,找到列表中最大的数,放到列表 0 的位置做观察哨. 上代码: # -*- coding: utf-8 -*- # 程序:爬取点击排名前十的科大热点新闻 # 版本:0.1 # 时间:2014.06.30 # 语言:python 2.7 #--

Python爬虫入门教程:蜂鸟网图片爬取

1. 蜂鸟网图片--简介 国庆假日结束了,新的工作又开始了,今天我们继续爬取一个网站,这个网站为 http://image.fengniao.com/ ,蜂鸟一个摄影大牛聚集的地方,本教程请用来学习,不要用于商业目的,不出意外,蜂鸟是有版权保护的网站. 2. 蜂鸟网图片--网站分析 第一步,分析要爬取的网站有没有方法爬取,打开页面,找分页 http://image.fengniao.com/index.php?action=getList&class_id=192&sub_classid=

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

1,引言 在上一篇<Python爬虫实战:爬取Drupal论坛帖子列表>,爬取了一个用Drupal做的论坛,是静态页面,抓取比较容易,即使直接解析html源文件都可以抓取到需要的内容.相反,JavaScript实现的动态网页内容,无法从html源代码抓取需要的内容,必须先执行JavaScript. 我们在<Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容>一文已经成功检验了动态网页内容的抓取方法,本文将实验程序进行改写,使用开源Python爬虫

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

获取待爬取页面 今天继续爬取一个网站,http://www.27270.com/ent/meinvtupian/ 这个网站具备反爬,so我们下载的代码有些地方处理的也不是很到位,大家重点学习思路,有啥建议可以在评论的地方跟我说说. 为了以后的网络请求操作方向,我们这次简单的进行一些代码的封装操作. 在这里你可以先去安装一个叫做 retrying 的模块 pip install retrying 这个模块的具体使用,自己去百度吧.嘿嘿哒~ 在这里我使用了一个随机产生user_agent的方法 im

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

啰嗦两句 前几天的教程内容量都比较大,今天写一个相对简单的,爬取的还是蜂鸟,依旧采用aiohttp 希望你喜欢爬取页面https://tu.fengniao.com/15/ 本篇教程还是基于学习的目的,为啥选择蜂鸟,没办法,我瞎选的. 一顿熟悉的操作之后,我找到了下面的链接https://tu.fengniao.com/ajax/ajaxTuPicList.php?page=2&tagsId=15&action=getPicLists 这个链接返回的是JSON格式的数据 page =2页码

Python爬虫实战(1):爬取Drupal论坛帖子列表

1,引言 在<Python即时网络爬虫项目: 内容提取器的定义>一文我们定义了一个通用的python网络爬虫类,期望通过这个项目节省程序员一半以上的时间.本文将用一个实例讲解怎样使用这个爬虫类.我们将爬集搜客老版论坛,是一个用Drupal做的论坛. 2,技术要点 我们在多个文章都在说:节省程序员的时间.关键是省去编写提取规则的时间,尤其是调试规则的正确性很花时间.在<1分钟快速生成用于网页内容提取的xslt>演示了怎样快速生成提取规则,接下来我们再通过GooSeeker的api接口

Python 爬虫实例(9)—— 搜索 爬取 淘宝

# coding:utf-8 import json import redis import time import requests session = requests.session() import logging.handlers import pickle import sys import re import datetime from bs4 import BeautifulSoup import sys reload(sys) sys.setdefaultencoding('u

python 爬虫(一) requests+BeautifulSoup 爬取简单网页代码示例

以前搞偷偷摸摸的事,不对,是搞爬虫都是用urllib,不过真的是很麻烦,下面就使用requests + BeautifulSoup 爬爬简单的网页. 详细介绍都在代码中注释了,大家可以参阅. # -*- coding: utf-8 -*- """ Created on Thu Jul 5 20:48:25 2018 @author: brave-man blog: http://www.cnblogs.com/zrmw/ python3 + anaconda(Spyder)

Python爬虫学习——使用selenium和phantomjs爬取js动态加载的网页

1.安装selenium pip install selenium Collecting selenium Downloading selenium-3.4.1-py2.py3-none-any.whl (931kB) 100% |████████████████████████████████| 942kB 573kB/s Installing collected packages: selenium Successfully installed selenium-3.4.1 2.安装phan