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多线程爬虫+批量下载斗图啦图片项目(关注、持续更新)的更多相关文章

  1. Python + Selenium +Chrome 批量下载网页代码修改【新手必学】

    Python + Selenium +Chrome 批量下载网页代码修改主要修改以下代码可以调用 本地的 user-agent.txt 和 cookie.txt来达到在登陆状态下 批量打开并下载网页, ...

  2. Python爬虫实战 批量下载高清美女图片

    彼岸图网站里有大量的高清图片素材和壁纸,并且可以免费下载,读者也可以根据自己需要爬取其他类型图片,方法是类似的,本文通过python爬虫批量下载网站里的高清美女图片,熟悉python写爬虫的基本方法: ...

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

    本人比較喜欢看美剧.尤其喜欢人人影视上HR-HDTV 的 1024 分辨率的高清双字美剧,这里写了一个脚本来批量获得指定美剧的全部 HR-HDTV 的 ed2k下载链接.并依照先后顺序写入到文本文件, ...

  4. python图片爬虫 - 批量下载unsplash图片

    前言 unslpash绝对是找图的绝佳场所, 但是进网站等待图片加载真的令人捉急, 仿佛是一场拼RP的战争 然后就开始思考用爬虫帮我批量下载, 等下载完再挑选, 操作了一下不算很麻烦, 顺便也给大家提 ...

  5. Python多线程爬虫爬取网页图片

    临近期末考试,但是根本不想复习!啊啊啊啊啊啊啊!!!! 于是做了一个爬虫,网址为 https://yande.re,网页图片为动漫美图(图片带点颜色........宅男福利 github项目地址为:h ...

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

    QQ.微信斗图总是斗不过,索性直接来爬斗图网,我有整个网站的图,不服来斗. 废话不多说,选取的网站为斗图啦,我们先简单来看一下网站的结构 网页信息 从上面这张图我们可以看出,一页有多套图,这个时候我们 ...

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

    软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278936(软件免费版本在群内提供) 最新博客地址:blog.turenlong.com 限时下载地址:htt ...

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

    爬虫的基本步骤分为:获取,解析,存储.假设这里获取和存储为io密集型(访问网络和数据存储),解析为cpu密集型.那么在设计多线程爬虫时主要有两种方案:第一种方案是一个线程完成三个步骤,然后运行多个线程 ...

  9. Python多线程爬虫与多种数据存储方式实现(Python爬虫实战2)

    1. 多进程爬虫 对于数据量较大的爬虫,对数据的处理要求较高时,可以采用python多进程或多线程的机制完成,多进程是指分配多个CPU处理程序,同一时刻只有一个CPU在工作,多线程是指进程内部有多个类 ...

随机推荐

  1. C语言复习2_运算符

    今天复习一下C语言的运算符 1.赋值运算符 单等号 = 顺序是:从右往左 2.复合运算符 #include <stdio.h> #include <stdlib.h> int ...

  2. KMP算法与传统字符串寻找算法

    原理:KMP算法是一种模板匹配算法,它首先对模板进行便利,对于模板中与模板首字符一样和首字符进行标志-1,对于模板匹配中出现不匹配的若是第一轮检查标志为0,若不是第一轮检查标志为该元素与标志为-1的距 ...

  3. 升讯威微信营销系统开发实践:微信接口的 .NET 封装

    GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction因为个人精力时间有限,不会再对现有代码进行更新维护,不过微信接口比较稳定,经测试至 ...

  4. 全面盘点当前Android后台保活方案的真实运行效果(截止2019年前)

    本文原作者“minminaya”,作者网站:minminaya.cn,为了提升文章品质,即时通讯网对内容作了幅修订和改动,感谢原作者. 1.引言 对于IM应用和消息推送服务的开发者来说,在Androi ...

  5. [Swift]LeetCode855. 考场就座 | Exam Room

    In an exam room, there are N seats in a single row, numbered 0, 1, 2, ..., N-1. When a student enter ...

  6. 从搭建V2Ray服务器到编译V2Milk的完整过程

    概述 因为公司出口ip一直在变,所以waf白名单不好加入,所以搭一个了代理服务器 .搭建了V2Ray服务器 .为了好管理,找了一个@Zzm317开源的V2Milk. V2Milk为V2Ray跨平台定制 ...

  7. 用CSS实现一个抽奖转盘

    效果 基本是用CSS实现的,没有用图片,加一丢丢JS.完全没有考虑兼容性. 首先画一个转盘, <!DOCTYPE html> <html lang="en"> ...

  8. Guava 源码分析(Cache 原理)

    前言 Google 出的 Guava 是 Java 核心增强的库,应用非常广泛. 我平时用的也挺频繁,这次就借助日常使用的 Cache 组件来看看 Google 大牛们是如何设计的. 缓存 本次主要讨 ...

  9. 死磕 java集合之HashMap源码分析

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 简介 HashMap采用key/value存储结构,每个key对应唯一的value,查询和修改 ...

  10. Python3练习

    Hello Python3 print("Hello Python!") #print("Hello, Python!"); '''a=1 b=2 c=a+b ...