import requests from bs4 import BeautifulSoup #json 數據格式 字典 """ data = {"name":"ming"} 字典 data = {'name':'ming'} """ #在網頁中爬取的數據保存到python對象中爲字典,但是文件寫入不了對象所以我們要轉成json字符串寫入 import json """ 思路: 1、使用網絡請求包去請求網站,利用這個包去獲取網站上的前端源代碼[html,json,xml] 2、在前端源代碼中篩選出我們想要的數據 3、把篩選出來的數據存放文件中 """ """ 爬蟲原理: 模擬瀏覽器想服務器發送http請求【get post option...】,網站接收到請求後,返回數據 """ #瀏覽器請求頭設置 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' } #去獲取請求頁面 def getPage(url): #異常處理 他能捕獲異常【錯誤】 try: #get()是一種http請求,拿到數據 response = requests.get(url, headers=headers) if response.status_code == 200: return response.text else: return None except: return None #獲取電影信息 def getInfo(html): #使用BeautifulSoup匹配電影的排行 電影名 主演 評分 上映時間,html解析庫 soup = BeautifulSoup(html, 'lxml') items = soup.select('dd') #從dd標籤中提取排行 電影名 主演 評分 上映時間 for item in items: index = item.find(name='i', class_='board-index').get_text() name = item.find(name='p', class_='name').get_text() start = item.find(name='p', class_='star').get_text().strip()[3:] time = item.find(name='p', class_='releasetime').get_text()[5:] score = item.find(name='p', class_='score').get_text() #return 吃內存 如果你返回的數據有一百萬部電影 他會全部存入到內存當中 #return index, name, start, time, score #生成器 一部一部的返回 保持內存中只有一部電影的信息 惰性加載 yield { '排行': index, '電影名稱': name, '主演': start, '上映時間': time, '評分': score } def writeData(field): #文件處理 with open('maoyan_info.txt', 'a', encoding='utf-8') as f: f.write(json.dumps(field, ensure_ascii=False) + '\n') #程序入口 if __name__ == "__main__": for num in [i*10 for i in range(10)]: url = 'https://maoyan.com/board/4?offset=' + str(num) html = getPage(url) for item in getInfo(html): print(item) writeData(item)