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

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