python多线程爬虫+批量下载斗图啦图片项目(关注、持续更新)

python多线程爬虫项目()

爬取目标:斗图啦(起始url:http://www.doutula.com/photo/list/?page=1)

爬取内容:斗图啦全网图片

使用工具:requests库实现发送请求、获取响应。  

     xpath实现数据解析、提取和清洗  

     threading模块实现多线程爬虫

爬取结果:

思路:由于该爬虫存在网络密集IO和磁盘密集IO,存在大量等待时间,遂采用多线程方式爬取。

设计:本文采用多为结构化代码的面向对象封装设计思路,使用生产消费者模型,完成多线程的调度、爬取。

直接放代码(详细说明在注释里,欢迎同行相互交流、学习~):

 1 import os
 2 import threading
 3 import re
 4 from queue import Queue
 5 import requests
 6 from urllib import request
 7 from lxml import etree
 8
 9 # 定义一个全局变量,存储请求头headers数据
10 headers = {
11     "User-Agent": "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)"
12 }
13
14 class Producter(threading.Thread):
15     """
16     生产者模型:负责从起始url队列中提取url,进行解析,将得到的图片地址放入img图片队列中
17     """
18     def __init__(self, page_queue, img_queue, *args, **kwargs):
19         # 改写父类threading.Thread的__init__方法,添加默认值
20         super(Producter, self).__init__(*args, **kwargs)
21         # 添加对象属性
22         self.page_queue = page_queue
23         self.img_queue = img_queue
24
25     def run(self):
26         """
27         实现消费者模型的主要业务逻辑
28         """
29         while True:
30             # 当请求队列为空,生产者停止生产
31             if self.page_queue.empty():
32                 break
33             # 获取起始url队列的对象,进行页面解析
34             url = self.page_queue.get()
35             self.parse_url(url)
36
37     def parse_url(self, url):
38         """
39         实现解析指定页面的功能
40         :param url: 传入待处理的页面url
41         """
42         response = requests.get(url=url, headers=headers)
43         html = etree.HTML(response.text)
44         # 使用lxml库里HTML解析器进行数据解析,利用xpath语法解析得到指定数据,返回一个element对象列表
45         url_gifs = html.xpath("//div[@class=‘page-content text-center‘]//img[@class!=‘gif‘]")
46         for url_gif in url_gifs:
47             # element.get(属性名)可以获取属性值
48             url_name = url_gif.get("alt")
49             # 正则表达式替换非法字符
50             url_name = re.sub(r"[\!!\.\??]", "", url_name).strip()
51             url_link = url_gif.get("data-original")
52             # os模块中os.path.splitext()可以获取url的后缀名
53             url_suffix = os.path.splitext(url_link)[1]
54             filename = url_name + url_suffix
55             # 队列的put()里面传的是元组或者列表
56             self.img_queue.put((url_link, filename))
57
58 class Consumer(threading.Thread):
59     """
60     消费者模型的主要业务逻辑
61     """
62
63     def __init__(self, page_queue, img_queue, *args, **kwargs):
64         super(Consumer, self).__init__(*args, **kwargs)
65         self.page_queue = page_queue
66         self.img_queue = img_queue
67
68     def run(self):
69         """
70         实现读取图片url内容的功能
71         """
72         while True:
73             if self.page_queue.empty() and self.img_queue.empty():
74                 break
75             url, filename = self.img_queue.get()
76             # urllib库里面的request模块可以读取图片url内容
77             request.urlretrieve(url, "GIF/" + filename)
78             # 控制台输出提示信息
79             print(filename + "-------下载完成!")
80
81 def main():
82     # 创建page队列,存放请求的起始url;创建img队列,存放图片data的url
83     page_queue = Queue(100) # 设置队列的最大存储数量
84     img_queue = Queue(1000) # 设置队列的最大存储数量
85     for i in range(100):
86         start_url_format = "http://www.doutula.com/photo/list/?page={}".format(i)
87         # print(start_url_format) #调试代码用
88         page_queue.put(start_url_format) #将获取的起始url放入队列中
89     # 生成多线程对象(多个生产者、消费者)。实现发送请求,获取响应,解析页面,获取数据
90     for i in range(10):
91         t = Producter(page_queue, img_queue)
92         t.start()
93     for i in range(10):
94         t = Consumer(page_queue, img_queue)
95         t.start()
96
97 if __name__ == ‘__main__‘:
98     main()

原文地址:https://www.cnblogs.com/xuechaojun/p/10158873.html

时间: 2024-12-29 10:15:38

python多线程爬虫+批量下载斗图啦图片项目(关注、持续更新)的相关文章

Python 实现 CNKI批量下载 和FireFox Extension 入门学习笔记

?                                 Python 实现 CNKI批量下载 和FireFox Extension 入门学习笔记? 由于需要也是为了督促自己学习新的东西,我原本想要尝试着写一个爬虫程序,能够在cnki上自动得将论文进行批量下载,学习过程中遇到了诸多情况,cnki也真是专业,不得不佩服cnki的强大. 下面进入正题: 学习.实验环境:ubuntu 14.04 工具:Eclipse ,  FireFox, FireBug,HttpFox 编程语言:pyth

使用Python下载妹子图网站图片

最近在学习Python的爬虫部分.看到有网友在分享使用爬虫爬取各种网站的图片的代码,也想自己写个玩玩.今天花时间分析了一下妹子图网站的结构和HTML代码,使用urllib2和BeautifulSoup写出了一个自动下载妹子图网站图片的脚本. 妹子图网址:http://www.mzitu.com 运行效果如下: 源代码如下,请各位大神指教: # -*- coding:utf8 -*- # Python:         2.7.8 # Platform:       Windows # Autho

深夜,我用python爬取了整个斗图网站,不服来斗

深夜,我用python爬取了整个斗图网站,不服来斗 QQ.微信斗图总是斗不过,索性直接来爬斗图网,我有整个网站的图,不服来斗. 废话不多说,选取的网站为斗图啦,我们先简单来看一下网站的结构 网页信息 从上面这张图我们可以看出,一页有多套图,这个时候我们就要想怎么把每一套图分开存放(后边具体解释) 通过分析,所有信息在页面中都可以拿到,我们就不考虑异步加载,那么要考虑的就是分页问题了,通过点击不同的页面,很容易看清楚分页规则 很容易明白分页URL的构造,图片链接都在源码中,就不做具体说明了明白了这

Python小爬虫-自动下载三亿文库文档

新手学python,写了一个抓取网页后自动下载文档的脚本,和大家分享. 首先我们打开三亿文库下载栏目的网址,比如专业资料(IT/计算机/互联网)http://3y.uu456.com/bl-197?od=1&pn=0,可以观察到,链接中pn=后面的数字就是对应的页码,所以一会我们会用iurl = 'http://3y.uu456.com/bl-197?od=1&pn=',后面加上页码来抓取网页. 一般网页会用1,2,3...不过机智的三亿文库用0,25,50...来表示,所以我们在拼接ur

Python 爬虫批量下载美剧 from 人人影视 HR-HDTV

本人比較喜欢看美剧.尤其喜欢人人影视上HR-HDTV 的 1024 分辨率的高清双字美剧,这里写了一个脚本来批量获得指定美剧的全部 HR-HDTV 的 ed2k下载链接.并依照先后顺序写入到文本文件,供下载工具进行批量下载.比方用迅雷.先打开迅雷,然后复制全部下载链接到剪切板,迅雷会监视剪切板来新建全部任务.假设迅雷没有自己主动监视,能够自己点击新建然后粘贴链接.Python源码例如以下.用的是Python3 : # python3 实现,以下的实例 3 部美剧爬完大概要 10 s import

python3.4爬虫批量下载音乐

最近在学习python,使用的版本为python3.4,开发环境为使用Pydev插件的eclipse.正好觉得http://www.dexiazai.com/?page_id=23上的音乐不错,决定使用python批量下载下来. 1.音乐地址 经过分析,页面嵌入的虾米播放器中的地址如下,后面以逗号分隔的字符为音乐的id,如音乐的地址为http://www.xiami.com/song/2088578 <span style="font-size:14px;"><spa

python多线程爬虫的简单例子

Python多线程(http://www.maiziedu.com/course/python/)主要是通过thread和threading这两个模块来实现的.thread模块是比较底层的模块,threading模块是对thread做了一些包装的,可以更加方便的使用. 虽然python的多线程受GIL限制,并不是真正的多线程,但是对于I/O密集型计算还是能明显提高效率,比如说爬虫. 下面用一个实例来验证多线程的效率.代码只涉及页面获取,并没有解析出来. # -*-coding:utf-8 -*-

KRPano资源分析工具使用说明(KRPano XML/JS解密 切片图批量下载 球面图还原 加密混淆JS还原美化)

软件交流群:571171251(软件在群内提供) krpano技术交流群:551278936(软件在群内提供) 软件功能介绍 KRPano资源分析工具具有以下特性: 1.分析保存网站资源,包括查看网站资源树形(平铺)结构,单个资源文件实时打开,整站资源批量保存,资源过滤筛选保存等功能 2.一键解密被KRPano加密的XML文件 3.一键解密被KRPano加密后的JS文件 4.解密/美化被加密或混淆的JS文件 5.KRPano网站切片图批量下载 6.KRPano切片图一键还原球面图 7.批量下载多

python多线程爬虫设计及实现示例

爬虫的基本步骤分为:获取,解析,存储.假设这里获取和存储为io密集型(访问网络和数据存储),解析为cpu密集型.那么在设计多线程爬虫时主要有两种方案:第一种方案是一个线程完成三个步骤,然后运行多个线程:第二种方案是每个步骤运行一个多线程,比如N个线程进行获取,1个线程进行解析(多个线程之间切换会降低效率),N个线程进行存储. 下面我们尝试抓取http://www.chembridge.com/ 库存药品信息. 首先确定url为http://www.chembridge.com/search/se