很长时间未更新了,人懒了。

  最近有不少的东西,慢慢写吧,最近尝试了一下python 使用Redis 来构建分布式爬虫;

  单体爬虫有很多缺点,但是在学习过程中能够学习爬虫的基本理念与运行模式,在后期构建健壮的爬虫还是很有用的;获取代理,构造Header伪装,构造Referer..... 在分布式里一样一样的

  分布式爬虫,听起来就很高大上啊,运行起来也的确高大上;

=======================================================================================================

  安装Redis

1.官网下载redis的tar包
wget http://download.redis.io/releases/redis-4.0.9.tar.gz

2. 解压安装包到安装目录
tar xvf redis-4.0.9.tar.gz -C /usr/local/

3.cd /usr/local/redis-4.0.9

4. 编译安装
make
====================如果出现以下错误
In file included from adlist.c:34:0:
zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory
#include <jemalloc/jemalloc.h>
^
compilation terminated.
make[1]: *** [adlist.o] Error 1
make[1]: Leaving directory `/usr/local/redis-4.0.9/src'
make: *** [all] Error 2

则使用make MALLOC=libc
5. 测试是否安装成功
6. make test
======================make test 需要安装 tcl : yum -y install tcl
7. 测试成功

 

=======================================================================================================

 Shell 操作

1. 连接Redis server
src/redis-cli #默认连接地址: 127.0.0.1:6379
src/redis-cli --help #帮助
src/redis-cli -h 192.168.209.145 # 连接远程Redis server 未加认证
src/redis-cli -h 192.168.209.145 -a passwd -p 6379 # 连接指定的信息服务器port=6379,password=passwd

2. 插入数据
==================
如果连接后未认证,则
auth ***** # * 为passwd
也可连接时认证
==================
set key value # 语法

set age 20

3.读取数据
get key # 语法

get age
"20"

=======================================================================================================

  配置Redis.conf

以下是配置文件内容,大部分都是默认的;
更改:
bind 192.168.209.159 # 服务器ip, 如果是127.0.0.1则不能远程连接Redis

protected-mode no # 关闭保护模式

requirepass **** # 设置远程连接的密码

启动Redis src/redis-server 默认启动xxxxx
src/redis-server redis.conf 启动时加载配置文件

=======================================================================================================

Spider master 主要抓取URL的地址,并存入Redis

以下代码需要安装几个库,bs4, requests,redis,lxml

pip install 即可;

我使用的是pycharm IDE ,这几个包基本爬虫必备,基本功;

#!/usr/bin/env python
# coding:utf-8
# @Time : 2018/3/21 22:44
# @Author : maomao
# @File : Mzitumaster.py
# @Mail : mail_maomao@163.com from bs4 import BeautifulSoup
import requests
from redis import Redis
import time con = Redis(host="192.168.209.145",port=6379,password="tellusrd")
baseUrl = "http://www.mzitu.com/"
URL = baseUrl + "all" def getResponse(url):
contents = requests.get(url).text
return BeautifulSoup(contents,'lxml') def genObjs(**kwargs):
return kwargs def addRedis(key,value):
con.lpush(key,value) def getRedis(key):
value = con.rpop(key)
if value:
return eval(value.decode('utf-8'))
return None def getImagePages(url):
soup = getResponse(url)
pages = soup.find("div",attrs={'class':'pagenavi'}).find_all('span')[-2].text
return pages def getImagesUrl():
soup = getResponse(URL)
alltag = soup.find_all("a")
for tag in alltag:
url = tag.get('href')
preurl = url.split('/')[-1]
if preurl:
endurl = baseUrl + preurl
page = getImagePages(endurl)
data = genObjs(title=tag.text,url=endurl,page=page)
addRedis("objs",data) #### 以下两个自己测试用
def writeHost(data):
title = data['title']
url = data['url']
with open("mmurl.txt","a+",encoding="utf-8") as f:
f.write(title+"\t \t"+url+"\n") def getValues():
while True:
datas = getRedis("objs")
if datas:
writeHost(datas)
else:
break if __name__ == "__main__":
print(time.ctime())
getImagesUrl()
# getValues()
print(time.ctime())

Spider slave 从Redis 中获取目标URL 地址并执行下载任务

#!/usr/bin/env python
# coding:utf-8
# @Time : 2018/3/22 22:09
# @Author : maomao
# @File : Mzituspider.py
# @Mail : mail_maomao@163.com
from redis import Redis
from bs4 import BeautifulSoup
import requests
con = Redis(host="192.168.209.145",port=6379,password="tellusrd") def getResponse(url):
contents = requests.get(url).text
return BeautifulSoup(contents,'lxml') def getRedis(key):
value = con.rpop(key)
if value:
return eval(value.decode('utf-8'))
return None def getValues():
while True:
datas = getRedis("objs")
if datas:
mmtitle = datas['title']
page = datas['page']
for i in range(1, 2):
url = datas['url'] + "/" + str(i)
contents = getResponse(url)
imageurl = contents.find("div", attrs={"class": "main-image"}).find("img").get('src')
print(imageurl)
downImages(imageurl, url, mmtitle)
else:
break def downImages(url,referer,title):
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
'Referer': referer,
}
image = requests.get(url,headers=headers,stream=True)
name = url[-10:]
print("正在下载: ",title)
with open(name,'wb') as f:
f.write(image.content) if __name__ == "__main__":
getValues()

注: 以上部分运行测试没问题,最后的存储部分未写完,不想写;

自己的思路如下:

根据Title 建立独立的文件夹用来保存即可;

Python36 使用Redis 构建分布式爬虫(未完)的更多相关文章

  1. 基于Python,scrapy,redis的分布式爬虫实现框架

    原文  http://www.xgezhang.com/python_scrapy_redis_crawler.html 爬虫技术,无论是在学术领域,还是在工程领域,都扮演者非常重要的角色.相比于其他 ...

  2. Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session框架

    Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session import tornado.ioloop import tornado.web from myhas ...

  3. 《Redis官方文档》用Redis构建分布式锁

    用Redis构建分布式锁 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现一个分布式锁管理器,但是这些库实现的方式差别很大,而且很多简 ...

  4. Redis构建分布式锁

    1.前言 为什么要构建锁呢?因为构建合适的锁可以在高并发下能够保持数据的一致性,即客户端在执行连贯的命令时上锁的数据不会被别的客户端的更改而发生错误.同时还能够保证命令执行的成功率. 看到这里你不禁要 ...

  5. 阿里云Centos7.6上面部署基于redis的分布式爬虫scrapy-redis将任务队列push进redis

    Scrapy是一个比较好用的Python爬虫框架,你只需要编写几个组件就可以实现网页数据的爬取.但是当我们要爬取的页面非常多的时候,单个服务器的处理能力就不能满足我们的需求了(无论是处理速度还是网络请 ...

  6. 在阿里云Centos7.6上面部署基于Redis的分布式爬虫Scrapy-Redis

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_83 Scrapy是一个比较好用的Python爬虫框架,你只需要编写几个组件就可以实现网页数据的爬取.但是当我们要爬取的页面非常多的 ...

  7. Scrapy+redis实现分布式爬虫

    概述 什么是分布式爬虫 需要搭建一个由n台电脑组成的机群,然后在每一台电脑中执行同一组程序,让其对同一网络资源进行联合且分布的数据爬取. 原生Scrapy无法实现分布式的原因 原生Scrapy中调度器 ...

  8. 用Redis构建分布式锁-RedLock(真分布)

    在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现一个分布式锁管理器,但是这些库实现的方式差别很大,而且很多简单的实现其实只需采用稍微增 ...

  9. 使用redis构建分布式锁

    Redis使用WATCH命令来代替对数据进行加锁,因为WATCH只会在数据被其他客户端抢先修改了的情况下通知执行了这个命令的客户端,但是不会阻止其他客户端对数据进行修改,所以这个命令被称为乐观锁. 但 ...

随机推荐

  1. 页码pageNo与SQL的limit进行换算

    /** * 计算出页码 */ public static int getPageNo(int pageNo,int pageSize){ if (pageNo<=1){ return 0; } ...

  2. UiPath RPA培训2021.4版本解读 (2021年5月)-RPA学习天地

    2021年5月26日Ui Path发布了新产品2021.4版本,我们来看看有什么新功能: 说明一下uipath的版本发布节奏: uipath的版本一般是每年发布2个版本,其中5月份发布的一般是FTS版 ...

  3. Vue父子组件通信(父级向子级传递数据、子级向父级传递数据、Vue父子组件存储到data数据的访问)

    Vue父子组件通信(父级向子级传递数据.子级向父级传递数据.Vue父子组件存储到data数据的访问) 一.父级向子级传递数据[Prop]: ● Prop:子组件在自身标签上,使用自定义的属性来接收外界 ...

  4. Spring核心原理之 IoC容器中那些鲜为人知的细节(3)

    本文节选自<Spring 5核心原理> Spring IoC容器还有一些高级特性,如使用lazy-init属性对Bean预初始化.使用FactoryBean产生或者修饰Bean对象的生成. ...

  5. c++之Linux获取可用串口

    1.关于 这份代码来自: stackoverflow 2. 测试 2.1 测试环境: vmware + ubuntu, vmware添加串口(虚拟机关机后再添加) 2.2 测试输出 3. 源码 #in ...

  6. 【LeetCode】361. Bomb Enemy 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力搜索 日期 题目地址:https://leetco ...

  7. 【LeetCode】922. Sort Array By Parity II 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 使用奇偶数组 排序 奇偶数位置变量 日期 题目地址: ...

  8. hdu-1593 find a way to escape(贪心,数学)

    思路:两个人都要选取最优的策略. 先求外层那个人的角速度,因为他的角速度是确定的,再求内层人的当角速度和外层人一样时的对应的圆的半径r1.外层圆的半径为d; 那么如果r1>=外围圆的半径,那么肯 ...

  9. 一、golang以及vscode的安装和配置

    1.golang的下载安装 golang的官网最近好像整合了内容,统一到了一个地址:https://go.dev/ 首页直接点击download,下载自己对应的版本即可. 安装是傻瓜式的,一般默认安装 ...

  10. SpringCloud创建Config多客户端公共配置

    1.说明 基于已经创建好的Spring Cloud配置中心, 在配置中心仅保存一套配置文件, 多个客户端可以通过配置中心读取到相同的配置, 而不需要在每个客户端重复配置一遍, 下面以一个Config ...