根据我的经验,我没有做过太多的网络抓取工作。到目前为止,我正在使用 python 并使用 BeautifulSoup4
来抓取 hackernews 页面。
只是想知道在进行抓取之前是否应该记住一些模式。现在代码看起来非常丑陋,我感觉就像是黑客。
代码:
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
最佳答案
实际上,我将可废弃的数据作为我的域(业务)数据的一部分,这允许我使用域驱动设计来构建问题:
实体和值对象
我使用实体和值对象将从数据中提取的正确信息存储到我的编程语言数据结构中,因此我可以很好地使用它们。
存储库模式
我使用存储库模式将收集数据的工作委托(delegate)给不同的类。存储库类被赋予一个站点,然后获取数据并在需要时预构建实体。
Transformer/Presenter 模式
从存储库获取数据后,我将 html 数据传递给演示者类。 Presenter 类的职责是从给定的 HTML 字符串创建我的业务实体/值对象。
服务层
如果有比上述更多的过程,我会创建一个服务类,它是问题的包装器,它调用存储库,将获取的数据提供给演示者,演示者构建实体,完成后,结果可能被另一个服务使用并存储在 SQL 数据库中。
如果您熟悉 PHP,我在 Laravel 中编写了一个小应用程序,它每 15 分钟获取给定网站的 Alexa 排名,并通过电子邮件通知该网站的订阅者。
关于python - 网络抓取有模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31511196/