快看,這是我為你準備的Python爬取圖片教程

来源:https://www.cnblogs.com/123456feng/archive/2022/05/08/16210585.html
-Advertisement-
Play Games

爬取圖片實例 •selenium+win32爬取圖片 Python學習交流Q群:903971231##### """爬取圖片""" import os import threading import time from ctypes import windll import requests imp ...


爬取圖片實例

在這裡插入圖片描述

•selenium+win32爬取圖片

Python學習交流Q群:903971231#####
"""爬取圖片"""
import os
import threading
import time
from ctypes import windll

import requests
import win32ap
iimport win32clipboard
import win32con
from PySide2 import QtWidgets
from requests_html import HTMLSession, HTML
from PySide2.QtGui import QPixmap, QColor, QStandardItemModel, QStandardItem
from PySide2.QtCore import QFile, Qt, QDateTime, QDate, QTime, QTimer, QStringListModel, QModelIndex
from PySide2.QtUiTools import QUiLoader
from PySide2.QtWidgets import QApplication, QTreeView, QTreeWidget, QHeaderView, QTreeWidgetItem, QWidget
from bs4 import BeautifulSoup
from selenium import webdriverfrom selenium.webdriver import ActionChainsfrom selenium.webdriver.chrome.options import Optionsfrom selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class Test:    
def __init__(self):        
super(Test, self).__init__()
file = QFile('UI.ui')        
file.open(QFile.ReadOnly)        
file.close()
self.ui = QUiLoader().load(file)
self.ui.B_start.clicked.connect(self.start)        
self.ui.B_left.clicked.connect(lambda: self.change_index('left'))        
self.ui.B_right.clicked.connect(lambda: self.change_index('right'))
#定義圖片列表        
self.img_list = []        
#圖片自適應        
self.ui.label.setScaledContents(True)        
#當前顯示的圖片索引        
self.index = 0
self.headers = {            
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",            
"Accept-Encoding": "gzip, deflate",            
"Accept-Language": "zh-CN,zh;q=0.9",           
 "Upgrade-Insecure-Requests": "1",            
 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36",        }
 self.text = ''
     # 使用phantomJS消除瀏覽器界面        
#self.browser = webdriver.PhantomJS()        
#出警告可使用設置chrome的方法        
#瀏覽器設置        
options = Options()        
options.add_argument('--headless')       
 # self.browser = webdriver.Chrome(options=options)        
 self.browser = webdriver.Chrome()        
 self.wait = WebDriverWait(self.browser, 30)
self.session = requests.Session()
self.pull()        
self.start_show_pic()
 def change_index(self, button):        
 if button == 'left':            
 self.index -= 1            
 pix = QPixmap('圖片/' + self.img_list[self.index])            
 self.ui.label.setPixmap(pix)       
  else:            
  self.index += 1            
  pix = QPixmap('圖片/' + self.img_list[self.index])            
  self.ui.label.setPixmap(pix)
def start_show_pic(self):        
t1 = threading.Thread(target=self.show_pic)        
t1.setDaemon(True)        t1.start()
    def show_pic(self):        
    while True:            
    for i in os.walk('圖片'):                
    self.img_list = i[2]            
    if self.img_list:                
    pix = QPixmap('圖片/' + self.img_list[self.index])                
    self.ui.label.setPixmap(pix)                
    time.sleep(3)                
    self.index += 1                
    if self.index > len(self.img_list):                    
    self.index = 0
    def start(self):       
     t1 = threading.Thread(target=self.get_img)        
     t1.setDaemon(True)        
     t1.start()
    def pull(self):       
     """        
查看是否有目標網站的源代碼,如果有就讀取,        
如果沒有就發送請求       
 """        
 if os.path.exists('爬取圖片.html'):            
 with open('爬取圖片.html', 'r', encoding='utf8') as f:                
 self.text = f.read()                
 # print(self.text)        
 else:            
 self.browser.get('http://www.netbian.com/')            
 self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.list')))            
 self.text = self.browser.page_source            
 with open('爬取圖片.html', 'w', encoding='utf8') as f:                
 f.write(self.text)            
 print(self.text)
 self.ui.B_start.setEnabled(True)
def get_img(self):        
html = BeautifulSoup(self.text, 'lxml')        
href_url = html.select('.list ul li a')        
print(href_url)        
for a in href_url:            
#print('@@@', a)            
if a['href'].startswith('/desk'):                
url = 'http://www.netbian.com' + a['href']                
#print(url)                
self.browser.get(url)                
pic = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.pic')))                
soup = BeautifulSoup(self.browser.page_source, 'lxml')                
img = soup.select_one('#main > div.endpage > div > p > a > img')                
#print(img)                
#print(img)                
url = img['src']                
title = img['title']
#獲取路徑                
path = os.path.join(os.getcwd(), '圖片', title + '.jpg')
if len(self.browser.window_handles) > 1:                    
self.browser.switch_to.window(self.browser.window_handles[1])                    
self.browser.close()                    
self.browser.switch_to.window(self.browser.window_handles[0])
# action = ActionChains(self.browser)                
# action.move_to_element(pic)                
# action.context_click(pic)  # 右鍵點擊該元素                
# action.perform()                
# time.sleep(1)
 # action.send_keys('v')               
  # action.perform()                
  time.sleep(1)
 if os.path.exists(path):                    
 self.ui.listWidget.addItem(title + '.jpg 已存在,不下載')                    
 self.ui.listWidget.setCurrentRow(self.ui.listWidget.count() - 1)
else:
                    
# 滑鼠移動到位置點右鍵                    
windll.user32.SetCursorPos(500, 700)                    
win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0)                    
time.sleep(0.05)                    
win32api.mouse_event(win32con.MOUSEEVENTF_RIGHTUP, 0, 0, 0)                    
time.sleep(1)                    
# 按下v                    
win32api.keybd_event(86, 0, 0, 0)                    
win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0)
# 將路徑複製到剪切板                    
win32clipboard.OpenClipboard()                    
win32clipboard.EmptyClipboard()                    
win32clipboard.SetClipboardText(path)                    
win32clipboard.CloseClipboard()
 # 滑鼠定位輸入框並點擊                    
 windll.user32.SetCursorPos(274, 449)                   
  win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0)                    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0)                    
  time.sleep(1)
 # 按下ctrl+v                   
  win32api.keybd_event(17, 0, 0, 0)                    
  win32api.keybd_event(86, 0, 0, 0)                    
  win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0)                    
  win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0)                   
   time.sleep(3)
