[Python]簡單的爬網程式
最近去學了Python 有點後悔怎麼沒有早點認識他
Python寫起來真的很直覺 目前已經快要取代R 成為我的心頭好!
以下是筆記我的第一支爬網程式
by the way, GitHub的Gist服務實在是太棒溜~
Python寫起來真的很直覺 目前已經快要取代R 成為我的心頭好!
以下是筆記我的第一支爬網程式
by the way, GitHub的Gist服務實在是太棒溜~
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
__author__ = 'jackie.xu.tw' | |
import urllib.request | |
from html.parser import HTMLParser | |
class myparser(HTMLParser): | |
def __init__(self): | |
HTMLParser.__init__(self) | |
self.isNumber = 0 | |
self.numbers = [] | |
self.tag = '' | |
self.attr = '' | |
self.flg = 0 | |
self.subflg = 0 | |
self.MovieDes = {'電影名稱': [], '上映日期': '', '類型': [], '片長': '', '導演': [], '演員': [], '發行公司': '',\ | |
'官方網站': '', '劇情介紹': ''} | |
def handle_data(self, data): #將正確的data對應到正確的Key | |
if self.isNumber == 1: | |
if self.tag == 'h4': | |
self.MovieDes['電影名稱'].append(data) | |
if self.tag == 'h5': | |
self.MovieDes['電影名稱'].append(data) | |
if self.attr == [('class', 'tit')]: | |
self.flg = self.flg + 1 | |
if self.tag == 'a': | |
self.subflg = self.subflg + 1 | |
if self.flg == 1 and self.attr == [('class', 'dta')]: | |
self.MovieDes['上映日期']= data | |
if self.flg == 2 and self.subflg == 1: | |
self.MovieDes['類型'].append(data) | |
self.subflg = 0 | |
if self.flg == 3: | |
self.MovieDes['片長'] = data | |
if self.flg == 4 and self.subflg == 1: | |
self.MovieDes['導演'].append(data) | |
self.subflg = 0 | |
if self.flg == 5 and self.subflg == 1: | |
self.MovieDes['演員'].append(data) | |
self.subflg = 0 | |
if self.flg == 6: | |
self.MovieDes['發行公司'] = data | |
if self.flg == 7 and self.tag != 'div': | |
self.MovieDes['官方網站'] = data | |
if self.tag == 'div' and self.attr == [('class', 'text full')]: | |
self.MovieDes['劇情介紹'] = data | |
self.isNumber = 0 | |
def handle_starttag(self, tag, attrs): #利用位置抓出需要的資訊 | |
if (226 >= self.getpos()[0] >= 218) and ( tag == 'h4' or tag == 'h5' or (tag == 'span' and attrs == [('class','tit')]) \ | |
or (tag == 'span' and attrs == [('class','dta')]) or tag == 'a'): | |
self.isNumber = 1 | |
self.tag = tag | |
self.attr = attrs | |
if (self.getpos()[0] > 226) and (tag == 'div' and attrs == [('class', 'text full')]): #處理劇情介紹 | |
self.isNumber = 1 | |
self.tag = tag | |
self.attr = attrs | |
def handle_endtag(self,tag): | |
pass | |
def MovieOutput(url): | |
try: | |
data = urllib.request.urlopen(url) | |
content = data.read().decode('utf8') | |
data.close() | |
Parser = myparser() | |
Parser.feed(content) | |
MovieDes = Parser.MovieDes | |
filename = '/Users/Mypath/'+url[-4:]+'.txt' | |
print('電影名稱:', ','.join(MovieDes['電影名稱']),'\n' \ | |
'上映日期:', MovieDes['上映日期'], '\n' | |
'類\u3000\u3000型:',','.join(MovieDes['類型']),'\n', #利用 ','.join()方法將list取出並用','分隔 | |
'片\u3000\u3000長:',MovieDes['片長'],'\n', | |
'導\u3000\u3000演:',','.join(MovieDes['導演']),'\n', \ | |
'演\u3000\u3000員:',','.join(MovieDes['演員']),'\n', \ | |
'發行公司:',MovieDes['發行公司'],'\n', \ | |
'官方網站:',MovieDes['官方網站'],'\n', \ | |
'劇情介紹:',MovieDes['劇情介紹'],'\n', \ | |
sep = '',file=open(filename,'w',encoding='utf-8') | |
) | |
except: | |
print('發生Error') | |
else: | |
print('輸出成功至',filename) | |
MovieOutput('https://tw.movies.yahoo.com/movieinfo_main.html/id=5515') |
程式會爬yahoo電影的網頁 抓出我需要的資訊 並另存在一個txt檔案 結果像這樣
電影名稱:小小兵,Minions
上映日期:2015-07-09
類 型:動畫,喜劇
片 長:1時33分
導 演:《神偷奶爸》皮耶考芬,《羅雷司》凱爾巴爾達
演 員:(配音)《地心引力》珊卓布拉克,《神偷奶爸》史提夫卡爾,喬漢姆,《浪人47》真田廣之,《怒火狂飆》凱蒂米克松,《史瑞克2》珍妮佛珊德絲
發行公司:環球影業
官方網站:未提供
劇情介紹:由環球影業以及Illumination娛樂公司出品的《小小兵》故事起源於盤古開天時期,剛開始只是一個黃色的有機體,隨著時間漸漸演化成小小兵團,他們的存在目的就是要服侍當代最兇惡的主人,然而從T. Rex 恐龍,埃及法老王,拿破崙甚至是德古拉,小小兵總是不停的失敗了-到最後小小兵們發現已經沒有可以服侍的主人,從此開始鬱鬱寡歡,甚至逐漸凋零。這時其中的一隻小小兵—凱文他有個偉大的計畫,就是帶著他的麻吉—大胃王史都華還有膽小的蘿蔔,挺身而出踏上尋找新主人的冒險旅程…
請教您 如果執行一直出現 輸出 "發生錯誤" 的話是哪邊需要修改呢??
回覆刪除請問是你是直接用我的程式去跑 出現"發生錯誤"嗎 還是出現"發生error"
刪除作者已經移除這則留言。
回覆刪除您好 對 我是直接用您的程式去跑 但是印出 發生error 想請教 要改哪邊 可以正常抓組電影資訊 存出來呢??
回覆刪除已解決瞜~ 改了存檔路徑後能正常存取了 感謝
回覆刪除