1、問題描述:
爬取貓眼TOP100榜的100部高分經典電影,並將數據存儲到CSV文件中
2、思路分析:
(1)目標網址:http://maoyan.com/board/4
(2)代碼結構:
(3) init(self)初始化函數
· hearders用到了fake_useragent庫,用來隨機生成請求頭。
· datas空列表,用於保存爬取的數據。
def __init__(self,url):
self.headers = {"User-Agent": UserAgent().random}
self.url = url
self.datas = list()
(4) getPage()函數
貓眼Top100榜總共有10頁電影,每頁的鏈接基本一樣,只有最后一個數字在變化http://maoyan.com/board/4?offset=10,所以可以通過for循環來訪問10頁的電影。
# 通過for循環,獲取10頁的電影信息的源碼
def getPage(self):
for i in range(0,10):
url = self.url + "?offset={0}".format(i*10)
response = requests.get(url, headers = self.headers)
if response.status_code == 200:
self.parsePage(response.text)
else:
return None
(5)parsePage()函數
每頁都有10部高分經典電影,通過BeautifulSoup獲取每頁10部電影的詳細信息:名字、主演、上映時間、評分。
# 通過BeautifulSoup獲取每頁10部電影的詳細信息
def parsePage(self, html):
soup = BeautifulSoup(html, "html.parser")
details = soup.find_all("dd")
for dd in details:
data = {}
data["index"] = dd.find("i").text
data["name"] = dd.find("p", class_ = "name").text
data["star"] = dd.find("p", class_="star").text.strip()[3:]
data["time"] = dd.find("p", class_="releasetime").text.strip()[5:]
data["score"] = dd.find("p", class_="score").text
self.datas.append(data)
(6)savaData()函數
通過DataFrame(),把Top100的電影存儲到CSV文件中。
它默認的是按照列名的字典順序排序的。想要自定義列的順序,可以加columns字段
# 通過DataFrame,把Top100的電影存儲到CSV文件中
def saveData(self):
self.getPage()
data = pd.DataFrame(self.datas)
columns = ["index", "name", "star", "time", "score"]
data.to_csv(".\maoyanTop100.csv", index=False, columns=columns)
3、效果展示
4、完整代碼:
# -* conding: utf-8 *-
#author: wangshx6
#data: 2018-11-08
#description: 爬取貓眼TOP100榜的100部高分經典電影
import requests
from bs4 import BeautifulSoup
import pandas as pd
from fake_useragent import UserAgent
class MaoyanSpider(object):
def __init__(self,url):
self.headers = {"User-Agent": UserAgent().random}
self.url = url
self.datas = list()
# 通過for循環,獲取10頁的電影信息的源碼
def getPage(self):
for i in range(0,10):
url = self.url + "?offset={0}".format(i*10)
response = requests.get(url, headers = self.headers)
if response.status_code == 200:
self.parsePage(response.text)
else:
return None
# 通過BeautifulSoup獲取每頁10部電影的詳細信息
def parsePage(self, html):
soup = BeautifulSoup(html, "html.parser")
details = soup.find_all("dd")
for dd in details:
data = {}
data["index"] = dd.find("i").text
data["name"] = dd.find("p", class_ = "name").text
data["star"] = dd.find("p", class_="star").text.strip()[3:]
data["time"] = dd.find("p", class_="releasetime").text.strip()[5:]
data["score"] = dd.find("p", class_="score").text
self.datas.append(data)
# 通過DataFrame,把Top100的電影存儲到CSV文件中
def saveData(self):
self.getPage()
data = pd.DataFrame(self.datas)
columns = ["index", "name", "star", "time", "score"]
data.to_csv(".\maoyanTop100.csv", index=False, columns=columns)
if __name__ == "__main__":
url = "http://maoyan.com/board/4"
spider = MaoyanSpider(url)
spider.saveData()