送書 | 教你爬取電影天堂數(shù)據(jù)
大家好!我是啃書君
我和朋友說:俗話說,閑來沒事干,不如斗地主,哎,我們不斗地主,就是玩~。那不斗地主,我們干點啥好捏~,不如看電影?!
朋友說:那些新上映的好看的電影、電視劇和動漫,絕大部分都要錢,你這個糟老頭子壞得很,又想騙我充會員,借會員給你?。?!
我說:哎呀,被你發(fā)現(xiàn)了,沒事,那我們?nèi)ル娪疤焯门离娪皵?shù)據(jù),到時候想看哪部就下載下來,慢慢看!
爬取分析
在爬取之前,分析爬取的邏輯和理清思路。
我們要爬取的數(shù)據(jù)是電影天堂首頁里面的全部電影信息,例如電影海報、電影名、上映時間、產(chǎn)地、字幕、片長、簡介、電影下載鏈接等電影信息。首先我們打開電影天堂,如下圖所示:
打開開發(fā)者工具,我們發(fā)現(xiàn)每一個div class="co_content222"存放一個首頁的模塊,這個div class="co_content222"與之對應的模塊是2021必看熱片,我們打開其中的一個div,如下圖所示:
我們發(fā)現(xiàn),里面有很多個li,每個li存放著電影名和電影頁面鏈接,我們點擊其中一個a鏈接并跳轉(zhuǎn)到該電影頁面,里面有我們需要的數(shù)據(jù)信息,例如:電影海報、電影名、上映時間、產(chǎn)地、字幕、片長、簡介,電影下載鏈接等,如下圖所示:
我們繼續(xù)打開開發(fā)者工具,經(jīng)過簡單的查找,發(fā)現(xiàn)電影信息都存放在div id="Zoom"里面,如下圖所示:
好了,我們已經(jīng)知道每個電影頁面鏈接和電影數(shù)據(jù)信息存放的位置了,接下來正式開始爬取。
實戰(zhàn)演練
電影天堂源代碼獲取
首先我們定義了get_index()方法來獲取電影天堂首頁源代碼,具體代碼如下所示:
def get_index():
response = requests.get('https://www.dy2018.com/?jdfwkey=ycdpz3')
response.encoding = 'gb2312'
html = response.text
get_link(html)
這個電影天堂這個網(wǎng)站比較特別,不要加請求頭也可以正常獲取數(shù)據(jù)。
這里要注意的是:
電影天堂網(wǎng)頁的源代碼的head部分的編碼為:gb2312,所以我們利用requests庫來改變輸出結(jié)果的編碼。
獲取頁面源代碼后,我們將源代碼傳遞到get_link()方法中。
電影URL鏈接獲取
在上一步中,我們已經(jīng)獲取到了頁面源代碼,接下來我們要獲取每個電影的URL鏈接,具體代碼如下圖所示:
pattern1 = re.compile('2021必看熱片.*?<ul>(.*?)</ul>', re.S)
ul = re.findall(pattern1, html)
for i in ul:
li = i.strip()
pattern2 = re.compile("<li>.*?'(.*?)'.*?</li>")
a = re.findall(pattern2, li)
links = ['https://www.dy2018.com/' + ii for ii in a]
for link in links:
get_data(link)
首先我們?yōu)榱税凑帐醉摰拿總€模塊來獲取電影鏈接,所以我們創(chuàng)建了一個名為pattern1的正則表達式對象。因為整個頁面源代碼中,模塊名只出現(xiàn)了一次,例如2021必看熱片、迅雷電影資源等,所以我們可以通過這個來準確地獲取每個模塊的ul數(shù)據(jù)。由于獲取到的數(shù)據(jù)有換行符,所以我們需要使用strip()方法來清除開頭或是結(jié)尾的換行符。
接下來我們創(chuàng)建了一個名為pattern2的正則表達式對象來獲取a鏈接里面的href,通過使用列表推導式,我們將每個電影的URL鏈接存放在列表中,然后將每個列表的元素傳遞到get_data()方法中。
電影信息的獲取
接下來,我們要利用我們已經(jīng)獲取到的電影URL鏈接來獲取電影信息,具體代碼如下:
response = requests.get(link)
response.encoding = 'gb2312'
dats = response.text
html = parsel.Selector(dats)
pattern = re.compile(r'<!--Content Start-->.*?src="(.*?)".*?◎譯 名 (.*?)<br />.*?◎產(chǎn) 地 (.*?)<br />◎類 別 (.*?)<br />.*?◎字 幕 (.*?)<br />◎上映日期 (.*?)<br />.*?◎片 長 (.*?)<br />.*?◎簡 介<br /> (.*?)<', re.S)
ul = re.findall(pattern, dats)
for l in ul:
down_list = html.xpath('//div[@id="downlist"]/table/tbody/tr/td//text()').extract()
content = {
'img': l[0],
'name': l[1],
'place': l[2],
'type': l[3],
'font': l[4],
'data': l[5],
'time': l[6],
'text': re.sub('&\w+;', '', l[7]).replace('<br />', '').strip(),
'download': down_list,
}
for i in content.values():
print(i)
if __name__ == '__main__':
get_index()
由于div id='Zoom'中的電影數(shù)據(jù)信息中,電影圖片等數(shù)據(jù)只有一個,而電影下載鏈接可能有多個,例如電視劇的下載鏈接就有多個,我們?nèi)绻挥靡粋€正則表達式對象來獲取電視劇數(shù)據(jù)信息的話,只能獲取到一個下載鏈接,所以我們首先通過正則表達式來獲取電影圖片、電影名、產(chǎn)地、類型、字幕、上映時間、片長和簡介,接著使用xpath來獲取電視劇的下載鏈接。
獲取完數(shù)據(jù)信息后,所有的數(shù)據(jù)放在字典中,并循環(huán)打印出來,運行結(jié)果如下:
由于本人覺得這種打印出來的數(shù)據(jù)算是比較好看了,所以沒做進一步的數(shù)據(jù)保存,大家可以根據(jù)需要自行將這些數(shù)據(jù)存儲到其他地方。
送書
又到了每周三的送書時刻,今天給大家?guī)淼氖恰?span style="font-family: Arial, "microsoft yahei";font-size: 16px;font-weight: 700;letter-spacing: 0.544px;">Python網(wǎng)絡爬蟲框架Scrapy從入門到精通》,本書從python主流框架scrapy的簡介及網(wǎng)絡爬蟲知識講起,逐步深入到scrapy進階實戰(zhàn)。本書從實戰(zhàn)出發(fā),根據(jù)不同需求,有針對性地講解了靜態(tài)網(wǎng)頁、動態(tài)網(wǎng)頁、app應用是如何爬取所需數(shù)據(jù),以及scrapy是如何部署分布式爬取,還介紹了用scrapy+pandas是如何行數(shù)據(jù)分析及數(shù)據(jù)展示,讓讀者不但可以系統(tǒng)地學scrapy編程的相關知識,而且還能對scrapy應用開發(fā)有更為深入的理解。本書分為12章,涵蓋的主要內(nèi)容有scrapy框架簡介;scrapy網(wǎng)絡爬蟲知識介紹;scrapy開發(fā)環(huán)境的搭建;scrapy架構(gòu)及編程;scrapy階;實戰(zhàn)項目:scrapy靜態(tài)網(wǎng)頁的爬?。粚崙?zhàn)項目:scrapy動態(tài)網(wǎng)頁的爬??;實戰(zhàn)項目:scrapy爬取app應用數(shù)據(jù);scrapy的分布式部署與爬取;分布式的實戰(zhàn)項目;用selenium框架測試;用scrapy+pandas行數(shù)據(jù)分析。本書內(nèi)容通俗易懂,實例典型,實用性強,特別適合學python主流框架scrapy的入門讀者和階讀者閱讀,也適合數(shù)據(jù)分析與挖掘技術的初學者閱讀,還適合相關培訓機構(gòu)的師生閱讀。

點擊下方回復:送書 即可!
(點擊查看本書內(nèi)容)
