学习python 第三十四天

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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mr.杰瑞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值