pyqt5制作的百度图片爬取

from PyQt5.QtWidgets import *
import sys 
from PyQt5.QtCore import Qt
import requests
import aiohttp,re,asyncio,aiofiles
from lxml import etree 
import json

# 图片下载
async def claw(url,pathname):
	headers = {
		"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0"
	}
	try:
		async with aiohttp.ClientSession() as session:
			async with session.get(url,headers=headers) as res:
				pic = await res.content.read()
				async with aiofiles.open(pathname,'wb') as f:
					await f.write(pic)
					# print(pathname +"完成")
	except Exception as e:
		pass


# 图片链接获取
async def clawweb(url,path,n,key):
	task = []
	headers = {
		"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0"
	}
	params = {
		"tn": "resultjson_com",
		"logid": "6706688385989870117",
		"ipn": "rj",
		"ct": "201326592",
		"is": "",
		"fp": "result",
		"queryWord": key,
		"cl": "2",
		"lm": "-1",
		"ie": "utf-8",
		"oe": "utf-8",
		"adpicid": "",
		"st": "",
		"z": "",
		"ic": "",
		"hd": "",
		"latest": "",
		"copyright": "",
		"word": key,
		"s": "",
		"se": "",
		"tab": "",
		"width": "",
		"height": "",
		"face": "",
		"istype": "",
		"qc": "",
		"nc": "",
		"fr": "",
		"expermode": "",
		"nojc": "",
		"acjsonfr": "click",
		"pn": n*30,
		"rn": 30,
		"itg": 1,
		"gsm": "3c",
		"1633086944121":""
	}
	res = requests.get(url,params=params,headers=headers)
	# res.encoding='gzip'
	content = json.loads(res.text)
	for i in (content["data"])[0:len(content["data"])-1]:
		pathname = path + i["strategyAssessment"] + '.jpg'
		url = i["hoverURL"]
		task.append(asyncio.create_task(claw(url=url,pathname=pathname)))
	await asyncio.wait(task)

# 图形化界面
class clawpic(QWidget):
	def __init__(self):
		super().__init__()
		self.setUI()
		self.show()

	def setUI(self):
		# 创建控件

		#图片关键词
		self.pic_text = QLineEdit()
		self.pickey = QLabel()
		self.pickey.setText("图片关键字")
		self.pickey.setAlignment(Qt.AlignCenter)

		# 页数
		self.page_text = QLineEdit()
		self.page = QLabel()
		self.page.setText("起始页数")
		self.page.setAlignment(Qt.AlignCenter)

		self.page_text2 = QLineEdit()
		self.page2 = QLabel()
		self.page2.setText("最终页数")
		self.page2.setAlignment(Qt.AlignCenter)

		# 保存路径
		self.path_text = QLineEdit()
		self.pathbtu = QPushButton()
		self.pathbtu.setText("选择保存路径")
		self.pathbtu.clicked.connect(self.openpath)
		
		# 下载按钮
		self.download = QPushButton()
		self.download.setText("开始下载")
		self.download.clicked.connect(self.judgement)
				
		# 布局
		self.gridlayout = QGridLayout(self)

		self.gridlayout.addWidget(self.pic_text,0,0,1,1)
		self.gridlayout.addWidget(self.pickey,0,1,1,1)

		self.gridlayout.addWidget(self.page_text,1,0,1,1)
		self.gridlayout.addWidget(self.page,1,1,1,1)

		self.gridlayout.addWidget(self.page_text2,2,0,1,1)
		self.gridlayout.addWidget(self.page2,2,1,1,1)

		self.gridlayout.addWidget(self.path_text,3,0,1,1)
		self.gridlayout.addWidget(self.pathbtu,3,1,1,1)

		self.gridlayout.addWidget(self.download,4,0,1,2)

	def openpath(self):
		filename = QFileDialog.getExistingDirectory(self,"打开"," ",QFileDialog.ShowDirsOnly)
		self.path_text.setText(filename)
    
    # 开始运行爬取图片
	def downloadpic(self,key,page1,page2,path):				
		 
		url = "https://image.baidu.com/search/acjson?"
		for i in range(int(page1)-1,int(page2)):
			asyncio.run(clawweb(url=url,path=path + "/",n=i,key=key))
	# 判断输入框内容是否为空
	def judgement(self):
		key = self.pic_text.text()
		page1 = self.page_text.text()
		page2 = self.page_text2.text()
		path = self.path_text.text()
		if key == '':
			QMessageBox.warning(self,'警告','key不能为空!')
		elif page1 == '' or page2 == '':
			QMessageBox.warning(self,'警告','页数不能为空!')
		elif path == '':
			QMessageBox.warning(self,'警告','路径不能为空!')
		else:
			self.downloadpic(key=key,page1=page1,page2=page2,path=path)
			QMessageBox.information(self,'消息','下载完成!')


if __name__ == '__main__':
	app = QApplication(sys.argv)
	w = clawpic()
	sys.exit(app.exec_())

有关python协程内容请观看

协程与任务 — Python 3.9.7 文档

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值