# 按下回車                    
win32api.keybd_event(13, 0, 0, 0)                    
win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0)                   
 time.sleep(2)                    self.ui.listWidget.addItem(title + '.jpg 下載完成')                    self.ui.listWidget.setCurrentRow(self.ui.listWidget.count() - 1)
 # res = self.session.get(url, headers=self.headers)               
# print(res.text)                
# with open('圖片/' + title + '.jpg', 'wb') as f:                
#     f.write(res.content)                
# print(title + '.jpg 下載完成')

 elif a['href'].startswith('/index'):               
  url = 'http://www.netbian.com' + a['href']                
  print(url)                
  self.browser.get(url)                
  self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.list')))                
  self.text = self.browser.page_source                
  self.ui.listWidget.addItem('下一頁')                
  self.ui.listWidget.setCurrentRow(self.ui.listWidget.count() - 1)                
  self.get_img()

if __name__ == '__main__':    app = QApplication([])    
# 設置fusion風格    
app.setStyle('Fusion')    
window = Test()    
window.ui.show()    
app.exec_()

 

最後

今天的分享到這裡就完了,祝大家五一快樂鴨!!!

在這裡插入圖片描述


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 嗨嘍!大家好呀 第三方模塊: requests >>> pip install requests 模塊安裝問題: 如果安裝python第三方模塊: win + R 輸入 cmd 點擊確定, 輸入安裝命令 pip install 模塊名 (pip install requests) 回車 在py ...
  • 一、Matplotlib 博文來源:https://www.runoob.com/matplotlib/matplotlib-tutorial.html Matplotlib 是 Python 的繪圖庫,它能讓使用者很輕鬆地將數據圖形化,並且提供多樣化的輸出格式。 Matplotlib 可以用來繪製 ...
  • 在系統開發的過程中,必然存在耗時極高的動作,是基於請求響應模式無法解決的問題,通常會採用解耦的思維,並基於非同步或者事件驅動的方式去調度整個流程的完整執行。 ...
  • 一個工作了2年的粉絲,私信了一個比較簡單的問題。 說: “Spring中事務的傳播行為有哪些?” 他說他能記得一些,但是在項目中基本上不需要配置,所以一下就忘記了。 結果導致面試被拒絕,有點遺憾! ok,關於這個問題,看看普通人和高手的回答。 普通人: 嗯。。。。。。。。 高手: 對於這個問題,需要 ...
  • 函數的定義和使用 def test(x): # x代表形參 ''' 2*x+1 :param x:整形數字 :return:返回計算結果 ''' y = 2*x+1 return y p = test(3) # test()表示運行名為test函數,3代表實參,給x進行賦值 print(p) 函數的 ...
  • 介紹瞭如何在程式代碼中嵌入IPython用於調試,並分析了優點與不足 ...
  • C++進階-3-6-map/multimap容器 1 #include<iostream> 2 #include<map> 3 using namespace std; 4 5 // map / multimap容器 6 7 void printMap(map<int, int>& m) { 8 f ...
  • 模塊與包 一、Python 模塊簡介 在開發過程中,隨著程式代碼越寫越多,在一個文件里代碼就會越來越長,越來越不容易維護。 後面我們學習了函數,知道函數是實現一項或多項功能的一段程式,這樣就更方便我們重覆使用代碼。 緊接著,我們有學了類,類可以封裝方法和變數(屬性)。這樣就更方便我們維護代碼了。 我 ...
