skeep 发表于 2017-7-23 13:03

Python爬取电影天堂最新电影的下载链接

##Python爬取电影天堂最新电影的下载链接
上一篇帖子只能算是python爬去信息的一个小例子,如果不做数据分析的话,单纯的数据采集又有意义,而本篇所用的脚本则是爬去电影天堂最新的电影的下载地址,爬去之后将链接写入txt,如果想要下载可以直接复制到迅雷中,便可以下载电影,这个相对而言还有点实用价值
### 第一步,分析待爬去的url格式,以及网站的结构

- 打开浏览器,输入地址:http://www.dytt8.net,进入电影天堂的主页。


- 点击最新电影,然后点击下一步,多操作几次,查看url变化






- 我们再次点击下一页,观察第三页,由此我们推测起最新电影相关的页面是http://www.ygdy.net/html/gndy/dyzz/list_23_n.html,其中n代表是第几页。然后自己往后翻几页,验证一下这个猜测,最后可以确定我们的猜测。




- 按F12,打开监视器,点击Inspector,然后点击右侧的小箭头,可以看到a标签的href属性,就是一个相对链接,只要在前面添加上,相应的域名信息,就可以访问该页面了。





- 之后我们选择刚才分析的标签进入,然后观察url,确实如猜测的一样是:htt://www.ygdy8.net/html/gndy/dyzz/20170225/53307.html页面内容,浏览页面时,可以很容易的找到视频的下载地址。





- 按F12,打开监控工具,选择Inspector,然后点击右侧的小箭头,最后点击我们要爬去的那个下载地址,可以看到a标签的内容就是下载连接。




- 下面我们理一下思路,首先是观察到电影页面列表,可以通过a标签的href属性找到电影页面的相对链接,在相对连接之前拼接上htt://www.ygdy8.net/ 之后,可以访问这个url的页面。这个页面中的td标签中的a标签的内容,便是我们要下载的链接。

### 第二步,编写代码

```
# coding=utf-8
#dytt.py
import sys
import urllib2
import os
import chardet
from bs4 import BeautifulSoup
import time
import MySQLdb
reload(sys)
sys.setdefaultencoding("utf-8")

#从html页面中获取视频下载地址
def get_download_url(broken_html):
        soup=BeautifulSoup(broken_html,'html.parser')
        fixed_html=soup.prettify()
        td=soup.find('td',attrs={'style':'WORD-WRAP: break-word'})
        url_a=td.find('a')
        url_a=url_a.string
        return url_a


#从html页面中获取电影标题
def get_title(broken_html):
        soup=BeautifulSoup(broken_html,'html.parser')
        fixed_html=soup.prettify()
        title=soup.find('h1')
        title=title.string
        return title
       

#访问url,返回html页面
def url_open(url):
        req=urllib2.Request(url)
        req.add_header('User-Agent','Mozilla/5.0')
        response=urllib2.urlopen(url)
        html=response.read()
        return html

#主要逻辑就是爬取列表页面,从列表页面中找到每个下载页的连接,拼接好之后再访问,获得标题和下载地址
def add_index_url(url,num,file_object):
        for i in range(1,num):
                new_url=url+str(i)+".html"
                print("----------------------当前爬取第"+str(i)+"页---------------------")
                html=url_open(new_url)
                time.sleep(1)
                soup=BeautifulSoup(html,'html.parser')
                fixed_html=soup.prettify()
                a_urls=soup.find_all('a',attrs={'class':'ulink'})
                host="http://www.ygdy8.net"
                for a_url in a_urls:
                        a_url=a_url.get('href')
                        a_url=host+a_url
                        print(a_url)
                        html=url_open(a_url)
                        #html=unicode(html,'GBK').encode("utf-8")
                        html=html.decode('GBK')
                        write_title=get_title(html)
                        write_url=get_download_url(html)
                        file_object.write(write_title+"\n")
                        file_object.write(write_url+"\n")
       

if __name__=='__main__':
        url="http://www.ygdy8.net/html/gndy/dyzz/list_23_"
        filename="down_load_url.txt"
        num=int(raw_input("please input the page num you want to download:"))
        num=num+1
        if os.path.exists(filename):
                file_object=open(filename,'w+')
        else:
                os.mknod(filename)
                file_object=open(filename,'w+')
        add_index_url(url,num,file_object)
        print("----------------------爬取完成--------------------------")
        file_object.close()



```

### 第三步,对于主要代码进行解释


- 首先还是将所需的库导入以及设置编码格式,具体代码如下:


- 定义get_download_url函数,该函数用来html页面中获取视频的下载地址,起具体代码如下:


- 定义get_title函数,该函数用来从html页面中获取电影的标题



- 定义url_open()函数,该函数访问传入的url,返回html页面


- 定义add_index_url函数,该函数是爬虫的主体部分,主要是首先爬去列表页面,拼接出具体页面url之后,再访问该URL获取下载地址。


- 爬虫的main函数,首先获取用户输入,得到最终需要爬取的页面数。然后判断待写入的文件是否存在,如果存在则直接打开,如果不存在则创建之后打开。然后执行爬取函数,最后关闭文件。



### 第四步,效果展示








### 第五步,补充说明

- 我使用的是Kali系统,python是2.7版本,使用了beautifulsoup的库,如果使用windows跑的话,请手动安装相应的库。这类教程网上也有,自行查找吧。
- 对于爬虫有兴趣的小伙伴,可以私信交流,相互探讨。
- 写过这两个小爬虫之后,后面就要继续学习逆向汇编的知识了,后期也会坚持写总结文章的。

小粉B 发表于 2017-7-23 13:34

美丽汤那么火吗???感觉xpath好用

skeep 发表于 2017-10-10 14:52

打酱油的店小五 发表于 2017-10-7 10:55
你设置的防止服务器检测到休眠一秒我虽然没试,但是我觉得写个随机数休眠会更好,而且写点ip线程进去更好, ...

这个延迟一秒,我主要是怕我的机子承受不了,貌似电影天堂没有相应的检测,可以快速爬取的,如果遇到检测的话,随机的延迟比固定的是要好些的。多谢提醒,今后可能会用到,谢谢

chen4321 发表于 2017-7-23 13:15

Python好强大,看起来又很简单

RuiBox 发表于 2017-7-23 13:17

感谢分享!很详细,适合新手参考!

山顶的一棵草 发表于 2017-7-23 13:30

C语言要写1000行代码,Java只需要写100行,而Python可能只要20行。
{:1_928:}

skeep 发表于 2017-7-23 14:22

感谢大家评论,谢谢大家,至于使用beautifulsoup 是因为相对简单吧 很多教程这是使用的这个,所以就使用的它    个人写小爬虫,不用考虑效率问题,所以用啥都可以的

jzpo 发表于 2017-7-23 14:28

python还有这功能 ,以前都是用火车头来抓取网页内容

skeep 发表于 2017-7-23 14:32

jzpo 发表于 2017-7-23 14:28
python还有这功能 ,以前都是用火车头来抓取网页内容

主要是使用第三方库对于html页面进行解析 得到想要的url地址

j120932 发表于 2017-7-23 14:43

其实这类案例方法很多 但是此类我自认为是最简单和快捷的一种, 

Lililum 发表于 2017-7-23 15:32

亲爱的楼主 有16左右年的py2.7爬虫教程吗,我只在网上找到了前几年的文字教程学起来有些吃力
页: [1] 2 3 4
查看完整版本: Python爬取电影天堂最新电影的下载链接