目標:使用Python爬取豆瓣電影并保存MongoDB數據庫中
我們先來看一下通過瀏覽器的方式來篩選某些特定的電影:
我們把URL來復制出來分析分析:
https://movie.douban.com/tag/#/?sort=T&range=0,10&tags=%E7%94%B5%E5%BD%B1,%E7%88%B1%E6%83%85,%E7%BE%8E%E5%9B%BD,%E9%BB%91%E5%B8%AE
有3個字段是非常重要的:
1.sort=T
2.range=0,10
3.tags=%E7%94%B5%E5%BD%B1,%E7%88%B1%E6%83%85,%E7%BE%8E%E5%9B%BD,%E9%BB%91%E5%B8%AE
具體分析方法如下:
1.sort:表示排序方式,可以看到它有3中排序方式
根據上圖可以直到每個字母表示的含義:
T:熱度排序,
R:時間排序,
S:評價排序:
?
2.range=0,10;表示一個范圍,具體是什么范圍呢?
range參數我們也搞定了,它就是表示評分區間!
默認評分區間是:0-10
?
3.tags:同樣的原理,這是一個標簽
我們選中的標簽有:電影,愛情,美國,黑幫4個標簽,但是在tags里面我們看到的不是這寫漢字,而是被編碼過的形式!
%E7%94%B5%E5%BD%B1,%E7%88%B1%E6%83%85,%E7%BE%8E%E5%9B%BD,%E9%BB%91%E5%B8%AE)
那如何知道這些字符是表示什么呢?
我們可以到網上進行解碼看看正不正確?
?
?
4.那么還有沒有可以選擇的參數呢?
我們還有2個參數可以選擇!
playbale=1:表示可播放
unwatched=1:表示還沒看過的
至此,我們就已經把URL中的查詢參數全都弄明白了!
?
但是,又有一個問題了,當我們在瀏覽器中點擊"加載更多"按鈕時,這個地址欄中的URL并沒有發生變化,但是電影信息可以加載出來了!這是為什么?
如果知道AJAX加載技術的讀者可能知道這個原理,實際上就是異步加載,服務器不需要刷新整個網頁,只需要刷新局部網頁就可以把數據展示到網頁中,這樣不僅可以加快速度,也可以減少服務器的壓力.
?
重點來了:
抓包結果:
?
看看瀏覽器地址欄的URL與Request URL有什么不一樣的地方?
我們在瀏覽器地址欄中看到的URL是:
https://movie.douban.com/tag/#/?
sort=S&range=5,10&tags=%E7%94%B5%E5%BD%B1,%E7%88%B1%E6%83%85,%E7%BE%8E%E5%9B%BD&playable=1&unwatched=1
實際瀏覽器發送的Request URL是:
https://movie.douban.com/j/new_search_subjects?
sort=S&range=5,10&tags=%E7%94%B5%E5%BD%B1,%E7%88%B1%E6%83%85,%E7%BE%8E%E5%9B%BD&playable=1&unwatched=1&start=0
除了被紅色標記的地方不同之外,其他地方都是一樣的!那我們發送請求的時候應該是用哪一個URL呢?
在上面我就已提到了,在豆瓣電影中,是采用異步加載的方式來加載數據的,也就是說在加載數據的過程中,地址欄中的URL是一直保持不變的,那我們還能用這個URL來發送請求嗎?當然不能了!
既然不能用地址欄中的URL來發送請求,那我們就來分析一下瀏覽器實際發送的Request URL:
我們把這個URL復制到瀏覽器中看看會發生什么情況!
我們可以看到這個URL的響應結果恰恰就是我們想要的數據,采用json格式.在Python中,我們可以利用一些工具把它轉換成字典格式,來提取我們想要的數據.
?
距離我們成功還有一小步:
在這個URL中,我們看到還有一個參數:start,這個是干嘛的呢?
這個數值表示偏移量,來控制每一次加載的偏移位置是在哪里!比如我們把它設置成20,表示一次請求的電影數量.那么得到的結果如下:
到這里,該案例的思路,難點就已經全都捋清楚了,剩下的就是代碼的事情了!
?
項目結構:
完整的代碼如下:
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
