利用bs4爬取电影天堂电影下载地址

首先来张图:

将就看吧,我都有点不好意思,但至少表现出来要表达的意思了,我们最终要获得的信息不是在第一个页面中,而是从第一个页面中进入第二个页面,需要的信息在第二个页面中,虽然电影列表有很多页,但是现阶段都不考虑只获取第一页中的所有电影的下载连接。
这个爬虫分三步

  • 先从第一页中将所有第二页的url取出来,存到列表中
  • 循环第二页地址的列表,将这个url与网站域名拼凑成真正地址,然后获取第二页的代码
  • 从第二页代码中获取最终需要的下载地址存储到一个字典中

首先利用bs4从第一页中获取所有第二页的url,并存储到一个列表中:

1
2
3
4
5
6
7
8
9
10
11
12
film_list = []
headers = ('User-Agent', 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36')
# 创建OpenerDirector对象并打开网页
opener = urllib2.build_opener()
opener.addheaders = [headers]
content = opener.open(url).read()
encoding = chardet.detect(content)['encoding']
content = content.decode(encoding, 'ignore')
# 创建网页的BeautifulSoup对象
soup = bs4.BeautifulSoup(content)
films_set = soup.findAll('a', class_='ulink') #获取所有class为ulink的a标签

上面的encoding = chardet.detect(content)[‘encoding’]是探测网页编码比如utf-8,gbk

因为python的内部编码为unicode,所以需要将获取到的内容转换为unicode,上句话已经获得到了网页的编码,下面这句话就是转换了,content = content.decode(encoding, ‘ignore’)这句代码为什么要加ignore,那我下面就要引用了

比如,若要将某个String对象s从gbk转换为unicode,可以如下操作
s.decode(‘gbk’)
可是,在实际开发中,我发现,这种办法经常会出现异常:
UnicodeDecodeError: ‘gbk’ codec can’t decode bytes in position 30664-30665: illegal multibyte sequence

这是因为遇到了非法字符——尤其是在某些用C/C++编写的程序中,全角空格往往有多种不同的实现方式,比如\xa3\xa0,或者\xa4\x57,这些 字符,看起来都是全角空格,但它们并不是“合法”的全角空格(真正的全角空格是\xa1\xa1),因此在转码的过程中出现了异常。

这样的问题很让人头疼,因为只要字符串中出现了一个非法字符,整个字符串——有时候,就是整篇文章——就都无法转码。

解决办法:s.decode(‘gbk’, ‘ignore’)

因为decode的函数原型是decode([encoding], [errors=’strict’]),可以用第二个参数控制错误处理的策略,默认的参数就是strict,代表遇到非法字符时抛出异常;
如果设置为ignore,则会忽略非法字符;
如果设置为replace,则会用?取代非法字符;
如果设置为xmlcharrefreplace,则使用XML的字符引用。

经过上面的处理,所有第二页的url就存储到了films_set列表中了,下一步需要循环这个列表将所有的url与域名拼凑起来形成最终的url

1
2
3
4
for film in films_set:
film_dic = {}
# 提取地址,并与主域名拼凑
film_href = "http://www.dytt8.net" + film['href']

因为最终第二页的url已经拿到,那么我们接下来就去获取第二页的源码,分析然后拿到电影下载地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 打开地址,获取第二页代码
film_content = urllib2.urlopen(film_href).read()
encoding = chardet.detect(film_content)['encoding']
film_content = film_content.decode(encoding, 'ignore')
# 获取HTML文档的BeautifulSoup对象
film_soup = bs4.BeautifulSoup(film_content)
# 提取电影title及下载地址
title_all = film_soup.findAll('div', class_='title_all')
film_dic['film_title'] = title_all[-1].h1.font.string
if film_dic['film_title']:
film_dic['download_url'] = film_soup.findAll('td', style='WORD-WRAP: break-word')[0].a['href']
film_list.append(film_dic)
else:
break

在这又遇到个问题,就是在浏览器中用f12看到的下载地址的td标签和用代码获取出来的td标签内容不一样,也是经过询问才知道浏览器中看到的代码是经过js处理过的,我们用代码获得的是没有经过处理的,所以这就需要调试技巧了,先在获取存储下载地址的td标签下断点,然后分析这个td标签的内容,如下:

1
<td bgcolor="#fdfddf" style="WORD-WRAP: break-word"><a href="ftp://ygdy8:ygdy8@y006.dygod.org:2096/[阳光电影www.ygdy8.com].我是路人甲(修正版).HD.720p.国语中字.rmvb">ftp://ygdy8:ygdy8@y006.dygod.org:2096/[阳光电影www.ygdy8.com].我是路人甲(修正版).HD.720p.国语中字.rmvb

其实我们需要的就是这个href中的内容,拿到后存储到film_dic这个字典中。我们除了拿到下载地址还需要电影的名称,这个名称是没有经过处理的,所以直接去分析源码,然后取出来并存储就行了。

以上功能都是在一个函数中实现的,下面需要调用这个函数:

1
2
3
4
5
url = "http://www.dytt8.net/html/gndy/dyzz/index.html"
for film_dic in get_films_sorted(url):
print film_dic['film_title']
print film_dic['download_url']

以下是运行结果:

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
2015年喜剧《我是路人甲 修正版》HD国语中字
ftp://ygdy8:ygdy8@y006.dygod.org:2096/[阳光电影www.ygdy8.com].我是路人甲(修正版).HD.720p.国语中字.rmvb
2015年范冰冰古装《王朝的女人・杨贵妃》HD国语中字
ftp://ygdy8:ygdy8@y201.dygod.org:1382/[阳光电影www.ygdy8.com].王朝的女人・杨贵妃.HD.720p.国语中字.rmvb
2015年古天乐余文乐任达华动作《谜城/迷城》HD国语中字
ftp://ygdy8:ygdy8@y201.dygod.org:1381/[阳光电影www.ygdy8.com].谜城.HD.720p.国语中字.rmvb
2015年喜剧《男人制造/灵魂的温度》HD国语中字
ftp://ygdy8:ygdy8@y006.dygod.org:2095/[阳光电影www.ygdy8.com].男人制造.HD.720p.国语中字.rmvb
2014年奇幻《故事中的故事》BD中英双字幕
ftp://ygdy8:ygdy8@y201.dygod.org:1380/[阳光电影www.ygdy8.com].故事中的故事.BD.720p.中英双字幕.rmvb
2015年孙红雷周冬雨《少年班》HD国语中字
ftp://ygdy8:ygdy8@y006.dygod.org:2094/[阳光电影www.ygdy8.com].少年班.HD.720p.国语中字.rmvb
2015年惊悚《7分钟》BD中英双字幕
ftp://ygdy8:ygdy8@y006.dygod.org:2089/[阳光电影www.ygdy8.com].7分钟.BD.720p.中英双字幕.rmvb
2014年惊悚《陡岸凶杀案》BD中英双字幕
ftp://ygdy8:ygdy8@y201.dygod.org:1374/[阳光电影www.ygdy8.com].陡岸凶杀案.BD.720p.中英双字幕.rmvb
2015年科幻动作《复仇者联盟2》HD中英双字幕
ftp://ygdy8:ygdy8@y201.dygod.org:1371/[阳光电影www.ygdy8.com].复仇者联盟2.HD.720p.中英双字幕.rmvb
2015年刘青云黄晓明《暴疯语》BD国粤双语中字
ftp://ygdy8:ygdy8@y201.dygod.org:1370/[阳光电影www.ygdy8.com].暴疯语.BD.720p.国粤双语中字.mkv
2015年杨千古天乐《可爱的你》BD国粤双语中字
ftp://ygdy8:ygdy8@y006.dygod.org:2086/[阳光电影www.ygdy8.com].可爱的你.BD.720p.国粤双语中字.mkv
2015年动作《杀破狼2之杀无赦》HD国语中字
ftp://ygdy8:ygdy8@y201.dygod.org:1366/[阳光电影www.ygdy8.com].杀破狼2.HD.720p.国语中字.rmvb
2015年悬疑惊悚《暗黑之地》BD中英双字幕
ftp://ygdy8:ygdy8@y006.dygod.org:2082/[阳光电影www.ygdy8.com].暗黑之地.BD.720p.中英双字幕.rmvb
2015年动作《疯狂的麦克斯:狂暴之路》BD中英双字幕
ftp://ygdy8:ygdy8@y201.dygod.org:1364/[阳光电影www.ygdy8.com].疯狂的麦克斯:狂暴之路.BD.720p.中英双字幕.rmvb
2015年悬疑动作《赤道/大峡谷/赤盗》BD国粤双语中字
ftp://ygdy8:ygdy8@y006.dygod.org:2080/[阳光电影www.ygdy8.com].赤道.BD.720p.国粤双语中字.mkv
2015年梁洛施主演剧情《念念》BD国语中字
ftp://ygdy8:ygdy8@y201.dygod.org:1363/[阳光电影www.ygdy8.com].念念.BD.720p.国语中字.rmvb
2014年动作《冰峰游戏/总统游戏》BD中英双字幕
ftp://ygdy8:ygdy8@y006.dygod.org:2079/[阳光电影www.ygdy8.com].冰峰游戏.BD.720p.中英双字幕.rmvb
2015年郑伊健郑中基喜剧《全力扣杀》BD国粤双语中字
ftp://ygdy8:ygdy8@y201.dygod.org:1362/[阳光电影www.ygdy8.com].全力扣杀.BD.720p.国粤双语中字.mkv
2014年科幻动作《机器人帝国》BD中英双字幕
ftp://ygdy8:ygdy8@y201.dygod.org:1360/[阳光电影www.ygdy8.com].机器人帝国.BD.720p.中英双字幕.rmvb
2015年科幻恐怖《天魔异种/孤海魔怪》BD中英双字幕
ftp://ygdy8:ygdy8@y006.dygod.org:2077/[阳光电影www.ygdy8.com].天魔异种.BD.720p.中英双字幕.rmvb
2015年剧情喜剧《小男孩》BD中英双字幕
ftp://ygdy8:ygdy8@y006.dygod.org:2075/[阳光电影www.ygdy8.com].小男孩.BD.720p.中英双字幕.rmvb
2015年爱情《时光尽头的恋人》BD中英双字幕
ftp://ygdy8:ygdy8@y201.dygod.org:1358/[阳光电影www.ygdy8.com].时光尽头的恋人.BD.720p.中英双字幕.rmvb
2015年动作喜剧《道士下山》HD国语中字
ftp://ygdy8:ygdy8@y006.dygod.org:2071/[阳光电影www.ygdy8.com].道士下山.HD.720p.国语中字.rmvb
2015年动作喜剧《别惹得州》BD中英双字幕
ftp://ygdy8:ygdy8@y006.dygod.org:2068/[阳光电影www.ygdy8.com].别惹得州.BD.720p.中英双字幕.rmvb
2014年惊悚《解除好友/杀讯》BD中英双字幕
ftp://ygdy8:ygdy8@y201.dygod.org:1352/[阳光电影www.ygdy8.com].解除好友.BD.720p.中英双字幕.rmvb

github地址:https://github.com/lowkeynic4/crawl/blob/master/dianyingtiantang.py