python多线程采集图片
cmd中运行
>python untitled2.py 图片的网站
import requests
import threading
from bs4 import BeautifulSoup
import sys
import os
if len(sys.argv) != 2:
print("Usage : " )
print(" python main.py [URL]" )
exit(1)
# config-start
url = sys.argv[1]
threadNumber = 20
# 设置线程数 # config-end
def getContent(url):
try:
response = requests.get(url)
response.raise_for_status()
response.encoding = response.apparent_encoding
return response.text
except Exception as e:
print(e)
return str(e)
def getTitle(soup):
try:
return soup.title.string
except:
return "UnTitled"
def getImageLinks(soup):
imgs = soup.findAll("img")
result = []
for img in imgs:
try:
src = img['src']
if src.startswith("http"):
result.append(img['src'])
else:
result.append(domain + img['src'])
except:
continue
return result
def makeDirectory(dicName):
if not os.path.exists(dicName):
os.mkdir(dicName)
def downloadImage(imgUrl,savePath):
local_filename = imgUrl.split('/')[-1]
local_filename = formatFileName(local_filename)
r = requests.get(imgUrl, stream=True)
counter = 0
if not savePath.endswith("/"):
savePath += "/"
f = open(savePath + local_filename, 'wb')
for chunk in r.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
f.flush()
counter += 1
f.close()
def formatFileName(fileName):
fileName = fileName.replace("/","_")
fileName = fileName.replace("\\","_")
fileName = fileName.replace(":","_")
fileName = fileName.replace("*","_")
fileName = fileName.replace("?","_")
fileName = fileName.replace("\"","_")
fileName = fileName.replace(">","_")
fileName = fileName.replace("<","_")
fileName = fileName.replace("|","_")
fileName = fileName.replace(" ","_")
return fileName
def threadFunction(imgSrc,directoryName):
downloadImage(imgSrc,directoryName)
class myThread (threading.Thread):
def __init__(self, imgSrc, directoryName):
threading.Thread.__init__(self)
self.imgSrc = imgSrc
self.directoryName = directoryName
def run(self):
threadFunction(self.imgSrc, self.directoryName)
def getPrefix(url):
# http://doamin/xxx.jpg
return ''.join(i+"/" for i in url.split("/")[0:4])
def getDomain(url):
return ''.join(i+"/" for i in url.split("/")[0:3])
content = getContent(url)
prefix = getPrefix(url)
domain = getDomain(url)
soup = BeautifulSoup(content, "html.parser")
images = getImageLinks(soup)
title = getTitle(soup)
title = formatFileName(title)
print(u"页面标题 : " , title )
print(u"本页图片数量 :",len(images))
print(u"正在创建文件夹以用来保存所有图片")
makeDirectory(title)
threads = []
for image in images:
print(u"图片地址 : " + image)
threads.append(myThread(image, title))
for t in threads:
t.start()
while True:
if(len(threading.enumerate()) < threadNumber):
break
print(u"所有图片已加入下载队列 ! 正在下载...")
python多线程采集图片的更多相关文章
- Python多线程采集百度相关搜索关键词
百度相关搜索关键词抓取,读取txt关键词,导出txt关键词 #百度相关搜索关键词抓取,读取txt关键词,导出txt关键词 # -*- coding=utf-8 -*- import request ...
- python多线程采集
import requests import json import threading Default_Header = { #具体请求头自己去弄 } _session=requests.sessi ...
- python多线程批量下载远程图片
python多线程使用场景:多线程采集, 以及性能测试等 . 数据库驱动类-简单封装下 mysqlDriver.py #!/usr/bin/python3 #-*- coding: utf-8 -*- ...
- Python查询MySQL进行远程采集图片实例
这是四五年以前做小说站采集图片时写过唯一一次 Python 代码 #!/usr/bin/python #-*-coding:utf-8-*- import MySQLdb, os, socket, t ...
- python多线程爬虫+批量下载斗图啦图片项目(关注、持续更新)
python多线程爬虫项目() 爬取目标:斗图啦(起始url:http://www.doutula.com/photo/list/?page=1) 爬取内容:斗图啦全网图片 使用工具:requests ...
- Python 多线程教程:并发与并行
转载于: https://my.oschina.net/leejun2005/blog/398826 在批评Python的讨论中,常常说起Python多线程是多么的难用.还有人对 global int ...
- 使用file_get_content系列函数和使用curl系列函数采集图片的性能对比
由于公司的一个汽车网站的后台的汽车内容都是主要是来自与汽车之家的,编辑的同事们必须天天手动去对着汽车之家来添加汽车,实在是太蛋疼了.于是乎,为了改变这种状况,作为一个开发码农,我的任务就来了...那就 ...
- Python多线程Selenium跨浏览器测试
前言 在web测试中,不可避免的一个测试就是浏览器兼容性测试,在没有自动化测试前,我们总是苦逼的在一台或多台机器上安装N种浏览器,然后手工在不同的浏览器上验证主业务流程和关键功能模块功能,以检测不同浏 ...
- 13行代码实现:Python实时视频采集(附源码)
一.前言 本文是<人脸识别完整项目实战>系列博文第3部分:程序设计篇(Python版),第1节<Python实时视频采集程序设计>,本章内容系统介绍:基于Python+open ...
随机推荐
- bfs迷宫
链接:https://ac.nowcoder.com/acm/contest/338/BSleeping is a favorite of little bearBaby, because the w ...
- MySQL忘记密码(终极解决方法,亲测有效,windows版本)
1.进入mysql的bin目录 2.net stop mysql 3.mysqld --skip-grant-tables 输入 mysqld --skip-grant-tables 回车. (--s ...
- SQLite - C/C++接口 API(一)
1.sqlite3_open(const char *filename, sqlite3 **ppDb) 该例程打开一个指向 SQLite 数据库文件的连接,返回一个用于其他 SQLite 程序的数据 ...
- c++开源库rapidxm
1.引入头文件: 一般用到的头文件: #include "rapidxml/rapidxml.hpp" #include "rapidxml/rapidxml_utils ...
- Spring boot+Thymeleaf传参跳转
$.ajax(): $.ajax({ type: "get", url:"/public/inform", async: true, data: detailJ ...
- 数据库的小案例(三):用递归实现TreeView层级显示
从这个小案例我学到了不少知识.这些无论如何无法从书里得来.正所谓实践出真知,学习编程需要大量实践这句话永不过时. 首先:好的代码和坏的代码带来的性能上的差异很明显.好的策略可以让你的程序运行速度大大加 ...
- 防止重复发送Ajax请求问题
在工作中有很多场景需要通过Ajax请求发送数据,像是注册.登录.提交用户反馈等.用户在点击了“确认”按钮之后有可能一段时间内没有收到反馈页面无任何反应,然后就接着连续多次点击“确认”按钮导致发送n个重 ...
- 炼金术(1): 识别项目开发中的ProtoType、Demo、MVP
软件开发是很分裂的,只有不断使用原则和规律,才能带来质量. 只要不是玩具性质的项目,项目应该可以大概划分为0-1,1-10,10-100,100-1000四个种重要阶段.其中,0-1是原型验证性的:1 ...
- STM的低功耗系列
STM32L0的2个新增外设:一是集成了晶振的USB,第二高精度的12位或16位ADC: 特色外设LUART:传统的MCU当CPU睡眠,进入低功耗模式下,外设是关闭的,因为时钟是关闭的,而意法半导体的 ...
- RPC远程服务调用
RPC远程服务调用: RPC 的全称是 Remote Procedure Call 是一种进程间通信方式. 它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编 ...