python - 网络抓取有模式吗?

标签 python django web-scraping beautifulsoup

根据我的经验,我没有做过太多的网络抓取工作。到目前为止,我正在使用 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/

相关文章:

Python OpenCV 视频分辨率

django - 使用自定义模板标签时出错 - 对象不支持项目分配

jquery - 如何构建允许同时上传多个文件的网络文件 uploader ?

html - 通过 Excel VBA 使用 JS 登录网站

jquery - 获取多个元素的文本作为单独的值

python - Flask-RESTful 类方法内的断点不会在 PTVS 上命中

python - 如何向CentOS服务器上的其他用户授予虚拟环境的访问权限

python - 如果 if 语句为真,则扩展和替换

python - 提高 Django 中的 INSERT 性能以处理大量大量数据的记录

javascript - 如何将变量传递给评估函数?