Redis是一個(gè)開源的使用ANSI C語言編寫、遵守BSD協(xié)議闭翩、支持網(wǎng)絡(luò)挣郭、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫疗韵,并提供多種語言的API兑障。
在上篇文章中我們提到了去重操作,并使用了Python中的集合set進(jìn)行了url的去重。然而流译,Redis中也存在的這種名為“集合”的數(shù)據(jù)類型逞怨,同樣可以用來進(jìn)行去重操作。
引入依賴庫
import requests
import redis
import fake_useragent
from lxml import etree
本文使用的解析庫依然是lxml福澡。當(dāng)然叠赦,使用re或者bs4也是可以的。
請(qǐng)求連接
首先需要連接redis革砸,注意:一定要開啟redis除秀。
redis-server
定義1個(gè)全局變量cli用于實(shí)例化Redis對(duì)象。
# 連接redis
cli = redis.Redis()
然后進(jìn)行循環(huán)請(qǐng)求业岁。
# 初始頁碼
i = 0
while True:
response = requests.get(
url=url.format(i),
headers=headers,
proxies=proxies,
)
# 頁碼+1
i += 1
# 將html轉(zhuǎn)化為可用xpath解析的對(duì)象
tree = etree.HTML(response.text)
# 解析頁面
link_and_title = get_data(tree)
# 展示數(shù)據(jù)
show_data(link_and_title)
# 如果redis中的數(shù)據(jù)大于1000則跳出循環(huán)
if cli.scard('jianshu:start_urls') > 1000:
break
print('完成任務(wù)鳞仙!')
解析頁面
使用xpath語句提取頁面信息。
def get_data(tree):
"""
解析頁面
:param tree: xpath對(duì)象
:return: title link
"""
title = tree.xpath('//div[@id="list-container"]/ul/li/div[@class="content"]/a[@class="title"]/text()')
link = tree.xpath('//div[@id="list-container"]/ul/li/div[@class="content"]/a[@class="title"]/@href')
# 將鏈接與標(biāo)題合并為1個(gè)字典
link_and_title = dict(zip(link, title))
return link_and_title
展示數(shù)據(jù)
def show_data(link_and_title):
"""
通過redis展示數(shù)據(jù)
:param link_and_title: 文章鏈接與標(biāo)題
:return: None
"""
for k in link_and_title.keys():
# 向redis集合中添加鏈接
judge = cli.sadd('jianshu:start_urls', k)
# 獲取集合中的數(shù)據(jù)數(shù)量
num = cli.scard('jianshu:start_urls')
if num > 1000:
break
if judge:
link = 'http://www.reibang.com' + k
print(num, link, link_and_title[k])
雖然該函數(shù)為show_data(展示數(shù)據(jù))笔时,但其核心是對(duì)redis的操作棍好,包括sadd向集合插入數(shù)據(jù)、scard獲取集合中的數(shù)據(jù)數(shù)量允耿。
結(jié)語
上述show_data函數(shù)中借笙,我們向redis集合中添加了url鏈接,所以說较锡,當(dāng)使用多臺(tái)pc端連接redis進(jìn)行爬取時(shí)业稼,便達(dá)到了分布式的效果。
分布式爬蟲說白了就是把爬蟲的關(guān)鍵功能以分布式形式部署到多臺(tái)機(jī)器上然后一起爬它蚂蕴,所以說我們一般要配合一些異步操作以最大化爬蟲效率低散,其中,多線程和協(xié)程是爬蟲中的常用異步技術(shù)骡楼,接下來我們將開啟多線程技術(shù)應(yīng)用到爬蟲中熔号。
本章的完整代碼請(qǐng)參考下面鏈接。
https://github.com/macxin123/spider/blob/master/jianshu/redis_jianshu.py