Python爬虫入门教程 增量爬虫不得不说的故事

871 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

孰能生巧,用在技术领域在通用不过了,作为一个初学者,需要牢固的掌握技术,那必须依赖自己每日的耕耘。我是梦想橡皮擦,希望某天我们在高处相逢。

写在前面

看完标题之后,如果你对什么是增量爬虫产生了疑问,恭喜,你又将有收获了,如果你没有疑问,厉害,高手~

增量爬虫其实是一种内容爬取的叫法,增量就是增加的量,我们的爬虫当爬取完毕一个网址之后,某些网站会在原来的数据上又更新了一批,例如虎嗅的头条推荐、小说网的章节更新等等其他只要存在动态更新的网站,其实都适用于增量爬虫。

这样我们就可以给增量爬虫做一个简单的定义了:在上一次爬取的结果上再次进行爬取

编码开始

我们接下来就通过爬虫程序检测某个网站,当该网站更新时,我们进行增量爬取。

该网站是搜狗搜索平台:https://weixin.sogou.com/,可以跟踪热点新闻

增量爬虫的核心是去重

关于去重的办法其实就三种

  1. 发起请求前判断该 URL 是否请求过
  2. 解析内容之后判断内容是否获取过
  3. 存储时判断内容是否已经存在

三种去重方法逻辑使用的场景也比较容易判断

  1. 发起请求之前进行判断,该情况最常见,例如新闻、小说、资讯更新都可以,只要页面出现了新的链接都可以使用
  2. 第二种适用于某页面数据刷新了,并未增加新的链接
  3. 第三种是最后一个逻辑,入库前在做最后一次判断

去重手段

本篇博客会将爬取过程中产生的 URL 进行存储,核心利用的是 redis 里面的 set

对于在 Python 中使用 redis,这属于陈年老问题了,只需要稍微回忆一下即可应用,注意先安装redis

简单进行连接,然后使用 conn.sadd 进行集合的添加,sadd 可以向集合中插入一条数据,成功返回 1,失败返回 0,我们基于此就可以对增量爬虫进行判断了。

def reids_conn(title):
    conn = redis.Redis(host='127.0.0.1',port=6379)
    return conn.sadd('1',title)

完整代码展示

本篇博客核心介绍的是增量爬虫认知,代码中并没有多少新知识,我直接做展示,并在注释中作一些补充说明。 注意下述代码中,通过 title 字段进行的重复检验,其实这里可以适当进行编码,在进行判断,直接用中文验证不是很职业。

import requests
from lxml import etree
import redis
import time
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36"
}
# 准备要爬取的链接
# https://weixin.sogou.com/

def run():
    while 1:  # 设置一个死循环,并在循环内部设置一下循环间隔
        url = "https://weixin.sogou.com/"
        res = requests.get(url,headers=headers)
        res.encoding='utf-8'
        html = res.text # 获取网页数据
        parse(html)
        time.sleep(300) # 5*60 = 300s 表示5分钟循环获取一次
        print("再次获取...")

def parse(html):
    html_element = etree.HTML(html)
    result = html_element.xpath('//h3//a[@uigs]')
    for item in result:
        href = item.get("href")
        title = item.text
        ex = reids_conn(title) # 判断该信息是否爬取过,没有即可抓取
        if ex == 1:
            print(f"正在爬取中{href}")


def reids_conn(title):
	# redis 连接
    conn = redis.Redis(host='127.0.0.1',port=6379)
    return conn.sadd('1',title) # 向集合中添加title,并通过title进行判断
if __name__ == "__main__":
    run()

运行结果

最终将项目运行起来,等着收获数据即可,这里我没有进行内页的抓取,如果需要可以在增加一个函数即可,当然对于requestslxml两个类库来说,你可以任意进行更换 Python爬虫入门教程 77-100 增量爬虫不得不说的故事

写在后面

希望从这篇博客你能 GET 到增量爬虫这一概念,技术上本篇博客并无难点,加油搞定吧。