您好,登錄后才能下訂單哦!
小編給大家分享一下用Python爬蟲爬取電影的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
豆瓣電影Top250應(yīng)該是屬于最容易抓取的靜態(tài)網(wǎng)頁類型,直接用python的urllib庫發(fā)送請求,即可獲得瀏覽器上看到的所有信息。不需要登錄,也沒有動(dòng)態(tài)加載信息。
一、思路分析
用chrome打開豆瓣電影Top250頁面, https://movie.douban.com/top250。如下圖第一部電影,肖申克的救贖,電影名稱、導(dǎo)演、主演、年份、評分、評價(jià)人數(shù)這些信息是我們需要的。我們用瀏覽器或者python向?yàn)g覽器發(fā)送請求的時(shí)候,返回的是html代碼,我們平時(shí)用瀏覽器瀏覽網(wǎng)頁看到的這些圖文并茂的規(guī)整的頁面其實(shí)是html代碼在經(jīng)過瀏覽器渲染后的結(jié)果。所以我們需要找到要抓取信息在html代碼中的位置。這就叫html解析,解析的工具有很多。比如:正則表達(dá)式、Beautifulsoup、Xpath、css等,這里采用xpath方法。
如何找到信息在html中的位置呢,首先鼠標(biāo)右鍵檢查,打開當(dāng)前網(wǎng)頁的html代碼。然后先單擊箭頭1處的箭頭,把鼠標(biāo)移動(dòng)到你要查找的信息上,如箭頭2處的電影名:肖申克的救贖 ,右邊就會(huì)顯示你點(diǎn)擊信息在html代碼中的位置(箭頭3)。一個(gè)網(wǎng)頁的html代碼全部打開看上去會(huì)非常的繁多,其實(shí)html代碼是一層一層結(jié)構(gòu)化的,非常規(guī)整的。每一對尖括號包起來的是一個(gè)標(biāo)簽,比如箭頭3的<span> ......</span>,這就是一個(gè)span標(biāo)簽。span叫標(biāo)簽名,class="title"是標(biāo)簽的屬性,“肖申克的救贖”是標(biāo)簽的內(nèi)容。
標(biāo)簽span在html代碼中的完整路徑應(yīng)該是:
body/div[@id="wrapper"]/div[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/span[1]
用xpath查找元素就是按照路徑一層層找下去,[@id="wrapper"]表示查找的標(biāo)簽的屬性,用標(biāo)簽加上屬性,我們可以更方便的定位,不用從頭找到尾。div[1]、span[1]表示要查找的是該標(biāo)簽下的第1個(gè)div標(biāo)簽,第1個(gè)span標(biāo)簽。找到span標(biāo)簽可以用方法span[1]/text()取出其中的內(nèi)容,pan[1]/@class可以取出屬性值。
電影封面的下載,只要找到圖片的鏈接地址,就可以調(diào)用urllib庫中的函數(shù)urllib.request.urlretrieve()直接下載。找到圖片鏈接的方法和上面一樣,把鼠標(biāo)移動(dòng)到封面上,右邊就會(huì)顯示鏈接的位置。
每一頁網(wǎng)址的變化規(guī)律,一頁可以顯示25部電影,就是說這250部電影一共有10頁。觀察前幾頁的網(wǎng)址很容易發(fā)現(xiàn)規(guī)律:就是start后面跟的參數(shù)變化,等于(頁數(shù)-1)*25,而且發(fā)現(xiàn)后面的filter去掉也不影響。
第一頁:https://movie.douban.com/top250
第二頁:https://movie.douban.com/top250?start=25&filter=
第三頁:https://movie.douban.com/top250?start=50&filter=
二、代碼實(shí)現(xiàn)
先用urllib發(fā)送請求,獲得返回的源代碼html。返回的html是字符串格式,需要用tree.HTML轉(zhuǎn)化成xpath能處理的對象。觀察html代碼,每一個(gè)<li> ...</li>,標(biāo)簽剛好對應(yīng)一部電影,所以我們先定位到每一個(gè)li標(biāo)簽,在對每一個(gè)li標(biāo)簽解析獲得這個(gè)電影的各個(gè)信息。
data_title ---電影名稱
data_info ---電影信息(導(dǎo)演、主演、上映時(shí)間)
data_quote ---電影引言
data_score ---電影評分
data_num ---電影評論人數(shù)
data_picurl---電影封面鏈接
完整代碼如下:
from urllib import request from lxml import etree #構(gòu)造函數(shù),抓取第i頁信息 def crow(i): # 構(gòu)造第i頁的網(wǎng)址 url='https://movie.douban.com/top250?start='+str(25*i) # 發(fā)送請求,獲得返回的html代碼并保存在變量html中 html=request.urlopen(url).read().decode('utf-8') #將返回的字符串格式的html代碼轉(zhuǎn)換成xpath能處理的對象 html=etree.HTML(html) #先定位到li標(biāo)簽,datas是一個(gè)包含25個(gè)li標(biāo)簽的list,就是包含25部電影信息的list datas = html.xpath('//ol[@class="grid_view"]/li') a=0 for data in datas: data_title=data.xpath('div/div[2]/div[@class="hd"]/a/span[1]/text()') data_info=data.xpath('div/div[2]/div[@class="bd"]/p[1]/text()') data_quote=data.xpath('div/div[2]/div[@class="bd"]/p[2]/span/text()') data_score=data.xpath('div/div[2]/div[@class="bd"]/div/span[@class="rating_num"]/text()') data_num=data.xpath('div/div[2]/div[@class="bd"]/div/span[4]/text()') data_picurl=data.xpath('div/div[1]/a/img/@src') print("No: "+str(i*25+a+1)) print(data_title) #保存電影信息到txt文件,下載封面圖片 with open('douban250.txt','a',encoding='utf-8')as f: #封面圖片保存路徑和文件名 picname='F:/top250/'+str(i*25+a+1)+'.jpg' f.write("No: "+str(i*25+a+1)+'\n') f.write(data_title[0]+'\n') f.write(str(data_info[0]).strip()+'\n') f.write(str(data_info[1]).strip()+'\n') #因?yàn)榘l(fā)現(xiàn)有幾部電影沒有quote,所以這里加個(gè)判斷,以免報(bào)錯(cuò) if data_quote: f.write(data_quote[0]+'\n') f.write(data_score[0]+'\n') f.write(data_num[0]+'\n') f.write('\n'*3) #下載封面圖片到本地,路徑為picname request.urlretrieve(data_picurl[0],filename=picname) a+=1 for i in range(10): crow(i)
三、結(jié)果如下:
看完了這篇文章,相信你對用Python爬蟲爬取電影的方法有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。