我使用这个脚本来抓取SEDE页面的结果并作为BeautifulSoup对象返回。
一个小问题是,如果我几天没有在浏览器中手动使用SEDE查询,那么非交互式下载就会得到空结果。(我怀疑那里有机器人测试。)
我的解决办法不是修复机器人测试问题,而是缓存成功下载的页面,并在下载不正常时使用缓存。
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)这能写得更好吗?
如果有帮助,下面是一些示例输出文件:
发布于 2015-12-15 00:02:07
它显示了您以前编写过代码,所以就风格而言,没有什么可评论的。我要评论的是关于代码结构的几点:
fetch_sede_soup(),所有操作都与此相关。但是,如果需要,它仍然会创建CACHE_DIR,编写输出文件,在内部函数中验证有效性。这可以分为更多的功能,虽然它不是非常大,很难得到概述。我至少要添加一个新函数,这一点与中间的return soup有关。这之后的代码似乎是错误处理,但它在某种程度上被return隐藏了,因此不太清楚。如果将剩余的部分移到函数中,您将看到一个return soup,后面跟着一个调用错误处理的else:子句。mkdir - Especially的外部os调用中添加错误处理,比如mkdir,我会添加try ... except代码来处理潜在的错误情况。在调用此方法作为初始化的一部分之前,可能会执行与创建CACHE_DIR相关的代码。但是总的来说,代码很好,很干净,但是在os操作的文档和错误处理方面有点薄弱。
https://codereview.stackexchange.com/questions/113982
复制相似问题