[Python]簡單的爬網程式

最近去學了Python 有點後悔怎麼沒有早點認識他

Python寫起來真的很直覺 目前已經快要取代R 成為我的心頭好!

以下是筆記我的第一支爬網程式

by the way, GitHub的Gist服務實在是太棒溜~


__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 恐龍,埃及法老王,拿破崙甚至是德古拉,小小兵總是不停的失敗了-到最後小小兵們發現已經沒有可以服侍的主人,從此開始鬱鬱寡歡,甚至逐漸凋零。這時其中的一隻小小兵—凱文他有個偉大的計畫,就是帶著他的麻吉—大胃王史都華還有膽小的蘿蔔,挺身而出踏上尋找新主人的冒險旅程…

留言

  1. 請教您 如果執行一直出現 輸出 "發生錯誤" 的話是哪邊需要修改呢??

    回覆刪除
    回覆
    1. 請問是你是直接用我的程式去跑 出現"發生錯誤"嗎 還是出現"發生error"

      刪除
  2. 作者已經移除這則留言。

    回覆刪除
  3. 您好 對 我是直接用您的程式去跑 但是印出 發生error 想請教 要改哪邊 可以正常抓組電影資訊 存出來呢??

    回覆刪除
  4. 已解決瞜~ 改了存檔路徑後能正常存取了 感謝

    回覆刪除

張貼留言

這個網誌中的熱門文章

R中Try and Catch的寫法

如何將DSM(NAS)變成Mail Server

如何安裝.tgz的檔案至Ubuntu