Python爬虫:

2019-08-19 23:10| 发布者: |

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

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

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

爬取的资源地图如下:

在linux系统上通过 ls | grep keywords 可以轻松找到想要的资源

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

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

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

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

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

通过beautifulSoup的接口,获取该标签内容

 1 # try get tv name
 2 tag_name = soup.find
 3 if None == tag_name:
 4 print)
 5 return None
 7 # remove signs not need
 8 name = tag_name.get_text.replace 
 9 try:
10 name = name.replace.group, '') 
11 name = name.replace', name).group, '') 
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
 if None == tag_resources:
 print)
 return None
 # walk resources
 for res in tag_resources.find_all:
 # get link tag
 tag_a = res.find
 info = res.find_all
 print)
 # get download link
 downlink = get_resources_link)
 # record resouces
 tv.resources.append, info[2].get_text, downlink, ''])
 delay

 

4. 获取下载链接

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

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

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

def get_resources_link:
 ''' get tv resources download link '''
 global domain
 res_url = domain + url
 # open resources page
 resp = session.get
 resp.raise_for_status
 soup = page_decode
 tag_emule = soup.find
 return tag_emule.get_text if tag_emule != None else ''

 

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

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

def save_tv:
 ''' save tv infomation on disk '''
 filename = os.path.join, '{:0 4d}_{}.txt'.format)
 global only_catalog
 if only_catalog == True:
 with open as f:
 pass
 else:
 with open as f:
 for info in tv.resources:
 f.write)
 f.write

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

 

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

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

 

整体代码:

 1 #!/usr/bin/python3
 2 # -*- coding:utf-8 -*-
 4 import os
 5 import sys
 6 import re
 7 import requests
 8 from bs4 import BeautifulSoup
 9 from time import sleep
 11 # website domain
 12 domain = 'http://www.zhuixinfan.com/'
 14 # spide infomation save directory
 15 save_dir = './tvinfo/'
 17 # only tv catalog
 18 only_catalog = False
 20 class TVInfo:
 21 ''' TV infomation class'''
 23 def __init__:
 24 self.num = num
 25 self.name = name
 26 self.resources = []
 29 def delay:
 30 ''' sleep for secondes '''
 32 while seconds 0:
 33 sleep
 34 seconds = seconds - 1
 36 def page_decode:
 37 ''' decode page '''
 39 # lxml may failed, then try html.parser
 40 try:
 41 soup = BeautifulSoup
 42 except:
 43 soup = BeautifulSoup
 45 return soup
 47 def open_home_page:
 48 ''' open home page first as humain being '''
 50 global domain
 51 home_url = domain + 'main.php'
 53 # open home page
 54 resp = session.get
 55 resp.raise_for_status
 57 # do nothing
 59 def get_resources_link:
 60 ''' get tv resources download link '''
 62 global domain
 63 res_url = domain + url
 65 # open resources page
 66 resp = session.get
 67 resp.raise_for_status
 69 soup = page_decode
 71 tag_emule = soup.find
 72 return tag_emule.get_text if tag_emule != None else ''
 75 def spider_tv:
 76 ''' fetch tv infomaion '''
 78 global domain
 79 tv_url = domain + 'viewtvplay-{}.html'.format
 81 # open tv infomation page
 82 resp = session.get
 83 resp.raise_for_status
 85 soup = page_decode
 87 # try get tv name
 88 tag_name = soup.find
 89 if None == tag_name:
 90 print)
 91 return None
 93 # try get tv resources list
 94 tag_resources = soup.find
 95 if None == tag_resources:
 96 print)
 97 return None
 99 # remove signs not need
100 name = tag_name.get_text.replace
101 try:
102 name = name.replace.group, '')
103 name = name.replace', name).group, '')
104 name = name.replace
105 name = name.replace
106 name = name.replace
107 except :
108 pass
110 print)
112 tv = TVInfo
114 global only_catalog
115 if only_catalog == True:
116 return tv
118 # walk resources
119 for res in tag_resources.find_all:
121 # get link tag
122 tag_a = res.find
123 info = res.find_all
124 print)
126 # get download link
127 downlink = get_resources_link)
129 # record resouces
130 tv.resources.append, info[2].get_text, downlink, ''])
131 delay
133 return tv
136 def save_tv:
137 ''' save tv infomation on disk '''
139 filename = os.path.join, '{:0 4d}_{}.txt'.format) 
141 global only_catalog
142 if only_catalog == True:
143 with open as f:
144 pass
145 else:
146 with open as f:
147 for info in tv.resources: 
148 f.write)
149 f.write
151 def main:
153 start = 1
154 end = 999
156 if len 1:
157 start = int
159 if len 2:
160 end = int
162 global only_catalog
163 s = input
164 if s == 'y' or s == 'Y':
165 only_catalog = True
167 # headers: firefox_58 on ubuntu
168 headers = {
169 'User-Agent': 'Mozilla/5.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 }
176 # create spider session
177 with requests.Session as s:
179 try:
180 s.headers.update
181 open_home_page
182 for num in range:
183 delay
184 tv = spider_tv
185 if tv != None:
186 save_tv
188 except Exception as err:
189 print
190 exit
192 if __name__ == '__main__':
193 main

 

<
>
关于我们
AB模版网成立于2014年,我们是一家专注用户体验设计开发与互联网品牌建设的设计公司,创立至今为2000多位客户提供了创新与专业的设计方案。设计服务范围包括:交互原型设计、产品视觉设计、网站设计与开发建设、移动及软件产品界面设计、图标设计、品牌及平面设计等。

联系我们

13588889999服务时间:9:00-18:00)

admin@adminbuy.cn

官方微信官方微信

部门热线

前   台:13588889999
业务部:13588889999
客服部:13588889999
技术部:13566667777
人事部:13566667777

咨询电话13588889999 返回顶部
返回顶部