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#拾遗补阙【01】:字符串
一.string是特殊的引用类型 众所周知,string是引用类型.为什么string是引用类型,最简单的方法,f12转到string的定义.显而易见,string的本质是类,字符串存储在堆中,而 ...
- C# winform自己的窗体不抢夺其他窗体的光标
在你的form里加入: protected override CreateParams CreateParams { get { var result = base.CreateParams; ; r ...
- Spring基于xml注入bean的几种方式?
(1)Set方法注入: (2)构造器注入:①通过index设置参数的位置:②通过type设置参数类型: (3)静态工厂注入: (4)实例工厂:
- redis 过期键的删除策略?
1.定时删除:在设置键的过期时间的同时,创建一个定时器 timer). 让定时器在键 的过期时间来临时,立即执行对键的删除操作. 2.惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的 ...
- volatile 类型变量提供什么保证?
volatile 变量提供顺序和可见性保证,例如,JVM 或者 JIT 为了获得更好的性能 会对语句重排序,但是 volatile 类型变量即使在没有同步块的情况下赋值也不会 与其他语句重排序. vo ...
- IIS在ASP.NET Core下的两种部署模式
KestrelServer最大的优势体现在它的跨平台的能力,如果ASP.NET CORE应用只需要部署在Windows环境下,IIS也是不错的选择.ASP.NET CORE应用针对IIS具有两种部署模 ...
- 原理图Checklist
类别 描述 检视规则 原理图需要进行检视,提交集体检视是需要完成自检,确保没有低级问题. 检视规则 原理图要和公司团队和可以邀请的专家一起进行检视. 检视规则 第一次原理图发出进行集体检视后所有的修改 ...
- div 底部固定方法(不用position定位)
方法一:全局增加一个负值下边距等于底部高度 <style> html, body { height: 100%; margin: 0; } .content { padding: 20px ...
- 判断页面环境是否在小程序的webview中
最近公司需要做小程序项目,但是又希望能够快速开发,就想着把web端的响应式页面放到webview里快速开发.但在判断页面环境的时候出现一些问题. 环境问题 用小程序提供的wx.miniProgram. ...
- CSS揭秘之《背景图案》
网格 html { background: #58a; background-image: linear-gradient(white 2px, transparent 0), linear-grad ...