一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情。
孰能生巧,用在技术领域在通用不过了,作为一个初学者,需要牢固的掌握技术,那必须依赖自己每日的耕耘。我是梦想橡皮擦,希望某天我们在高处相逢。
写在前面
看完标题之后,如果你对什么是增量爬虫产生了疑问,恭喜,你又将有收获了,如果你没有疑问,厉害,高手~
增量爬虫
其实是一种内容爬取的叫法,增量就是增加的量,我们的爬虫当爬取完毕一个网址之后,某些网站会在原来的数据上又更新了一批,例如虎嗅的头条推荐、小说网的章节更新等等其他只要存在动态更新的网站,其实都适用于增量爬虫。
这样我们就可以给增量爬虫
做一个简单的定义了:在上一次爬取的结果上再次进行爬取
编码开始
我们接下来就通过爬虫程序检测某个网站,当该网站更新时,我们进行增量爬取。
该网站是搜狗搜索平台:https://weixin.sogou.com/
,可以跟踪热点新闻
增量爬虫的核心是去重
关于去重的办法其实就三种
- 发起请求前判断该 URL 是否请求过
- 解析内容之后判断内容是否获取过
- 存储时判断内容是否已经存在
三种去重方法逻辑使用的场景也比较容易判断
- 发起请求之前进行判断,该情况最常见,例如新闻、小说、资讯更新都可以,只要页面出现了新的链接都可以使用
- 第二种适用于某页面数据刷新了,并未增加新的链接
- 第三种是最后一个逻辑,入库前在做最后一次判断
去重手段
本篇博客会将爬取过程中产生的 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()
复制代码
运行结果
最终将项目运行起来,等着收获数据即可,这里我没有进行内页的抓取,如果需要可以在增加一个函数即可,当然对于requests
和lxml
两个类库来说,你可以任意进行更换
写在后面
希望从这篇博客你能 GET 到增量爬虫这一概念,技术上本篇博客并无难点,加油搞定吧。