python
缓存知乎发现上的链接和页面代码
from hashlib import sha1 #摘要算法
from urllib.parse import urljoin #url拼接
import pickle #模块实现了基本的数据序列化和反序列化
import re #正则
import requests #请求
import zlib #压缩解压缩
from bs4 import BeautifulSoup #最主要的功能是从网页抓取数据
from redis import Redis #redis
def main():
# 目标网站
base_url = '目标网址'
seed_url = urljoin(base_url, '拼接地址') #urljoin('url1','url2')
# 连接redis
client = Redis(host='xx.xx.xx.xx', port=6379, password='密码')
# 设置用户代理(防止访问被拒)
headers = {'user-agent': 'Baiduspider'}
# 通过requests模块发送GET请求并指定用户代理
resp = requests.get(seed_url, headers=headers)
# 创建BeautifulSoup对象并指定使用lxml作为解析器
soup = BeautifulSoup(resp.text, 'lxml') #resq.text 读取页面的内容
href_regex = re.compile(r'正则表达式') #利用compile生成一个规则模式吧,然后利用findall将BeautifulSoup对象内容进行匹配
# 将URL处理成SHA1摘要(长度固定更简短)
hasher_proto = sha1()
# 查找所有href属性
for a_tag in soup.find_all('a', {'href': href_regex}): #用正则匹配 a标签
# 获取a标签的href属性值并组装完整的URL
href = a_tag.attrs['href']
full_url = urljoin(base_url, href)
# 传入URL生成SHA1摘要
hasher = hasher_proto.copy() #函数返回一个字典的浅复制
hasher.update(full_url.encode('utf-8')) #encode指定的编码格式编码字符串
field_key = hasher.hexdigest() #hexdigest实际上返回的是16进制的str形式,digest返回的是bytes
# 如果Redis的键 (关键词)对应的hash数据类型中没有URL的摘要就访问页面并缓存
if not client.hexists('关键词', field_key):
html_page = requests.get(full_url, headers=headers).text
# 对页面进行序列化和压缩操作
zipped_page = zlib.compress(pickle.dumps(html_page)) #compress 压缩 )
# 使用hash数据类型保存URL摘要及其对应的页面代码
client.hset('关键词', field_key, zipped_page) #hset()操作,一次设置一个key-value值
# 显示总共缓存了多少个页面
print('Total %d pages found.' % client.hlen('关键词'))
if __name__ == '__main__':
main()