python 爬取貓眼電影排行前 100
- 分析要爬取頁面的 url
- 通過 url 擷取網頁源碼
- 通過
- 将資訊貯存為合适的格式
- 用 json 格式寫入檔案
import requests
import re
import json
import time
from requests.exceptions import RequestException
def get_one_page(url):
"""
擷取目前 url 的網頁源碼
"""
try:
headers = { # 構造請求頭
'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36\
(KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.text
return None
except RequestException: # 傳回異常
return None
def parse_one_page(html):
pattern = re.compile( # 構造正規表達式對象
'<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.'
+'*?releasetime.*?>(.*?)</p>.*?integer.*?(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',
re.S)
items = re.findall(pattern, html) # items 是清單,每一個元素都是字元串元組
for item in items:
yield { # 傳回一個生成器,每個元素是字典
'index' : item[0],
'image' : item[1],
'title' : item[2], # strip 移除字元串頭尾空格換行
'actor' : item[3].strip()[3:], # "主演:" 後面的字元
'time' : item[4].strip()[5:], # "上映時間:" 後面的字元
'score' : item[5] + item[6]
}
def write_to_file(content): # 傳入的是一個字典,這裡用到了 json 的加載檔案
with open('result.txt', 'a', encoding='utf-8') as f:
print(type(json.dumps(content)))
f.write(json.dumps(content, ensure_ascii=False) + '\n')
f.close()
def main(offset): # 每次爬取一個頁面的 10 部電影的資訊
url = 'http://maoyan.com/board/4?offset=' + str(offset)
html = get_one_page(url) # 獲得網頁
for item in parse_one_page(html): # 解析網頁并寫入檔案
# print(item)
write_to_file(item)
if __name__ == "__main__":
for i in range(10): # 設定偏移量,
main(offset=i * 10)
time.sleep(0.5) # 每次等待 0.5 秒,防止反爬