快看,這是我為你準備的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
  • 1、什麼是MQTT? MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),是一種基於發佈/訂閱(publish/subscribe)模式的"輕量級"通訊協議,該協議構建於TCP/IP協議上,由IBM在1999年發佈。MQTT最大優點在於,可以以極 ...
  • 溫馨提示,請使用ctrl+F進行快速查找 ws2_32.lib error LNK2001: 無法解析的外部符號 __imp_htons error LNK2001: 無法解析的外部符號 __imp_ntohl error LNK2001: 無法解析的外部符號 __imp_ntohs error L ...
  • public static void GetRegistData() { string name = "huishuangzhu"; //搜索到註冊表根目錄 RegistryKey hkml = Registry.ClassesRoot; //搜索到註冊表根目錄下的XXX文件夾。 RegistryK ...
  • 作者:小牛呼嚕嚕 | https://xiaoniuhululu.com 電腦內功、JAVA源碼、職業成長、項目實戰、面試相關資料等更多精彩文章在公眾號「小牛呼嚕嚕」 前言 讀過筆者之前的一篇文章Java記憶體模型(JMM)詳解, 我們知道了由於電腦為了充分利用CPU的高性能,以及各個硬體 存取速 ...
  • 使用Apache PDFBox實現拆分、合併PDF 問題背景 如何拆分PDF? 如何合併PDF? 如何拆分併合並PDF實現去除PDF的某些頁? Apache PDFBox介紹 Apache PDFBox 1.8.10官方文檔 Apache PDFBox 庫是一個開源的 Java 工具,用於處理 PD ...
  • 問題:是不是虛函數的調用就一定是動態綁定?不是的 1:在類的構造函數當中,調用虛函數,也是靜態綁定(構造函數中對虛函數的調用不發生動態綁定) 2:如果不是通過指針或者引用變數來調用虛函數,那就是靜態綁定 代碼1 class Base { public: Base(int data=10):ma(da ...
  • 本篇文章我們將進一步探討下Guava Cache 實現層面的一些邏輯與設計策略,讓我們可以對Guava Cache整體有個更加明朗的認識,促進實際使用中對其的理解。 ...
  • JZ12 矩陣中的路徑 描述 請設計一個函數,用來判斷在一個n乘m的矩陣中是否存在一條包含某長度為len的字元串所有字元的路徑。路徑可以從矩陣中的任意一個格子開始,每一步可以在矩陣中向左,向右,向上,向下移動一個格子。如果一條路徑經過了矩陣中的某一個格子,則該路徑不能再進入該格子。 思路 我們看到他 ...
  • 抽象類和普通類有什麼區別? 抽象類一般不用作抽象實體類型 一般把上面類設計為抽象類? 基類 定義抽象類的唯一目的, 就是去建立派生類. 我們在抽象類基礎上要定義出功能各異的派生類, 再用這些派生類去建立對象. 凡是包含純虛函數的類都是抽象類. 純虛函數不用實現, 故不能被調用, 抽象類無法建立對象. ...
  • 打包下載成.zip文件 項目背景 公司使用vue + SpringBoot實現批量下載功能 今天在調試批量下載這個功能。打包成.zip文件時,在返回給前端瀏覽器出現報錯信息: 後端報錯: ERROR c.c.p.c.e.BusinessExceptionHandler - java.io.IOExc ...