買了本書,《Python 3.5從零開始學》,根據書中例程改寫了一個抓取豆瓣Top250電影信息的小爬蟲練練手,完成了爬取信息寫入文件,Linux下編譯通過。
#!/usr/bin/python3 # *_* coding:utf8 *_* from urllib import request from http import cookiejar import re import pymysql class MovieTop(object): def __init__(self): self.start=0 self.param='&filter=' self.headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1;WOW64)'} self.movie_list=[] #用於保存電影信息 self.page_content=[] #用於保存網頁內容 def get_page(self): try: while self.start<255: #255 #豆辨top250網址 url='https://movie.douban.com/top250?start='+str(self.start) req=request.Request(url,headers=self.headers) response=request.urlopen(req) page=response.read().decode('utf-8') page_num=(self.start+25)/25 print('正在抓取,第'+str(page_num)+'頁數據...') self.start+=25 self.page_content.append(page) except request.URLError as e: if hasattr(e,'reason'): print('抓取失敗,失敗原因:',e.reason) def get_movies(self): #獲取網頁內容 self.get_page() #解析網頁內容 reObj = re.compile(u'<div.*?class="item">.*?' + u'<div.*?class="pic">.*?' + u'<em.*?class="">(.*?)</em>.*?' + u'<div.*?class="info">.*?' + u'<span.*?class="title">(.*?)' + u'</span>.*?<span.*?class="title"> / (.*?)</span>.*?' + u'<span.*?class="other"> / (.*?)</span>.*?</a>.*?' + u'<div.*?class="bd">.*?<p.*?class="">.*?' + u'導演: (.*?) .*?<br>' + u'\n\D*(.*?) / (.*?) / ' + u'(.*?)\n\D*</p>.*?<div.*?class="star">.*?' + u'<span.*?' + u'class="rating_num".*?property="v:average">' + u'(.*?)</span>.*?' + u'.*?<span>(.*?)人評價</span>.*?' + u'<p.*?class="quote">.*?' + u'<span.*?class="inq">(.*?)' + u'</span>.*?</p>', re.S) movies = reObj.findall(' '.join(self.page_content)) #保存到movie_list for movie in movies: self.movie_list.append([movie[0], movie[1], movie[2], movie[3], movie[4], movie[5], movie[6], movie[7], movie[8], movie[9], movie[10]]) #TODO:保存到失據庫 def save_to_db(self,movies): # 建立連接 db = pymysql.connect('localhost', 'root', 'xxxx', 'test') # 第一,遊標 cursor = db.cursor() # 執行語句 cursor.execute('select * from movies') # 取一行 data = cursor.fetchone() print(data) # 關閉連接 db.close() #保存到文件 def write_to_file(self): f_name = 'douban_movies' fp = open(f_name, 'w') for movie in self.movie_list: fp.write('電影排名:' + movie[0] + '\r\n') fp.write('電影名稱:' + movie[1] + '\r\n') fp.write('外文名稱:' + movie[2] + '\r\n') fp.write('電影別名:' + movie[3] + '\r\n') fp.write('導演姓名:' + movie[4] + '\r\n') fp.write('上映年份:' + movie[5] + '\r\n') fp.write('製作國家/地區:' + movie[6] + '\r\n') fp.write('電影類別:' + movie[7] + '\r\n') fp.write('電影評分:' + movie[8] + '\r\n') fp.write('參評人數:' + movie[9] + '\r\n') fp.write('簡短影評:' + movie[10] + '\r\n\r\n') fp.close() print("電影數據寫入文件完畢!") if __name__ == "__main__": #創建對象 mt=MovieTop() print("開始數據抓取...") mt.get_movies() mt.write_to_file() print("數據抓取完成!")
結果示例:
電影排名:1 電影名稱:肖申克的救贖 外文名稱:The Shawshank Redemption 電影別名:月黑高飛(港) / 刺激1995(臺) 導演姓名:弗蘭克·德拉邦特 Frank Darabont 上映年份:1994 製作國家/地區:美國 電影類別:犯罪 劇情 電影評分:9.7 參評人數:1917025 簡短影評:希望讓人自由。 電影排名:2 電影名稱:霸王別姬 外文名稱:Forrest Gump 電影別名:福雷斯特·岡普 導演姓名:羅伯特·澤米吉斯 Robert Zemeckis 上映年份:1994 製作國家/地區:美國 電影類別:劇情 愛情 電影評分:9.5 參評人數:1457430 簡短影評:一部美國近現代史。 電影排名:4 電影名稱:這個殺手不太冷 外文名稱:Léon 電影別名:殺手萊昂 / 終極追殺令(臺) 導演姓名:呂克·貝鬆 Luc Besson 上映年份:1994 製作國家/地區:法國 電影類別:劇情 動作 犯罪 電影評分:9.4 參評人數:1652942 簡短影評:怪蜀黍和小蘿莉不得不說的故事。 電影排名:5 電影名稱:美麗人生 外文名稱:La vita è bella 電影別名:一個快樂的傳說(港) / Life Is Beautiful 導演姓名:羅伯託·貝尼尼 Roberto Benigni 上映年份:1997 製作國家/地區:意大利 電影類別:劇情 喜劇 愛情 戰爭 電影評分:9.5 參評人數:923870 簡短影評:最美的謊言。