2015-07-20 28 views
0

我沒有做過多的網絡抓取我的經驗。到目前爲止,我正在使用python並使用BeautifulSoup4來刮取黑客新聞頁面。網絡抓取是否有圖案?

只是想知道是否有模式,我應該記住之前做刮。現在代碼看起來非常難看,我覺得自己像一個黑客。

代碼:

import requests 
from bs4 import BeautifulSoup 

class Command(BaseCommand): 

page = {} 
td_count = 2 
data_count = 0 

def handle(self, *args, **options): 
    for i in range(1,4): 
     self.page_no = i 
     self.parse() 
    print self.page[1] 


def get_result(self): 
    return requests.get('https://news.ycombinator.com/news?p=%s'% self.page_no) 

def parse(self): 
    soup = BeautifulSoup(self.get_result().text, 'html.parser') 
    for x in soup.find_all('table')[2].find_all('tr'): 
     self.data_count += 1 
     self.page[self.data_count] = {'other_data' : None, 'url' : ''} 
     if self.td_count%3 == 0: 
      try: 
       subtext = x.find_all('td','subtext')[0] 
       self.page[self.data_count - 1]['other_data'] = subtext 
      except IndexError: 
       pass 

     title = x.find_all('td', 'title') 
     if title: 
      try: 
       self.page[self.data_count]['url'] = title[1].a 
       print title[1].a 
      except IndexError: 
       print 'Done page %s'%self.page_no 
     self.td_count +=1 
+0

爲什麼不試試[scrapy(http://scrapy.org/)? – liushuaikobe

+0

如果我沒有錯,它的非麻省理工?我會嘗試一下 –

回答

1

其實我表現scrappable數據作爲我的域的一部分(業務)的數據,這允許我使用領域驅動設計到結構問題:

實體和值對象

我使用實體和值對象來將正確提取的信息從數據存儲到我的編程語言數據結構中,所以我可以用它們很好地處理它們。

庫模式

我使用存儲庫模式來收集數據的工作委託給不同的類。存儲庫類被賦予一個站點,然後提取數據並在需要時預先構建實體。

變壓器/演示模式

從存儲庫獲取數據後,我的HTML數據傳遞到一個演示者類。演示者類有責任從給定的HTML字符串中創建我的業務實體/值對象。

服務層

如果有除上述那些,我做一個服務類,這是解決問題的包裝,它調用的庫,所取得的數據給人以演示構建演示多個過程實體和完成後,結果可能會被另一個服務用於存儲在SQL數據庫中。

如果您熟悉PHP,我已經編程Laravel一個小應用程序,它獲取給定網站的Alexa排名各15分鐘,並通過電子郵件通知網站的用戶。