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放入待抓 ...
随机推荐
- VMware Workstation网络修改vlan id值
我们捣鼓虚拟机时,有时候网卡是需要承载多个vlan的,比如说部署fuel时网卡3需要承载私有,管理,存储网络的流量. 在virtualbox中我们可以直接在混杂模式项选择全部允许,但是在VMware ...
- CF932G Palindrome Partition(回文自动机)
CF932G Palindrome Partition(回文自动机) Luogu 题解时间 首先将字符串 $ s[1...n] $ 变成 $ s[1]s[n]s[2]s[n-1]... $ 就变成了求 ...
- CF1556F Sports Betting (状压枚举子集DP)
F 对于一张比赛图,经过缩点,会得到dag,且它一定是transitive的,因此我们能直接把比赛图缩成一个有向链.链头作为一个强连通分量,里面的所有点都是胜利的 定义F(win)表示win集合作为赢 ...
- HTTP发展史,HTTP1.1与HTTP2.0的区别
前言 我们知道HTTP是浏览器中最重要且使用最多的协议,它不仅是浏览器与服务端的通信语言,更是互联网的基石.随着浏览器的不断更新迭代,HTTP为了适应技术的更新也在不断进化,学习HTTP的最佳途径就是 ...
- Java中的软引用、弱引用、虚引用的适用场景以及释放机制
Java的强引用,软引用,弱引用,虚引用及其使用场景 从 JDK1.2 版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引 ...
- Spring由哪些模块组成?
以下是Spring 框架的基本模块: Core module Bean module Context module Expression Language module JDBC module ORM ...
- springcloud如何实现服务的注册?
1.服务发布时,指定对应的服务名,将服务注册到 注册中心(eureka zookeeper)2.注册中心加@EnableEurekaServer,服务用@EnableDiscoveryClient,然 ...
- 基于redis实现未登录购物车
springboot 工程 主要说明购物车流程(故将登录用户信息保存至session) 未登录时 将用户临时key 保存至cookie 有不足之处 请大佬指点 项目源码: https://github ...
- instanceof关键字使用的方法(解决转型异常ClassCastException)
一丶问题显现: 当你是父类的情况下,像使用子类的特定功能,就需要向下转型,但向下转型有可能会报错(ClassCastException) 而instanceof关键字就是解决异常的小能手,他能判断是否 ...
- labview和matlab区别
LabVIEW和MATLAB作为本身功能比较完善的软件环境,在各自不同的领域中有着十分广泛的应用.下面小编就详细介绍LabVIEW和MATLA以及它们之间的区别. 一.LabVIEW简介 LabVIE ...