爬取貓眼電影網站電影排行榜TOP100資料 --存入csv
流程
- 确認頁面是動态還是靜态:在源碼搜尋關鍵字看是否能找到
- 檢視排行榜頁面查詢字元串中翻頁的規律:規律為:offset=(page-1)*10
- 進入頁面源碼:右鍵點選檢視元素,複制下需求資料的标簽塊,如下
<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>
- 寫出re:想要的資料為:電影名&朱顔&上映時間
- 爬蟲代碼
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))