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