Python多线程Threading爬取图片,保存本地,openpyxl批量插入图片到Excel表中
之前用过openpyxl库保存数据到Excel文件写入不了,换用xlsxwriter
批量插入图片到Excel表中
1 import os
2 import requests
3 import re
4 from openpyxl import load_workbook
5 import xlsxwriter
6 from multiprocessing.dummy import Pool as ThreadPool
7 from openpyxl.drawing.image import Image
8
9 def spider(url):
10 headers = {
11 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'}
12 html = requests.get(url, headers, timeout=None)
13 pic_url = re.findall('class="product-image">.*?<img src="(.*?)" height="', html.text, re.S)
14 sku = re.findall('q=(\d+)', url, re.S)#正则匹配链接后面的sku
15 if pic_url != []:
16 print('正在下载'+sku[0]+'图片,图片地址:' + pic_url[0])
17 pic = requests.get(pic_url[0])
18 dir = cwd + '\\images\\' + sku[0] + '.jpg'
19 # print(dir)
20 with open(dir, 'wb') as file:
21 file.write(pic.content)
22 else:
23 if sku !=[]:
24 print('没有找到' + sku[0]+'产品')
25 No_images.append(sku[0])
26 #之前用过openpyxl创建新的Excel文件,但是写入不了,之后换用xlsxwriter保存数据到Excel
27 def save_excel(sku):
28 print(sku)
29 wb1 = xlsxwriter.Workbook(cwd + '\\' + 'No_images.xlsx')
30 ws1 = wb1.add_worksheet()
31 ws1.write(0, 0, 'No_images_sku')
32 for i in range(1,len(sku)+1):
33 ws1.write(i, 0, sku[i-1])
34 wb1.close()
35 print('保存没有图片的sku成功!')
36
37 #插入图片到Excel
38 def insert_images(sku):
39 wb = load_workbook(path)
40 ws = wb.worksheets[0]
41 img_path = cwd + '\\images\\'+sku+'.jpg'
42 print(img_path)
43 ws.column_dimensions['H'].width = 11#设置单元格列宽
44 try:
45 img = Image(img_path)
46 #设置图片大小
47 img.width = 80
48 img.height = 96
49 # print(img)
50 for i in range(1,ws.max_row+1):
51 if ws.cell(i,2).value == int(sku):
52 ws.row_dimensions[i].height = 88#设置单元格行高
53 ws.add_image(img,'H'+str(i))
54 wb.save(path)
55 except(FileNotFoundError) as e:
56 print(e)
57 wb.close()#每次插入一张图片需要关闭一次Excel表
58
59 if __name__ == '__main__':
60 cwd=os.getcwd()
61 path = cwd + '\\'+'图片测试.xlsx'
62 wb =load_workbook(path)
63 ws = wb.worksheets[0]
64 pool =ThreadPool(50)#开启多少个进程,四核电脑
65 urls = []
66 No_images = []
67 for i in range(1, ws.max_row+1):#通过循环将Excel数据读取出来
68 sku = ws.cell(i,2).value
69 if sku !=None:
70 print('正在爬取第'+str(i)+'个sku图片')
71 url = 'http://www.fulchic.com/catalogsearch/result/?q=' + str(sku)
72 urls.append(url)
73 pool.map(spider,urls)#多线程工作,其中,spider是爬虫函数名,urls是个爬取链接列表
74 pool.close()
75 pool.join()
76 #保存图片到本地
77 save_excel(No_images)
78 #循环写入保存图片,并设置单元格和图片大小
79 for i in range(1, ws.max_row + 1): # 通过循环将Excel数据读取出来
80 sku = ws.cell(i, 2).value
81 if sku != None:
82 print('正在保存第' + str(i) + '个sku图片')
83 insert_images(str(sku))
Python多线程Threading爬取图片,保存本地,openpyxl批量插入图片到Excel表中的更多相关文章
- python实现scrapy爬取图片到本地时的sha1摘要算法文件名
2017-03-29 Scrapy爬图片到本地应该会给图片自动生成sha1摘要算法文件名,我第一次用scrapy也不清楚太多,就在程序里自己写了一段实现这一功能的代码.需import hashlib ...
- 【Python】- scrapy 爬取图片保存到本地、且返回保存路径
https://blog.csdn.net/xueba8/article/details/81843534
- PHP 爬取图片 保存本地
public function getImage($url,$filename='') { if($url == ''){ return false; } if($filename == ''){ $ ...
- 用python库openpyxl操作excel,从源excel表中提取信息复制到目标excel表中
现代生活中,我们很难不与excel表打交道,excel表有着易学易用的优点,只是当表中数据量很大,我们又需要从其他表册中复制粘贴一些数据(比如身份证号)的时候,我们会越来越倦怠,毕竟我们不是机器,没法 ...
- python多线程threading.Lock锁用法实例
本文实例讲述了python多线程threading.Lock锁的用法实例,分享给大家供大家参考.具体分析如下: python的锁可以独立提取出来 mutex = threading.Lock() #锁 ...
- Python xlrd模块读取Excel表中的数据
1.xlrd库的安装 直接使用pip工具进行安装(当然也可以使用pycharmIDE进行安装,这里就不详述了) pip install xlrd 2.xlrd模块的一些常用命令 ①打开excel文件并 ...
- python xlrd 模块(获取Excel表中数据)
python xlrd 模块(获取Excel表中数据) 一.安装xlrd模块 到python官网下载http://pypi.python.org/pypi/xlrd模块安装,前提是已经安装了pyt ...
- scrapy爬虫系列之三--爬取图片保存到本地
功能点:如何爬取图片,并保存到本地 爬取网站:斗鱼主播 完整代码:https://files.cnblogs.com/files/bookwed/Douyu.zip 主要代码: douyu.py im ...
- python +requests 爬虫-爬取图片并进行下载到本地
因为写12306抢票脚本需要用到爬虫技术下载验证码并进行定位点击所以这章主要讲解,爬虫,从网页上爬取图片并进行下载到本地 爬虫实现方式: 1.首先选取你需要的抓取的URL:2.将这些URL放入待抓 ...
随机推荐
- 面试问题之C++语言:类模板声明与定义为何不能分开
C++中每个对象所占用的空间大小,是在编译的时候就确定的,在模板类没有真正的被使用之前,编译器是无法知道,模板类中使用模板类型的对象的所占用的空间的大小的.只有模板被真正使用的时候,编译器才知道,模板 ...
- String s = new String("xyz");创建了几个String Object?二者之间有什么区别?
两个或一个,"xyz"对应一个对象,这个对象放在字符串常量缓冲区,常量"xyz"不管出现多少遍,都是缓冲区中的那一个.New String每写一遍,就创建一个新 ...
- JavaScript使用原型链实现继承
JavaScript实现继承的思想: 一句话总结,让子类的原型等于父类的实例. 详细来说,其实利用了原型的性质即在JavaScript中所有被实例化对象具有相同的原型属性和方法,每一个被实例化对象的原 ...
- Collection 和 Collections 的区别?
Collection 是一个接口,它是 Set.List 等容器的父接口:Collections 是个一个 工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索. 排序.线程安全化等 ...
- spring重点知识分享
前言: spring是一个轻量级的开源的控制反转(Inversion of Control,IOC)和面向切面(AOP)的容器框架,它的主要目的是简化企业开发.这两个模块使得java开发更加简单.IO ...
- scrapy基于请求传参实现深度爬取
请求传参实现深度爬取 请求传参: 实现深度爬取:爬取多个层级对应的页面数据 使用场景:爬取的数据没有在同一张页面中 在手动请求的时候传递item:yield scrapy.Request(url,ca ...
- JVM的基础知识
一.JVM的基础知识 1.JVM内存结构: 1.JVM堆内存结构: 2.JVM内存分配: 3.Java的堆机构和垃圾回收: 4.Jvm堆内存配置参数: 5.JVM新生代概念和配置: 6.JVM老生代概 ...
- java支持多继承吗
java不支持多继承,只支持单继承(即一个类只能有一个父类).但是java接口支持多继承,即一个子接口可以有多个父接口.(接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个 ...
- 集合流之“将List<Integer>转为String并用逗号分割”
1.使用[流+Collectors]转换 import java.util.ArrayList; import java.util.List; import java.util.stream.Coll ...
- Python3通过字符串访问与修改局部变量
技术背景 在Python中定义一个函数时,就会把变量空间划分为全局变量(global)与局部变量(local),如果是定义在一个类的成员函数中,那么就还有额外的成员变量(self)空间.那么,如果在实 ...