天天看點

爬取貓眼電影排行榜TOP100資料 --存入csv

爬取貓眼電影網站電影排行榜TOP100資料 --存入csv

        • 流程

流程

  1. 确認頁面是動态還是靜态:在源碼搜尋關鍵字看是否能找到
  2. 檢視排行榜頁面查詢字元串中翻頁的規律:規律為:offset=(page-1)*10
  3. 進入頁面源碼:右鍵點選檢視元素,複制下需求資料的标簽塊,如下
<p class="name"><a href="/films/1228" title="天空之城" data-act="boarditem-click" data-val="{movieId:1228}">天空之城</a></p>
        <p class="star">
                主演:寺田農,鹫尾真知子,龜山助清
        </p>
<p class="releasetime">上映時間:1992-05-01</p>
           
  1. 寫出re:想要的資料為:電影名&朱顔&上映時間
  1. 爬蟲代碼
from urllib import request
from fake_useragent import UserAgent
from time import sleep
import re
import csv

class MaoyanSpider(object):
	#定義常用變量
	def __init__(self):
		self.url = 'https://maoyan.com/board/4?offset={}'
		#計數加了多少條資料
		self.i = 0

	#發請求,url得從run()中傳進來
	def get_html(self,url):
		#包裝請求頭
		headers = {'User-Agent':UserAgent().random}
		req = request.Request(url=url,headers=headers)
		#發請求
		resp = request.urlopen(req)
		#讀取資料
		html = resp.read().decode(utf-8)
		return html

	#解析函數,用正則解析提取到的頁面資料
	def parse_html(self,html):
		#建立編譯對象
		re_bds = '<p class="name">.*?title="(.*?)".*?<p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>'
  		pattern = re.compile(re_bds,re.S)
		#用編譯對象進行正則比對
  		r_list = pattern.findall(html)
  		print(r_list)

	#儲存檔案函數,使用csv檔案的多行寫入[(),(),()]
	def save_html(self,r_list):
		#将資料先存到清單中,再一次性寫入,減少IO
		L = []
		with open ('film.csv','a') as f:
			#建立csv寫入對象
			writer = csv.writer(f)
			for r in r_list:
				# r 資料格式 ('名稱',' 主演 ','上映時間:1993-01-01')
				row = (r[0],
				       r[1].strip(),
				       r[2].strip()[5:15]
					 )
				L.append(row)
				#計數
   			        self.i += 1

			writer.writerows(L)
			#寫入後自動關閉
			#最終寫入格式:音樂之聲 主演:朱莉·安德魯斯,克裡斯托弗·普盧默,埃琳諾·帕克 1965-03-02  。。。
					
	#入口函數
	def run(self):
		#編碼
		#此案例無需編碼

		begin = int(input('請輸入起始頁:'))
		end = int(input('請輸入終止頁:'))
		
		for page in range(begin,end+1):
			#拼接url
			url = self.url.format((page-1)*10)
	
			#用執行個體調用發送請求的函數,并傳入url,接受傳回值html
			html = self.get_html(url)
	
			#資料處理,用執行個體對象調用解析函數解析爬到的資料,并傳入原資料,得到最終資料
			r_list = self.parse_html(html)
			# r_list 資料格式:
			#[('名稱',' 主演 ','上映時間:1993-01-01'),('名稱',' 主演 ','上映時間:1993-01-01'),...]

			self.save_html(r_list)
			
			#設定讀取的間隔時間
			time.sleep(random.uniform(0,1))
		print('資料數量:',self.i)
	
if __name__ == '__main__':
	#計算爬取用時
	start =time.time()
	
	spider = MaoyanSpider()
	spider.run()
	
	end = time.time()
	print('執行時間:%.2f' % (end-start))