Github: https://github.com/wangy8961/python3-concurrency-pics-02 ,欢迎star

**爬虫系列: **

(1) 理论

(2) 实验

(3) 实战

1. 准备环境

1.1 安装CentOS

建议使用VMware安装一台CentOS-7.3虚拟机,请参考:http://www.madmalls.com/blog/post/customize-centos-7-3-autoinstall-iso/

1.2 安装Python3

请参考:http://www.madmalls.com/blog/post/deploy-flask-gunicorn-nginx-supervisor-on-centos7/#3-python3

1.3 安装MongoDB

请参考:http://www.madmalls.com/blog/post/deploy-flask-gunicorn-nginx-supervisor-on-centos7/#4-mongodb ,如果是Windows请参考:http://www.madmalls.com/blog/post/win10-install-mongodb/

尝试使用motor实现MongoDB异步操作,好像效率更差一些,所以放弃使用该模块。目前数据库操作是同步阻塞型,使用pymongo模块

1.4 安装Git

[root@CentOS ~]# yum -y install git

代码已上传到 https://github.com/wangy8961/python3-concurrency-pics-02 ,克隆代码:

[root@CentOS ~]# git clone https://github.com/wangy8961/python3-concurrency-pics-02.git
[root@CentOS ~]# cd python3-concurrency-pics-02/

1.5 准备虚拟环境

如果你的操作系统是Linux:

[root@CentOS python3-concurrency-pics-02]# python3 -m venv venv3
[root@CentOS python3-concurrency-pics-02]# source venv3/bin/activate

Windows激活虚拟环境的命令是: venv3\Scripts\activate

1.6 安装依赖包

如果你的操作系统是Linux:

(venv3) [root@CentOS python3-concurrency-pics-02]# pip install -r requirements-linux.txt

如果你的操作系统是Windows(不会使用uvloop):

(venv3) C:\Users\wangy> pip install -r requirements-win32.txt

2. 分析过程

2.1 获取图集信息

使用requests模块或aiohttp模块来获取入口页面 http://www.mzitu.com/all/ 的HTML响应,然后通过BeautifulSoup4lxml来解析HTML文档。每个图集按年份/月份被放在<div class='all'></div>下面的每个<a href="图集URL">图集标题<a>中。需要注意的是,早期图片需要访问 http://www.mzitu.com/old/ ,递归调用获取图集的函数即可

将获取的4000多个图集信息保存到MongoDB数据库的albums集合中

访问 http://www.mzitu.com/all/http://www.mzitu.com/old/ ,共2次请求

2.2 获取包含图片的页面信息

每个图集下面的图片数量不相同,我们需要依次访问图集URL,通过分页导航栏获取该图集下最大的图片数和它的发布时间,并在本地磁盘上创建按日期分类的目录,方便以后浏览图片

假设图集URL为 http://www.mzitu.com/56918 ,发现该图集下有47张图片,而且包含图片的页面URL也是有规律的,比如包含第1张图片的页面URL为 http://www.mzitu.com/56918/1

将每个图集下面的包含图片的页面信息保存到MongoDB数据库的image_pages集合中

依次访问图集URL,共4500多次请求

2.3 获取图片的真实URL

我们通过访问每个包含图片的页面,获取每张图片的真实URL,并保存到MongoDB数据库的images集合中

依次访问包含图片的页面URL,共13万多次请求*

2.4 下载图片

从MongoDB数据库的images集合中获取所有图片的真实URL,依次下载并保存到本地

依次访问图片的真实URL,共13万多次请求

3. 使用

3.1 测试

由于图片有13万多张,所以测试的时候,你可以指定只下载100个图集来对比同步下载多线程下载异步下载的效率区别,修改以下三个脚本中的TEST_NUM = 100

建议每次测试完,都删除相关目录:

(venv3) [root@CentOS python3-concurrency-pics-02]# rm -rf downloads/ logs/ __pycache__/

删除数据库记录:

(venv3) [root@CentOS python3-concurrency-pics-02]# mongo
MongoDB shell version v3.6.6
connecting to: mongodb://127.0.0.1:27017
...
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
mzitu 0.036GB
> use mzitu
switched to db mzitu
> db.dropDatabase()
{ "dropped" : "mzitu", "ok" : 1 }
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
>

(1) 依序下载

(venv3) [root@CentOS python3-concurrency-pics-02]# python sequential.py

(2) 多线程下载

(venv3) [root@CentOS python3-concurrency-pics-02]# python threadpool.py

(3) 异步下载

(venv3) [root@CentOS python3-concurrency-pics-02]# python asynchronous.py

3.2 后台运行爬虫脚本

全站下载虽然只有13万多张图片,但章节分析过,总请求数差不多有30万次,所以耗时比较久,为防止不小心关闭Shell客户端而导致SSH断开,将使用screen来将脚本运行为后台任务:

[root@CentOS ~]# yum -y install screen
[root@CentOS ~]# screen -dmS spider
[root@CentOS ~]# screen -r spider
[root@CentOS ~]# cd /root/python3-concurrency-pics-02
[root@CentOS python3-concurrency-pics-02]# source venv3/bin/activate
(venv3) [root@CentOS python3-concurrency-pics-02]# python asynchronous.py

脚本运行的过程中,按Ctrl + A + D即可将任务切换到后台运行,此时再关闭Shell客户端也没影响了。等待大约2小时后:

[root@CentOS ~]# screen -r spider

即可查看下载的结果,如果有失败的请求,很正常,再次执行脚本即可

