天天看點

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

爬取貓眼電影網站電影排行榜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 pymysql

class MaoyanSpider(object):
	#定義常用變量
	def __init__(self):
 		self.url = 'https://maoyan.com/board/4?offset={}'
 		#計數加了多少條資料
  		self.i = 0
  	
  		#連接配接mysql
  		self.db = pymsql.connect(
  					'localhsot','root','password','資料表名',
  					charset='utf8'
  					)
  		#建立遊标
  		self.cursor = self.db.cursor()
  		#定義清單,用來存放所有電影的元組
  		self.all_list = []

 	#發請求,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)

	#處理每一頁的電影資訊,最終格式為[(),(),(),...]
 	def save_html(self,r_list):
 		for film in r_list:
 			#将每個電影的資訊做成一個元組
 			s = (film[0],film[1].strip(),film[2].strip()[5:15])  
 			# 放入all_list,最終格式為:[(),(),(),...]
 			self.all_list.append(s)

 			#計數
			self.i += 1		
				

		#入口函數
 		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 資料格式:
				#[('名稱',' xx主演xx ','上映時間:1993-01-01'),('名稱','xx主演xx ','上映時間:1993-01-01'),...]
				
				#将每頁資料全都放到 all_list 中
				self.save_html(r_list)
				
				#設定讀取的間隔時間
   				time.sleep(random.uniform(0,1))
   				
   			#定義插入資料表 filmtab 的插入語句
   			ins = 'insert into filmtab value(%s,%s,%s)'
   			#将 all_list 一次性放入資料表中,減少IO
   			# cursor.executemany(ins,[(),(),(),...]),每個元組為一個機關填入ins
   			self.cursor.executemany(ins,self.all_list)
   			self.db.commit()
   			self.cursor.close()
   			self.db.close()
   			
			print('資料數量:',self.i)
			#最終寫入格式:音樂之聲 主演:朱莉·安德魯斯,克裡斯托弗·普盧默,埃琳諾·帕克 1965-03-02  。。。

if __name__ == '__main__':
 	#計算爬取用時
	start =time.time()

	spider = MaoyanSpider()
 	spider.run()

	end = time.time()
	print('執行時間:%.2f' % (end-start))