快看,這是我為你準備的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、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...