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协程内容请观看