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在工作,多线程是指进程内部有多个类 ...
随机推荐
- BOM与DOM操作
BOM: OM-JavaScript是运行在浏览器中的,所以提供了一系列对象用于和浏览器窗口进行交互,这些对象主要包括window.document.location.navigator和screen ...
- Java安装以及环境变量配置
1. 2. 3. 4. 5. class HelloWorld{ public static void main(String args[]){ System.out.print("Hell ...
- 深入解析Java反射-invoke方法
博客原文:http://www.sczyh30.com/posts/Java/java-reflection-2/ 上篇文章中回顾了一下Java反射相关的基础内容.这一节我们来深入研究Method类中 ...
- [Swift]LeetCode706. 设计哈希映射 | Design HashMap
Design a HashMap without using any built-in hash table libraries. To be specific, your design should ...
- [Swift]LeetCode756. 金字塔转换矩阵 | Pyramid Transition Matrix
We are stacking blocks to form a pyramid. Each block has a color which is a one letter string, like ...
- Python内置函数(33)——int
英文文档: class int(x=0) class int(x, base=10) Return an integer object constructed from a number or str ...
- Python内置函数(10)——chr
英文文档: chr(i) Return the string representing a character whose Unicode code point is the integer i. F ...
- 根据地址查询经纬度Js
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>根据地址查询经纬度</ ...
- 正则表达式与H5表单
RegExp 对象 exec 检查字符中是正则表达中的区域 text 检查内容 String 对象的方法 match search replace splic ...
- Spring Boot OAuth 2.0 客户端
在上一篇<OAuth 2.0 授权码请求>中我们已经可以获取到access_token了,本节将使用客户端来访问远程资源 配置资源服务器 授权服务器负责生成并发放访问令牌(access_t ...