【Python3爬虫】学习分布式爬虫第一步--Redis分布式爬虫初体验

一、写在前面

  之前写的爬虫都是单机爬虫,还没有尝试过分布式爬虫,这次就是一个分布式爬虫的初体验。所谓分布式爬虫,就是要用多台电脑同时爬取数据,相比于单机爬虫,分布式爬虫的爬取速度更快,也能更好地应对IP的检测。本文介绍的是利用Redis数据库实现的分布式爬虫,Redis是一种常用的菲关系型数据库,常用数据类型包括String、Hash、Set、List和Sorted Set,重要的是Redis支持主从复制,主机能将数据同步到从机,也就能够实现读写分离。因此我们可以利用Redis的特性,借助requests模块发送请求,再解析网页和提取数据,实现一个简单的分布式爬虫。

二、基本环境

  Python版本:Python3

  Redis版本:5.0

  IDE: Pycharm

三、环境配置

由于Windows下的安装配置比较简单,所以这里只说Linux环境下安装和配置Redis(以Ubuntu为例)。

1.安装Redis

1)apt安装:

$ sudo apt-get install redis-server

2)编译安装:

$ wget http://download.redis.io/releases/redis-5.0.0.tar.gz

$ tar -xzvf redis-5.0.0.tar.gz

$ cd redis-5.0.0

$ make

$ make install

2.配置Redis

  首先找到redis.conf文件,然后输入命令sudo vi redis.conf,进行如下操作:

注释掉bind 127.0.0.1 # 为了远程连接,这一步还可以将bind 127.0.0.1改为bind 0.0.0.0

protected-mode yes 改为 protected-mode no

daemonized no 改为 daemonized yes

  如果6379端口被占用,还需要改一下端口号。除此之外,要远程连接还需要关闭防火墙。

chkconfig firewalld off  # 关闭防火墙

systemctl status firewalld  # 检查防火墙状态

3.远程连接Redis

  使用的命令为redis-cli -h <IP地址> -p <端口号>

  注:Windows查看IP地址用ipconfig,Linux查看IP地址用ifconfig。

四、基本思路

  这次我爬取的网站为:http://www.shu800.com/,在这个网站的首页里有五大分类,分别是性感美女、清纯可爱、明星模特、动漫美女和丝袜美腿,所以要做的第一件事就是获取这几个分类的URL。然后,对每个分类下的网页进行爬取,通过查看网页元素可以发现如下信息:

  可以很明显地看到每一页的URL都是符合一定规律的,只要获取到了尾页的URL,将其中的页数提取出来,也就能构造每一页的URL了,这就比每次去获取下一页的URL简单多了。而对于每一个图集下的图片,也是用同样的方法得到每一页图片的URL。最后要做的就是从图片网页中将图片的URL提取出来,然后下载保存到本地。

  这次分布式爬虫我使用了两台电脑,一台作为主机master,另一台作为从机slave。主机开启Redis服务,爬取每一页图片的URL,并将爬取到的URL保存到Redis的集合中,从机远程连接主机的Redis,监听Redis中是否有URL,如果有URL则提取出来进行下载图片,直至所有URL都被提取和下载。

五、主要代码

1.第一段代码是爬取每个页面里的美女图集的URL,并且把这些URL保存到数据库中,这里使用的是Redis中的集合,通过使用集合能够达到URL去重的目的,代码如下:

 1 def get_page(url):
 2     """
 3     爬取每个页面下的美女图集的URL
 4     :param url: 页面URL
 5     :return:
 6     """
 7     try:
 8         r = Redis(host="localhost", port=6379, db=1)  # 连接Redis
 9         time.sleep(random.random())
10         res = requests.get(url, headers=headers)
11         res.encoding = "utf-8"
12         et = etree.HTML(res.text)
13         href_list = et.xpath(‘/html/body/div[5]/div[1]/div[1]/div[2]/ul/li/a/@href‘)
14         for href in href_list:
15             href = "http://www.shu800.com" + href
16             r.sadd("href", href)  # 保存到数据库中
17     except requests.exceptions:
18         headers["User-Agent"] = ua.random
19         get_page(url)

2.第二段代码是从机监听Redis中是否有URL的代码,如果没有URL,等待五秒钟再运行,因为如果不稍作等待就直接运行,很容易超过Python的递归深度,所以我设置了一个等待五秒钟再运行。反之,如果有URL被添加到Redis中,就要将URL提取出来进行爬取,使用的方法是redis模块里的spop()方法,该方法会从Redis的集合中返回一个元素。需要注意的是,URL被提取出来后要先转成str。

 1 def get_urls():
 2     """
 3     监听Redis中是否有URL,如果没有就一直运行,如果有就提取出来进行爬取
 4     :return:
 5     """
 6     if b"href" in r.keys():
 7         while True:
 8             try:
 9                 url = r.spop("href")
10                 url = url.decode("utf-8")  # unicode转str
11                 print("Crawling URL: ", url)
12                 get_image(url)
13                 get_img_page(url)
14             except:
15                 if b"href" not in r.keys():  # 爬取结束,退出程序
16                     break
17                 else:
18                     continue
19     else:
20         time.sleep(5)
21         get_urls()

六、运行结果

  下图是在主机master上运行的截图,这里爬取到的图集总共有9633个:

  从机slave会不断地从Redis数据库中提取URL来爬取,下图是运行时的截图:

  打开文件夹看看爬下来的图片都有什么(都是这种标题,有点难顶啊...):

