一:python操作redis
1.redis
的安装与连接
安装
pip install redis
连接
r = redis.StrictRedis(host='localhost',port=6379,db=0)
2.redis
数据类型相关操作
(1)字符串相关操作
import redis
class TestString(object):
def __init__(self):
self.r = redis.StrictRedis(host='127.0.0.1', port=6379)
def test_set(self):
res = self.r.set('user1', 'yueyue-1')
print(res)
def test_get(self):
res = self.r.get('user1')
print(res,type(res))
res = res.decode('UTF-8')
print(res, type(res))
def test_mset(self):
d = {
'user2': 'yueyue-2',
'user3': 'yueyue-3'
}
res = self.r.mset(d)
print(res)
def test_mget(self):
l = ['user2', 'user3']
res = self.r.mget(l)
print(res)
def test_del(self):
self.r.delete('user2')
if __name__ == '__main__':
t = TestString()
t.test_get()
(2)列表相关操作
import redis
class TestList(object):
def __init__(self):
self.r = redis.StrictRedis(host='localhost', port=6379, db=1)
def test_push(self):
res = self.r.lpush('common', '1')
print(res)
res = self.r.rpush('common', '2')
print(res)
def test_pop(self):
res = self.r.lpop('common')
res = self.r.rpop('common')
def test_range(self):
res = self.r.lrange('common', 0, -1)
print(res)
if __name__ == '__main__':
t = TestList()
t.test_range()
(3)集合相关操作
import redis
class TestSet(object):
def __init__(self):
self.r = redis.StrictRedis(host='localhost', port=6379, db=1)
def test_sadd(self):
res = self.r.sadd('set01', '1', '2')
def test_del(self):
res = self.r.srem('set01', 1)
def test_pop(self):
res = self.r.spop('set01')
if __name__ == '__main__':
t = TestSet()
t.test_pop()
(4)哈希相关操作
import redis
class TestHash(object):
def __init__(self):
self.r = redis.StrictRedis(host='localhost', port=6379, db=1)
def test_hset(self):
dic = {
'id': 1,
'name': 'huawei'
}
res = self.r.hmset('mobile', dic)
def test_hgetall(self):
res = self.r.hgetall('mobile')
print(res)
def test_hexists(self):
res = self.r.hexists('mobile', 'id')
print(res)
if __name__ == '__main__':
t = TestHash()
t.test_hexists()
二:scrapy_redis
操作分布式爬虫
1.scrapy-redis
介绍
1 Scrapy分布式爬虫意味着几台机器通过某种方式共同执行一套爬取任务,
这就首先要求每台机器都要有Scrapy框架,一套Scrapy框架就有一套Scrapy五大核心组件,
引擎--调度器--下载器--爬虫--项目管道,各自独有的调度器没有办法实现任务的共享,
所以不能实现分布式爬取。
2 假设可以实现Scrapy框架的调度器共享,那么就能实现分布式爬取了吗?
答案是不能,因为我们实现了任务的共享,但是框架之间的项目管道是单独的,
我们的任务下载完之后,我们爬取的有效信息还是不能全部存放在某个指定的位置,
所以要想实现分布式爬虫,需要同时满足调度器和项目管道的共享才可以达到分布式的效果。
2.共享爬取队列的维护
集合 无序且不重复 请求去重 达到去重的效果
3.scrapy-redis
工作流程
4.scrapy_redis
中的settings
文件
SPIDER_MODULES = ['example.spiders']
NEWSPIDER_MODULE = 'example.spiders'
USER_AGENT = 'scrapy-redis (+https://github.com/rolando/scrapy-redis)'
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
ITEM_PIPELINES = {
'example.pipelines.ExamplePipeline': 300,
'scrapy_redis.pipelines.RedisPipeline': 400,
}
LOG_LEVEL = 'DEBUG'
DOWNLOAD_DELAY = 1
5.运行结束后redis
中多了三个键
dmoz:requests 存储待爬取的请求对象。
这些请求可能包括爬取的URL、请求头、请求体等信息。
Scrapy使用这些请求对象来发送HTTP请求并获取响应数据。
dmoz:item 存储已经爬取到的数据。
这些数据可能包括HTML页面中提取的文本、链接、图片等信息。
Scrapy使用这些数据来进行进一步的分析和处理。
dmoz:dupefilter 存储已经爬取过的请求的指纹。
Scrapy使用指纹来避免重复爬取同一个URL。
如果一个请求的指纹已经存在于dupefilter中,那么Scrapy将不会再次爬取该请求。
6.setings
文件的补充
setings.py
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'
}
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 400,
}