python多线程爬虫+批量下载斗图啦图片项目(关注、持续更新)
python多线程爬虫项目()
爬取目标:斗图啦(起始url:http://www.doutula.com/photo/list/?page=1)
爬取内容:斗图啦全网图片
使用工具:requests库实现发送请求、获取响应。
xpath实现数据解析、提取和清洗
threading模块实现多线程爬虫
爬取结果:
思路:由于该爬虫存在网络密集IO和磁盘密集IO,存在大量等待时间,遂采用多线程方式爬取。
设计:本文采用多为结构化代码的面向对象封装设计思路,使用生产消费者模型,完成多线程的调度、爬取。
直接放代码(详细说明在注释里,欢迎同行相互交流、学习~):
import os
import threading
import re
from queue import Queue
import requests
from urllib import request
from lxml import etree # 定义一个全局变量,存储请求头headers数据
headers = {
"User-Agent": "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)"
} class Producter(threading.Thread):
"""
生产者模型:负责从起始url队列中提取url,进行解析,将得到的图片地址放入img图片队列中
"""
def __init__(self, page_queue, img_queue, *args, **kwargs):
# 改写父类threading.Thread的__init__方法,添加默认值
super(Producter, self).__init__(*args, **kwargs)
# 添加对象属性
self.page_queue = page_queue
self.img_queue = img_queue def run(self):
"""
实现消费者模型的主要业务逻辑
"""
while True:
# 当请求队列为空,生产者停止生产
if self.page_queue.empty():
break
# 获取起始url队列的对象,进行页面解析
url = self.page_queue.get()
self.parse_url(url) def parse_url(self, url):
"""
实现解析指定页面的功能
:param url: 传入待处理的页面url
"""
response = requests.get(url=url, headers=headers)
html = etree.HTML(response.text)
# 使用lxml库里HTML解析器进行数据解析,利用xpath语法解析得到指定数据,返回一个element对象列表
url_gifs = html.xpath("//div[@class='page-content text-center']//img[@class!='gif']")
for url_gif in url_gifs:
# element.get(属性名)可以获取属性值
url_name = url_gif.get("alt")
# 正则表达式替换非法字符
url_name = re.sub(r"[\!!\.\??]", "", url_name).strip()
url_link = url_gif.get("data-original")
# os模块中os.path.splitext()可以获取url的后缀名
url_suffix = os.path.splitext(url_link)[1]
filename = url_name + url_suffix
# 队列的put()里面传的是元组或者列表
self.img_queue.put((url_link, filename)) class Consumer(threading.Thread):
"""
消费者模型的主要业务逻辑
""" def __init__(self, page_queue, img_queue, *args, **kwargs):
super(Consumer, self).__init__(*args, **kwargs)
self.page_queue = page_queue
self.img_queue = img_queue def run(self):
"""
实现读取图片url内容的功能
"""
while True:
if self.page_queue.empty() and self.img_queue.empty():
break
url, filename = self.img_queue.get()
# urllib库里面的request模块可以读取图片url内容
request.urlretrieve(url, "GIF/" + filename)
# 控制台输出提示信息
print(filename + "-------下载完成!") def main():
# 创建page队列,存放请求的起始url;创建img队列,存放图片data的url
page_queue = Queue(100) # 设置队列的最大存储数量
img_queue = Queue(1000) # 设置队列的最大存储数量
for i in range(100):
start_url_format = "http://www.doutula.com/photo/list/?page={}".format(i)
# print(start_url_format) #调试代码用
page_queue.put(start_url_format) #将获取的起始url放入队列中
# 生成多线程对象(多个生产者、消费者)。实现发送请求,获取响应,解析页面,获取数据
for i in range(10):
t = Producter(page_queue, img_queue)
t.start()
for i in range(10):
t = Consumer(page_queue, img_queue)
t.start() if __name__ == '__main__':
main()
python多线程爬虫+批量下载斗图啦图片项目(关注、持续更新)的更多相关文章
- Python + Selenium +Chrome 批量下载网页代码修改【新手必学】
Python + Selenium +Chrome 批量下载网页代码修改主要修改以下代码可以调用 本地的 user-agent.txt 和 cookie.txt来达到在登陆状态下 批量打开并下载网页, ...
- Python爬虫实战 批量下载高清美女图片
彼岸图网站里有大量的高清图片素材和壁纸,并且可以免费下载,读者也可以根据自己需要爬取其他类型图片,方法是类似的,本文通过python爬虫批量下载网站里的高清美女图片,熟悉python写爬虫的基本方法: ...
- Python 爬虫批量下载美剧 from 人人影视 HR-HDTV
本人比較喜欢看美剧.尤其喜欢人人影视上HR-HDTV 的 1024 分辨率的高清双字美剧,这里写了一个脚本来批量获得指定美剧的全部 HR-HDTV 的 ed2k下载链接.并依照先后顺序写入到文本文件, ...
- python图片爬虫 - 批量下载unsplash图片
前言 unslpash绝对是找图的绝佳场所, 但是进网站等待图片加载真的令人捉急, 仿佛是一场拼RP的战争 然后就开始思考用爬虫帮我批量下载, 等下载完再挑选, 操作了一下不算很麻烦, 顺便也给大家提 ...
- Python多线程爬虫爬取网页图片
临近期末考试,但是根本不想复习!啊啊啊啊啊啊啊!!!! 于是做了一个爬虫,网址为 https://yande.re,网页图片为动漫美图(图片带点颜色........宅男福利 github项目地址为:h ...
- 深夜,我用python爬取了整个斗图网站,不服来斗
QQ.微信斗图总是斗不过,索性直接来爬斗图网,我有整个网站的图,不服来斗. 废话不多说,选取的网站为斗图啦,我们先简单来看一下网站的结构 网页信息 从上面这张图我们可以看出,一页有多套图,这个时候我们 ...
- KRPano资源分析工具使用说明(KRPano XML/JS解密 切片图批量下载 球面图还原 加密混淆JS还原美化)
软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278936(软件免费版本在群内提供) 最新博客地址:blog.turenlong.com 限时下载地址:htt ...
- python多线程爬虫设计及实现示例
爬虫的基本步骤分为:获取,解析,存储.假设这里获取和存储为io密集型(访问网络和数据存储),解析为cpu密集型.那么在设计多线程爬虫时主要有两种方案:第一种方案是一个线程完成三个步骤,然后运行多个线程 ...
- Python多线程爬虫与多种数据存储方式实现(Python爬虫实战2)
1. 多进程爬虫 对于数据量较大的爬虫,对数据的处理要求较高时,可以采用python多进程或多线程的机制完成,多进程是指分配多个CPU处理程序,同一时刻只有一个CPU在工作,多线程是指进程内部有多个类 ...
随机推荐
- MVC编程模型
MVC 编程模型 MVC 是三个 ASP.NET 开发模型之一. MVC 是用于构建 web 应用程序的一种框架,使用 MVC (Model View Controller) 设计: Model(模型 ...
- Unity进阶----Lua语言知识点(2018/11/08)
国内开发: 敏捷开发: 集中精力加班堆出来第一个版本 基本没啥大的bug 国外开发: 1).需求分析: 2).讨论 3).分模块 4).框架 5).画UML图(类图class function)(e- ...
- 【RL-TCPnet网络教程】第28章 RL-TCPnet之DNS应用
第28章 RL-TCPnet之DNS应用 本章节为大家讲解RL-TCPnet的DNS应用,学习本章节前,务必要优先学习第27章的DNS基础知识.有了这些基础知识之后,再搞本章节会有事半功倍的 ...
- 【RL-TCPnet网络教程】第19章 RL-TCPnet之BSD Socket服务器
第19章 RL-TCPnet之BSD Socket服务器 本章节为大家讲解RL-TCPnet的BSD Socket,学习本章节前,务必要优先学习第18章的Socket基础知识.有了这些基础知 ...
- SpringBoot 集成 Swageer2
添加Maven依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox ...
- [Swift]LeetCode1030. 距离顺序排列矩阵单元格 | Matrix Cells in Distance Order
We are given a matrix with R rows and C columns has cells with integer coordinates (r, c), where 0 & ...
- 巡风源码阅读与分析--querylogic函数
文件位置:views/lib/QueryLogic.py Querylogic() # 搜索逻辑 def querylogic(list): query = {} if len(list) > ...
- java面向对象三大特性:封装、继承、多态
一.封装 封装也称信息隐藏,是指利用抽象数据类型把数据和基于数据的操作封装起来,使其成为一个不可分割的整体,数据隐藏在抽象数据内部,尽可能的隐藏数据细节,只保留一些接口使其与外界发生联系.也就是说用户 ...
- 如何更简单方便地执行SQL操作?
现在公司使用mybatis作为DAL层的框架. 使用起来比较简单,使用xml进行SQL的书写,java代码使用接口执行. 但在写一些简单SQL的时候会显得非常繁琐: xml和java分离(设计上为了解 ...
- Java 子类 instanceof 父类
1.结论: 子类 instanceof 父类 == true 父类 instanceof 子类 == false 2.测试代码 @Test public void testInstanceof() { ...