一周排行
    -Advertisement-
    Play Games
  • PasteSpider是什麼? 一款使用.net編寫的開源的Linux容器部署助手,支持一鍵發佈,平滑升級,自動伸縮, Key-Value配置,項目網關,環境隔離,運行報表,差量升級,私有倉庫,集群部署,版本管理等! 30分鐘上手,讓開發也可以很容易的學會在linux上部署你得項目! [從需求角度介 ...
  • SQLSugar是什麼 **1. 輕量級ORM框架,專為.NET CORE開發人員設計,它提供了簡單、高效的方式來處理資料庫操作,使開發人員能夠更輕鬆地與資料庫進行交互 2. 簡化資料庫操作和數據訪問,允許開發人員在C#代碼中直接操作資料庫,而不需要編寫複雜的SQL語句 3. 支持多種資料庫,包括但 ...
  • 在C#中,經常會有一些耗時較長的CPU密集型運算,因為如果直接在UI線程執行這樣的運算就會出現UI不響應的問題。解決這類問題的主要途徑是使用多線程,啟動一個後臺線程,把運算操作放在這個後臺線程中完成。但是原生介面的線程操作有一些難度,如果要更進一步的去完成線程間的通訊就會難上加難。 因此,.NET類 ...
  • 一:背景 1. 講故事 前些天有位朋友在微信上丟了一個崩潰的dump給我,讓我幫忙看下為什麼出現了崩潰,在 Windows 的事件查看器上顯示的是經典的 訪問違例 ,即 c0000005 錯誤碼,不管怎麼說有dump就可以上windbg開幹了。 二:WinDbg 分析 1. 程式為誰崩潰了 在 Wi ...
  • CSharpe中的IO+NPOI+序列化 文件文件夾操作 學習一下常見的文件、文件夾的操作。 什麼是IO流? I:就是input O:就是output,故稱:輸入輸出流 將數據讀入記憶體或者記憶體輸出的過程。 常見的IO流操作,一般說的是[記憶體]與[磁碟]之間的輸入輸出。 作用 持久化數據,保證數據不再 ...
  • C#.NET與JAVA互通之MD5哈希V2024 配套視頻: 要點: 1.計算MD5時,SDK自帶的計算哈希(ComputeHash)方法,輸入輸出參數都是byte數組。就涉及到字元串轉byte數組轉換時,編碼選擇的問題。 2.輸入參數,字元串轉byte數組時,編碼雙方要統一,一般為:UTF-8。 ...
  • CodeWF.EventBus,一款靈活的事件匯流排庫,實現模塊間解耦通信。支持多種.NET項目類型,如WPF、WinForms、ASP.NET Core等。採用簡潔設計,輕鬆實現事件的發佈與訂閱。通過有序的消息處理,確保事件得到妥善處理。簡化您的代碼,提升系統可維護性。 ...
  • 一、基本的.NET框架概念 .NET框架是一個由微軟開發的軟體開發平臺,它提供了一個運行時環境(CLR - Common Language Runtime)和一套豐富的類庫(FCL - Framework Class Library)。CLR負責管理代碼的執行,而FCL則提供了大量預先編寫好的代碼, ...
  • 本章將和大家分享在ASP.NET Core中如何使用高級客戶端NEST來操作我們的Elasticsearch。 NEST是一個高級別的Elasticsearch .NET客戶端,它仍然非常接近原始Elasticsearch API的映射。所有的請求和響應都是通過類型來暴露的,這使得它非常適合快速上手 ...
  • 參考delphi的代碼更改為C# Delphi 檢測密碼強度 規則(仿 google) 仿 google 評分規則 一、密碼長度: 5 分: 小於等於 4 個字元 10 分: 5 到 7 字元 25 分: 大於等於 8 個字元 二、字母: 0 分: 沒有字母 10 分: 全都是小(大)寫字母 20 ...