1. 程式人生 > >Python采集實例1

Python采集實例1

reset parser url star 則表達式 lib ref www. 處理

目標是把http://www.gg4493.cn/主頁上所有數據爬取下來,獲得每一篇新聞的名稱、時間、來源以及正文。
接下來分解目標,一步一步地做。
步驟1:將主頁上所有鏈接爬取出來,寫到文件裏。
python在獲取html方面十分方便,寥寥數行代碼就可以實現我們需要的功能。
復制代碼代碼如下:
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
page.close()
return html
我們都知道html鏈接的標簽是“a”,鏈接的屬性是“href”,也就是要獲得html中所有tag=a,attrs=href 值。
查閱了資料,一開始我打算用HTMLParser,而且也寫出來了。但是它有一個問題,就是遇到中文字符的時候無法處理。
復制代碼代碼如下:


class parser(HTMLParser.HTMLParser):
def handle_starttag(self, tag, attrs):
if tag == ‘a‘:
for attr, value in attrs:
if attr == ‘href‘:
print value


後來使用了SGMLParser,它就沒有這個問題。
復制代碼代碼如下:


class URLParser(SGMLParser):
def reset(self):
SGMLParser.reset(self)
self.urls = []

def start_a(self,attrs):
href = [v for k,v in attrs if k==‘href‘]
if href:
self.urls.extend(href)
SGMLParser針對某個標簽都需要重載它的函數,這裏是把所有的鏈接放到該類的urls裏。
復制代碼代碼如下:


lParser = URLParser()#分析器來的
socket = urllib.urlopen("http://www.gg4493.cn/")#打開這個網頁
fout = file(‘urls.txt‘, ‘w‘)#要把鏈接寫到這個文件裏
lParser.feed(socket.read())#分析啦
reg = ‘http://www.gg4493.cn/.*‘#這個是用來匹配符合條件的鏈接,使用正則表達式匹配
pattern = re.compile(reg)
for url in lParser.urls:#鏈接都存在urls裏
if pattern.match(url):
fout.write(url+‘\n‘)
fout.close()

Python采集實例1