首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用缓存抓取SEDE查询结果

使用缓存抓取SEDE查询结果
EN

Code Review用户
提问于 2015-12-14 23:30:18
回答 1查看 157关注 0票数 6

我使用这个脚本来抓取SEDE页面的结果并作为BeautifulSoup对象返回。

一个小问题是,如果我几天没有在浏览器中手动使用SEDE查询,那么非交互式下载就会得到空结果。(我怀疑那里有机器人测试。)

我的解决办法不是修复机器人测试问题,而是缓存成功下载的页面,并在下载不正常时使用缓存。

代码语言:javascript
复制
import logging
import os

import requests
from bs4 import BeautifulSoup

BASE_DIR = os.path.dirname(__file__)
CACHE_DIR = os.path.join(BASE_DIR, '.cache')


def fetch_sede_soup(label, url):
    def is_valid(soup):
        for script in soup.findAll('script'):
            if 'resultSets' in script.text:
                return True
        return False

    if not os.path.isdir(CACHE_DIR):
        os.mkdir(CACHE_DIR)

    logging.info('fetching {} as {}'.format(label, url))
    html = requests.get(url).text
    soup = BeautifulSoup(html)

    cache_path = os.path.join(CACHE_DIR, '{}.html'.format(label))
    debug_cache_path = os.path.join(CACHE_DIR, '{}-debug.html'.format(label))

    if is_valid(soup):
        logging.info('updating cache')
        with open(cache_path, 'w') as fh:
            fh.write(html)
        return soup

    with open(debug_cache_path, 'w') as fh:
        fh.write(html)

    logging.warning('result not valid')
    if os.path.exists(cache_path):
        logging.info('using previous cache')
        with open(cache_path) as fh:
            return BeautifulSoup(fh)

这能写得更好吗?

如果有帮助,下面是一些示例输出文件:

EN

回答 1

Code Review用户

回答已采纳

发布于 2015-12-15 00:02:07

它显示了您以前编写过代码,所以就风格而言,没有什么可评论的。我要评论的是关于代码结构的几点:

  • 单责任关注点- Your函数是名称fetch_sede_soup(),所有操作都与此相关。但是,如果需要,它仍然会创建CACHE_DIR,编写输出文件,在内部函数中验证有效性。这可以分为更多的功能,虽然它不是非常大,很难得到概述。我至少要添加一个新函数,这一点与中间的return soup有关。这之后的代码似乎是错误处理,但它在某种程度上被return隐藏了,因此不太清楚。如果将剩余的部分移到函数中,您将看到一个return soup,后面跟着一个调用错误处理的else:子句。
  • 添加注释和docstring- As(函数处理的不同方面的副作用),我至少会在代码中添加更多的注释。这可以使更多的功能保持在更大的范围内,同时仍然保持可读性。
  • mkdir - Especially的外部os调用中添加错误处理,比如mkdir,我会添加try ... except代码来处理潜在的错误情况。在调用此方法作为初始化的一部分之前,可能会执行与创建CACHE_DIR相关的代码。

但是总的来说,代码很好,很干净,但是在os操作的文档和错误处理方面有点薄弱。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/113982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档