## 存储数据
存储海量数据
数据持久化的首选方案应该是关系型数据库,关系型数据库的产品很多,包括:Oracle、MySQL、SQLServer、PostgreSQL等。如果要存储海量的低价值数据,文档数据库也是不错的选择,MongoDB是文档数据库中的佼佼者,之前我们已经讲解过MongDB的相关知识,在此不再进行赘述。
数据缓存
通过《网络数据采集和解析》一文,我们已经知道了如何从指定的页面中抓取数据,以及如何保存抓取的结果,但是我们没有考虑过这么一种情况,就是我们可能需要从已经抓取过的页面中提取出更多的数据,重新去下载这些页面对于规模不大的网站倒是问题也不大,但是如果能够把这些页面缓存起来,对应用的性能会有明显的改善。可以使用Redis来提供高速缓存服务,关于Redis的知识,我们在《NoSQL入门》一文中已经做过简要的介绍。
实例 - 缓存知乎发现上的链接和页面代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| from hashlib import sha1 from urllib.parse import urljoin
import pickle import re import requests import zlib
from bs4 import BeautifulSoup from redis import Redis
def main(): base_url = 'https://www.zhihu.com/' seed_url = urljoin(base_url, 'explore') client = Redis(host='1.2.3.4', port=6379, password='1qaz2wsx') headers = {'user-agent': 'Baiduspider'} resp = requests.get(seed_url, headers=headers) soup = BeautifulSoup(resp.text, 'lxml') href_regex = re.compile(r'^/question') hasher_proto = sha1() for a_tag in soup.find_all('a', {'href': href_regex}): href = a_tag.attrs['href'] full_url = urljoin(base_url, href) hasher = hasher_proto.copy() hasher.update(full_url.encode('utf-8')) field_key = hasher.hexdigest() if not client.hexists('zhihu', field_key): html_page = requests.get(full_url, headers=headers).text zipped_page = zlib.compress(pickle.dumps(html_page)) client.hset('zhihu', field_key, zipped_page) print('Total %d question pages found.' % client.hlen('zhihu'))
if __name__ == '__main__': main()
|