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. VS启动Winform项目提示:不支持互操作调试

    64 位平台不支持互操作调试(托管 + 非托管混合模式调试). 在VS中设置项目属性--->调试--->取消选中“启用本地代码调试”. 此问题在.NET FrameWork低版本框架会出现 ...

  2. python从入门到实践-4章操作列表

    magicians = ['alice','david','carolina']for magician in magicians: print(magician) print(magician.ti ...

  3. unittest中的测试固件

    运行下面的两段代码,看看有什么不同? 第一段: import unittest from selenium import webdriver class F2(unittest.TestCase): ...

  4. linux下SS 网络命令详解

    ss命令用来显示处于活动状态的套接字信息. ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容. 但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比n ...

  5. NumPy库

    NumPy详细教程(官网手册翻译) Python之Numpy详细教程 一.基础篇 1.NumPy - Ndarray 对象 ndarray描述相同类型的元素集合, 可以使用基于零的索引访问集合中的项目 ...

  6. Linux下CenOS系统 安装MariaDB

    1.首先去MariaDB官网下载安装包,首页是:https://mariadb.org/ 2.放在linux下的新建目录下:/root/mariadb 然后解压缩,命令为:tar -xzvf mari ...

  7. 琐事集 vol 2

    vol 2-0 宝宝,你是不是该看书咯? 她正瘫在沙发上看剧 我刚提起看书,她惊恐地看了看我 然后眼白一翻,彻底地瘫平了 宝宝? “宝宝睡着了.” 你下周就要考护师了!很难得,她认真地睁开眼,信誓旦旦 ...

  8. 【安富莱】【RL-TCPnet网络教程】第11章 RL-TCPnet调试方法

    第11章      RL-TCPnet调试方法 本章节为大家讲解RL-TCPnet的调试方法,RL-TCPnet的调试功能其实就是通过串口打印实时监控运行状态.而且RL-TCPnet的调试设置比较简单 ...

  9. [Swift]LeetCode1025. 除数博弈 | Divisor Game

    Alice and Bob take turns playing a game, with Alice starting first. Initially, there is a number N o ...

  10. JavaWeb过滤器.监听器.拦截器-原理&区别-个人总结

    对比项 拦截器 过滤器 机制 反射机制 函数回调 是否依赖servlet容器 是 否 请求处理 只能对action请求起作用 几乎所有的请求起作用 对action处理 可以访问action上下文.值栈 ...