完整代码已上传到GitHub

原文地址:https://www.cnblogs.com/TM0831/p/11372833.html

时间: 2024-10-18 21:29:17

【Python3爬虫】学习分布式爬虫第一步--Redis分布式爬虫初体验的相关文章

VSTO学习笔记(十五)Office 2013 初体验

原文:VSTO学习笔记(十五)Office 2013 初体验 Office 2013 近期发布了首个面向消费者的预览版本,我也于第一时间进行了更新试用.从此开始VSTO系列全面转向Office 2013平台,即VSTO 5.0. 本系列所有测试代码均在Visual Studio 2012 Ultimate RC + Office 2013 Professional Plus x64 Preview 上测试通过 为了配合Windows 8,微软的很多软件风格都逐渐Metro化,Office作为拳头

爬虫学习之第六章Scrapy-Redis分布式组件

第一节:redis数据库介绍 概述 redis是一种支持分布式的nosql数据库,他的数据是保存在内存中,同时redis可以定时把内存数据同步到磁盘,即可以将数据持久化,并且他比memcached支持更多的数据结构(string,list列表[队列和栈],set[集合],sorted set[有序集合],hash(hash表)).相关参考文档:http://redisdoc.com/index.html redis使用场景: 登录会话存储:存储在redis中,与memcached相比,数据不会丢

学习Nodejs的第一步

最近看了几本关于Node.js的书,本来个人技术分享网站http://yuanbo88.com/是打算用Node.js作为服务器端语言来处理后台的,后来又改成了PHP(也是自己研究,毕竟网上DEMO多,文档全,而且公司有同事可以请教,其实最主要的是我租的虚拟主机并不支持Node.js).But,我对Node.js依然没有放弃,国内也有一些大公司都已经用到了Node.js,这也将成为一个趋势.这是关于Node.js学习笔记的第一篇,以后将会陆陆续续有更多出来.做这件事,一来是为了督促自己更好的学习

学习Java的第一步 JDK 环境变量配置

JDK 环境变量配置 1.安装完JDK后配置环境变量  计算机→属性→高级系统设置→高级→环境变量 2.系统变量→新建 JAVA_HOME 变量 .变量值填写jdk的安装目录(我的安装目录是C:\Program Files\Java\jdk1.7.0_71 3.系统变量→寻找 Path 变量→编辑 在变量值最后输入 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; (注意原来Path的变量值末尾有没有;号,如果没有,先输入:号再输入上面的代码) 4.系统变量→新建 CLA

学习C的第一步:在不同IDE中完成Helloworld

一.helloworld代码在不同IDE中的区别vs2017: #include <stdio.h>int main(){printf("hello world\n");system("pause");return 0;} Devcpp: #include <stdio.h>int main(){printf("hello world\n");return 0;} 二.操作步骤:vs20171.文件-新建-项目2.选&qu

学习 JSP:第一步Eclipse+Tomcat+jre(配置环境)

[下载软件](例子version:版本号) Eclipse从官网下载(version:4.7)http://www.eclipse.org/downloads/ jre从官网下载(version:1.8) Tomcat从官网下载(version:7.0)http://tomcat.apache.org/download-70.cgi [配置环境] 参考地址:https://www.w3cschool.cn/jsp/eclipse-jsp.html 1.Tomcat解压缩放好就行了,无需配置. 2

Android开发学习之路--图表实现(achartengine/MPAndroidChart)之初体验

??已经有一段时间没有更新博客了,在上周离开工作了4年的公司,从此不再安安稳稳地工作了.很多其它的是接受挑战和实现自身价值的提高. 离开了嵌入式linux,从此拥抱移动互联网,或许有点为时已晚.但是相信通过努力,什么时候都不会太晚.关于转行,关于这次的转型会不会成功,都是未知数,谁知道呢. 以后就好好学习互联网相关的知识.偶尔业余玩玩树莓派,玩玩机器人之类的. ??时间过得非常快,已经在新公司待了一周了,简单熟悉了环境.熟悉了产品,也学了些第三份框架的使用,什么data binding, ret

python网络爬虫学习资料

第一:Python爬虫学习系列教程(来源于某博主:http://cuiqingcai.com/1052.html) Python版本:2.7 整体目录: 一.爬虫入门 1. Python爬虫入门一之综述 2. Python爬虫入门二之爬虫基础了解 3. Python爬虫入门三之Urllib库的基本使用 4. Python爬虫入门四之Urllib库的高级用法 5. Python爬虫入门五之URLError异常处理 6. Python爬虫入门六之Cookie的使用 7. Python爬虫入门七之正则

Redis - Redis分布式锁

Redis分布式锁 一丶什么是分布式锁 普通的锁,用于同一进程内不同线程在操作同一资源时,为解决冲突而加上的,使得多线程在操作统一资源时以单线程顺序执行. JVM的内存模型: 主内存保存变量值, 每个线程内也有自己的内存, 一般情况下, 线程会在本内存中操作数据后,在刷入主内存, 如果多个线程都同时在各自内存操作数据后, 在刷入主内存, 可能会导致结果不正确. 如 主内存中变量a=1, 线程t1和t2, 同时读取变量a后加1, 最后刷进主内存, 则主内存a可能为2, 正确的结果为3. 如果对操作