(venv3) [root@CentOS python3-concurrency-pics-02]# ls -lR downloads/ | grep '^-' | wc -l
138217
(venv3) [root@CentOS python3-concurrency-pics-02]# du -sh downloads/
16G downloads/

3.3 定时任务自动每日更新

[root@CentOS ~]# crontab -e
执行上述命令后,将打开vim编辑器,新增如下两行内容: # 爬取 www.mzitu.com 美女图片
30 23 * * * /usr/bin/python3 /root/python3-concurrency-pics-02/asynchronous.py

将在每天晚上23:30分自动执行爬虫脚本,查看cron定时任务是否执行:

[root@CentOS ~]# tail -f /var/log/cron
Aug 27 23:30:01 CentOS CROND[6256]: (root) CMD (/usr/bin/python3 /root/python3-concurrency-pics-02/asynchronous.py)
Aug 27 23:30:01 CentOS CROND[6257]: (root) CMD (/usr/lib64/sa/sa1 1 1)

更多cron知识请参考:http://www.madmalls.com/blog/post/how-to-schedule-tasks-in-linux-with-at-and-cron/

Python3爬虫系列:理论+实验+爬取妹子图实战的更多相关文章

  1. Python协程爬取妹子图(内有福利,你懂得~)

    项目说明: 1.项目介绍   本项目使用Python提供的协程+scrapy中的选择器的使用(相当好用)实现爬取妹子图的(福利图)图片,这个学会了,某榴什么的.pow(2, 10)是吧! 2.用到的知 ...

  2. java爬虫系列第二讲-爬取最新动作电影《海王》迅雷下载地址

    1. 目标 使用webmagic爬取动作电影列表信息 爬取电影<海王>详细信息[电影名称.电影迅雷下载地址列表] 2. 爬取最新动作片列表 获取电影列表页面数据来源地址 访问http:// ...

  3. Python爬虫系列 - 初探:爬取旅游评论

    Python爬虫目前是基于requests包,下面是该包的文档,查一些资料还是比较方便. http://docs.python-requests.org/en/master/ POST发送内容格式 爬 ...

  4. Python网络爬虫 | Scrapy爬取妹子图网站全站照片

    根据现有的知识,写了一个下载妹子图(meizitu.com)Scrapy脚本,把全站两万多张照片下载到了本地. 网站的分析 网页的网址分析 打开网站,发现网页的网址都是以 http://www.mei ...

  5. python爬取妹子图全站全部图片-可自行添加-线程-进程爬取,图片去重

    from bs4 import BeautifulSoupimport sys,os,requests,pymongo,timefrom lxml import etreedef get_fenlei ...

  6. 使用requests+BeaBeautiful Soup爬取妹子图图片

    1. Requests:让 HTTP 服务人类 Requests 继承了urllib2的所有特性.Requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定 ...

  7. Python爬虫系列 - 初探:爬取新闻推送

    Get发送内容格式 Get方式主要需要发送headers.url.cookies.params等部分的内容. t = requests.get(url, headers = header, param ...

  8. Python3爬虫(十三) 爬取动态页之Selenium

    Infi-chu: http://www.cnblogs.com/Infi-chu/ Python提供了很多模拟浏览器运行的库,比如:Selenium.Splash等 1.常用的引用 from sel ...

  9. Python 2.7和3.6爬取妹子图网站单页测试图片

    1.url= http://www.mzitu.com/74100/x,2为1到23的值 2.用到模块 os 创建文件目录; re模块正则匹配目录名 图片下载地址; time模块 限制下载时间;req ...

随机推荐

  1. 使用 acme.sh 签发续签 Let‘s Encrypt 证书 泛域名证书

    1. 安装 acme.sh 安装很简单, 一个命令: curl https://get.acme.sh | sh 并创建 一个 bash 的 alias, 方便你的使用 alias acme.sh=~ ...

  2. 记录心得-shiro框架demo示例

    从懵懂到了解,再到熟悉,是一个进步的过程! 先撸代码,跑起来看效果,再做详细的介绍,开始干活! 1,先列出工程目录结构,自己需要创建对应层级的程序和相关配置文件. 2,导入maven依赖的jar包.打 ...

  3. [ISSUE] [Centos] Centos Start Nginx Show: Failed to start nginx.service:unit not found

    CMD Line:systemctl start nginx.serviceFailed to start nginx.service: Unit not found. Solution: 1.vim ...

  4. delphi 的一些注意点和知识点

    关于Delphi中产生的文件    编辑阶段: pas/单元文件,dpk/组件包文件,dpr/工程文件,dfm/窗体文件    编译阶段: dcu/单元编译文件,dcp/Delphi Compile ...

  5. Linux格式化、挂载及卸载数据盘

    注意: 磁盘分区和格式化是高风险行为,请慎重操作.本文档描述如何处理一个新买的数据盘,如果您的数据盘上有数据,请务必对数据进行备份以避免可能的数据丢失. 服务器仅支持对 数据盘 进行分区,而不支持对  ...

  6. maven配置国内阿里云镜像

    <mirrors> <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> ...

  7. vue强制刷新组件

    <component v-if="hackReset"></component>(组件名称) data:hackReset (事件执行) this.hack ...

  8. sort排序原理

    var array = [10,5,40,25,1000,1];   array.sort(compareFunction);   function compareFunction(a, b) {  ...

  9. SpringBoot后台接收前台的字符串数据

    需求 将前台传入的字符串数据转为int类型. 操作 在pom.xml中添加引用. <dependency> <groupId>org.apache.commons</gr ...

  10. subing用法

    sql中substring截取,start位置索引由1开始 c#中substring截取,start位置索引由0开始