1.分析搜索請求
一位高人曾經說過,想爬取數據,要先分析網站
今天我們爬取電影天堂,有好看的美劇我在上面都能找到,算是很全了。
這個網站的廣告出奇的多,用過都知道,點一下搜索就會彈出個窗口,伴隨着滑稽的音樂,貪玩藍月?
通過python,我們可以避免廣告,直接拿到我們要的東西
我用的是火狐瀏覽器,按F12打開開發者工具,選擇網絡
按照正常的操作順序,其實python就是在模擬人進行一些網頁操作,我們只不過通過python解放自己的雙手
在搜索框輸入“傲骨賢妻”,當然你輸入其他的電視劇名稱也可以,查看開發者工具
聰明的你肯定一下就看出來了,對,就是第一個請求,點開
查看參數,keyword中文意思是關鍵字,我們可以得知,“傲骨賢妻”被encode成了這種看不懂的東西 ,參數kwtype和searchtype感覺沒什么用,具體我也不知道干啥的,我們模擬請求的時候,把它倆加上,防止出問題
好了,我們現在可以打開開發工具開始玩耍了,我用的是IntelliJ IDEA,我安裝了python插件,和pycharm不會差太多,挺好用的。因為我平時用Java開發比較多,我就懶得再下載其他開發工具。當然你用記事本
我也不反對。我先建立一個film.py,用來放置電視劇名。這是一個好習慣,有些時候安全性比較高的數據專門放在一個文件里,進行加密,或者github忽略不提交,可以避免不必要的麻煩
# coding=utf-8 filmName = '傲骨賢妻'
2.用python模擬搜索請求
建立_init_.py
導入所需要的包 urlib2,re,film,注釋已經很清楚了,我來解釋下%(film.filmName).decode("utf-8").encode('gb2312'),%是取出我存在film.py里面的值,為什么要用decode在encode呢?右鍵查看頁面源代碼,你會發現,電影天堂
並不是utf-8編碼,而是gb2312,所以我們要encode呀,剛才我們看到keyword是看不懂的火星文,我們現在知道了,它其實是gb2312編碼,所以這里我們把filmName先解碼成utf-8,變成能看懂的“傲骨賢妻“,再編碼成gb2312
電影天堂后台所能看懂的“傲骨賢妻”,ok,這樣so.php就可以執行我們的查詢操作,kwtype=0&searchtype=titile帶上吧,反正也不累。
關於正則語法,是python基礎,可以去慕課網學習,我就不解釋了。我們目的是看到html里面超鏈接的特點,進行正則匹配
# coding=utf-8 import urllib2 import film import re opener = urllib2.build_opener()#構建一個handler對象 def search(): req = urllib2.Request('http://s.ygdy8.com/plus/so.php') #so.php請求參數將中文進行了Url.encode(),所以需要將中文encode('gb2312')處理 req.add_data('kwtype=0&searchtype=title&keyword=%s' %(film.filmName).decode("utf-8").encode('gb2312')) html = opener.open(req).read().decode('gb2312') reg = r'/html/tv/oumeitv/[0-9]{8}/[0-9a-zA-Z.]{9,10}' return re.findall(reg,html) search()
3.分析下載地址
我們接着對網站進行分析 ,我們剛才搜索完成
現在界面是這樣,我們暫時只取第一個,也就是“2014主打美劇《傲骨賢妻》第六季”
點開第一個連接,進入熟悉的界面,終於找到我們想要的了,對,就是下載地址
4.獲取下載鏈接
廣告出奇的多。。。還好我禁用了flash
這時候打開idea,寫入代碼。list獲取到search結果,因為search是兩個,為了看到效果,我沒有遍歷,只取第一個搜索結果,即2014主打劇...,這里正則用u是指Unicode string,因為我們這里存在中文
html解碼,正則匹配電影天堂下載格式
def openSearchResult(): list = search() req = urllib2.Request('http://www.ygdy8.com'+list[0]) html = opener.open(req).read().decode('gb2312','ignore') reg = u'ftp://[a-z0-9]+:[a-z0-9]+@[a-z0-9]+.[a-z]{1,8}.[a-z]{3}:[\d]{4}/[\u4e00-\u9fa5]{0,10}[\W]*\[陽光電影www.ygdy8.com\][\u4e00-\u9fa5]*[\d]+[\u4e00-\u9fa5]\[[\u4e00-\u9fa5]+\].rmvb' return re.findall(reg,html) openSearchResult()
然后再用list把openSearchResult遍歷出來,Unicode string必須遍歷才能看到中文
def getList(): for i in openSearchResult(): print i getList()
結果如下,復制下來到迅雷就可以下載啦
我把fileName換成行屍走肉
5.源碼
這個是正則基本語法https://github.com/cjy513203427/pachong/tree/master/regularExpression
這個是該博客的源碼:https://github.com/cjy513203427/pachong/tree/master/downloadDytt