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. vue+mescroll=VScrollFull

    VScrollFull 介绍 这个组件是什么? 是为了方便的使用下拉刷新,上拉加载而去封装的一个依赖于 mescroll.js 的 vue 组件(未发布,文末代码~) 封装这个组件使用了什么? mes ...

  2. proxy_pass根据path路径转发时的"/"问题记录

    在nginx中配置proxy_pass时,如果是按照^~匹配路径时,要注意proxy_pass后的url最后的/.当加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理 ...

  3. 写给大忙人的centos下ftp服务器搭建(以及启动失败/XFTP客户端一直提示“用户身份验证失败”解决方法)

    注:个人对偏向于底层基本上拿来就用的应用,倾向于使用安装包,直接yum或者rpm安装:而对于应用层面控制较多或者需要大范围维护的,倾向于直接使用tar.gz版本. 对于linux下的ftp服务器,实际 ...

  4. Win10U盘启动盘制作及Win10系统安装

    准备工具: 1:一个8GU盘 2:下载MediaCreationTool1803.exe程序 及参考文档. 启动盘制作步骤: 1:运行 2:按照截图步骤依次...... 3:制作完成后插拔一下U盘在看 ...

  5. [Swift]LeetCode373. 查找和最小的K对数字 | Find K Pairs with Smallest Sums

    You are given two integer arrays nums1 and nums2 sorted in ascending order and an integer k. Define ...

  6. [Swift]LeetCode822. 翻转卡片游戏 | Card Flipping Game

    On a table are N cards, with a positive integer printed on the front and back of each card (possibly ...

  7. vue + hbuilder 开发备忘录

    踩过的坑: axios 安卓低版本兼容性处理 阻止表单中,button默认事件,出现刷新问题. 设置滚动条的位置 vue 数据和对象数据变化 dom结构不变 android低版本 白屏问题 你是不是用 ...

  8. ASP.NET Core SignalR中的流式传输

    什么是流式传输? 流式传输是这一种以稳定持续流的形式传输数据的技术. 流式传输的使用场景 有些场景中,服务器返回的数据量较大,等待时间较长,客户端不得不等待服务器返回所有数据后,再进行相应的操作.这时 ...

  9. 从锅炉工到AI专家(4)

    手写数字识别问题 图像识别是深度学习众多主流应用之一,手写数字识别则是图像识别范畴简化版的入门学习经典案例.在TensorFlow的官方文档中,把手写数字识别"MNIST"案例称为 ...

  10. [Python]peewee 使用经验

    peewee 使用经验 本文使用案例是基于 python2.7 实现 以下内容均为个人使用 peewee 的经验和遇到的坑,不会涉及过多的基本操作.所以,没有使用过 peewee,可以先阅读文档 正确 ...