Python爬蟲腳本 ,Uni-APP復選框做出雙向綁定 ,Net5工作流建模 。的一點經驗


從業C#開發多年,現在也經常用到Python 做網絡爬蟲 ,用Uni-app做手機前端。攢了一點經驗。供其他多語言開發程序員借鑒吧。

     Python做爬蟲和其他的方式做爬蟲最大的區別應該在於. Python 可以將瀏覽器內核寄宿到程序里。例如Ie內核。火狐內核。google內核。然后可以模擬人對瀏覽器的操作。不是簡單的發起HTTP請求然后解析頁面就結束。而是可以在頁面上進行多次點擊操作。程序還能一直監聽發生變化后的頁面元素。

 

from selenium import webdriver
from lxml import etree
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
webdriver 是python 將瀏覽器寄宿到程序的框架。並且可以模擬用戶的操作。也提供基本的HTML解析方式
selenium 是更深一層 操作瀏覽器和 解析HTML元素的框架。有時候 同一段代碼 webdriver 解析不出來 selenium 就是能解析出來。可能底層優化的更好吧 
etree 會將HTML 解析成對象。獲取里面的屬性。
三者結合使用或許效果更好。

   options = webdriver.FirefoxOptions()
         fp = webdriver.FirefoxProfile()
         #    fp.set_preference('browser.download.dir',Common.getSection('downfile'))  
         fp.set_preference("browser.download.folderList",2)  
         fp.set_preference("browser.download.manager.showWhenStarting",False)
         fp.set_preference("browser.helperApps.neverAsk.saveToDisk","application/zip,application/octet-stream")
         driver = webdriver.Firefox(firefox_profile=fp,options=options)
browser.download.dir 指的是下載路徑
browser.download.manager.showWhenStarting 指的是下載是否彈出詢問框
browser.helperApps.neverAsk.saveToDisk 指的是下載的文件類型 ,如果爬頁面還要獲取網頁下載的zip,或者jpg。這里都要用逗號加上文件的類型。
  driver.get("http://www.stbchina.cn/item.html#?itemId="+itemCode.strip())
           
driver.get 寫入你要爬取的地址
如果順利的話,你可以看到程序啟動了火狐瀏覽器並跳到了對應的網址上
不想看到瀏覽器的話,插入一下代碼
  options.add_argument('--headless')

瀏覽器會被隱藏

 很多時候我們需要等待頁面加載元素完畢后才能解析不然后程序會直接異常,接下來推薦兩個等待響應的方法
element = WebDriverWait(driver, 10).until(

EC.presence_of_element_located((By.ID, "YOU-iD"))

)

這段代碼會等待頁面十秒鍾。在十秒內將元素加載成功后才會繼續往下執行代碼

但是過了十秒以后。元素還沒有加載成功。會走入異常

也可以簡單粗暴的使用線程掛起的方式,Python 程序停止響應幾秒鍾,但是並不影響寄宿的瀏覽器去加載頁面元素

time.sleep(int(3))

在頁面加載成功以后可以使用各種方式解析元素,或者操作頁面

html = etree.HTML(driver.page_source) 

解析html頁面元素通常使用xpath ,如果大家不想學習xpath表達式。瀏覽器提供簡單粗暴的方法

listImg=html.xpath('//*[contains(@class,"formwork_img")]/img')

點擊頁面右鍵 檢查, 會出現我們都熟悉的控制台,在Elements里選擇dom節點右鍵 copy , 然后在右側的彈出框里選擇 copy xpath。你會發現瀏覽器將寫好的xpath語法寫入了你的剪切板

獲取元素的屬性可以用 

itme.attrib["src"]

當變成樹狀結構以后基本就跟操作tree 差不多

操作頁面的話可以用

script=driver.find_element_by_xpath("//a[contains(text(),'發票下載')]").get_attribute('onclick')

找到某一個a標簽。文本為發票下載。發送點擊事件。但是我更推薦使用js腳本。

  driver.execute_script('$("#sqrqq").val("'+strTime+'")')
                                       driver.execute_script('$("#sqrqz").val("'+endTime+'")')
                             
                                       driver.execute_script('searchXzqq()')

 

就像大家用js操作前端一樣。比發送點擊事件更加靠譜。因為經常點擊事件沒有響應。

Uni-APP 最近
使用場景有涉及到復選框做購物車,但是我在官網搜了一遍復選框的案例。我似乎看到官方回答,目前還不支持雙向綁定,於是我自己做了一個

 

 
        

 

 
        
<checkbox-group class="agreement_radio" @change="checkboxChange">
 
        

 

 
        
checkbox-group 可以作為頂級父節點,類似Body, 綁定點擊事件
根節點包含循環的數據體。

 

 
        

  像這楊什么都可以包進去,它只是一個頂級父節點而已。每一個復選框包含一組數據。

  Uni-app 目前的版本,哪怕你value 綁定了數據。checked 綁定了數據。在最后提交整個數組的時候,其實依舊不會改變綁定數組的checked.所以需要我們手動綁定。

   再每次選中和取消復選框的時候觸發事件 checkboxChange ,e.detail.value 是選中的數組的Value.被取消選中和沒有選中的復選框是不會傳遞值的。而且不會改變綁定的數據。這多多少少有點不合適。在目前的版本。

所以當綁定數組和復選框改變事件的數據可以產生交集的時候。使用多重循環改變綁定數組的值。就可以雙向綁定復選框和綁定數組了。



//整個購物車單條數據的選中和取消選中 checkboxChange: function(e) { // console.log(this.cart) var items = this.cart, values = e.detail.value; for (let b = 0; b < this.cart.length; b++) { for (let c = 0; c < this.cart[b].length; c++) { let continueArr = values.filter(item => { return item == this.cart[b][c].value; }) if (continueArr.length > 0) { this.cart[b][c].checked = true; } else { this.cart[b][c].checked = false; } //console.log("選中的值:" + continueArr) } } //console.log( this.cart) }
 
        
目前Net core 已經升級到了 NET 5 。以后既不是FrameWork 框架也不是Net core框架。其實底層也有Core的影子。
但是肯定不在通用老版的Net工作流框架了
於是百般無奈下自己琢磨了一套工作流思想和底層結構

一套后台可配置工作流

 

 
        

 

以及 APP前台審批

 

 
        

 

核心還是數據庫的四張表

 

 
        

[WorkFlowTemplate]表如下,其實沒什么用,只是為了在后台管理時可以區分每個工作流叫什么。

 
        

 

 

 Guid 類似主鍵

 Name 是這條工作流的名稱 

 Type 是工作流的類型,比如 1=審批工作流 ,2=招標工作流

  DepartmentId 是這個工作流掛在員工的部門Id。這個部門的人員發起的審批工作流直接走此工作流的審批鏈

 

 

 

[WorkFlowTemplateNode] 是此條工作流的審批鏈
Name表示這條審批鏈下此節點叫什么,
TempLateId 綁定到 WorkFlowTemplate的唯一表示主鍵下。
userList 存放此次審批節點的審批人集合。
TemplateType 審批節點的類型已經棄用了,當初定的是為1 需要此審批節點下全部人員通過,為0只要有一個人審批通過便算此審批節點通過。
Number 指的是此審批鏈下的第幾個節點。為0是第一個審批節點,為1為2 以此類推。

工作流審批鏈就到此為止了,接下來是用戶發起場景以及關聯工作流

 

   比如Order 表是用戶發起申領物品的主表,

   Reson 是用戶申領的事由 

  OrderId 是此申領表的唯一主鍵

  User_Sid 是用戶唯一主鍵

  其他不相關的申領詳情表就略過了。。。。

  當用戶發起申請的時候,除了Order用戶申領表,還有工作流任務關聯表

    

 

    這下用戶發起的請求,關聯的工作流以及審批鏈就串聯起來了。

     UserId 是誰發起的,

     OrderId 關聯那個申領單,

     NodeId已棄用,

     Gudi是當前用戶關聯工作流唯一主鍵

     WorkId是關聯的工作流

     接下來是每一級審批鏈每一個審批人的相關信息

     

 

 

       userId 是當前任務的審批人

       TaskId 是用戶關聯工作流表 唯一主鍵,也就是上一張表的主鍵,

       Desc 是備注,

       attachment 是附件,

       status 是審批狀態,

       NodeId 是 用戶關聯工作流表 次級審批的節點唯一主鍵 。用於判斷這個人審批哪一環節。以及狀態信息。

 

 

 

 

 

      串聯起來就是 先生成 WorkFlowTemplate 工作流模塊流程,

      然后WorkFlowTemplateNode綁定此模塊的次級審批人物

      接着 WorkFlow_Node 關聯用戶,申領信息,綁定工作流,

      最后 WorkFlow_Task 綁定 在哪個工作流,在工作流的那個節點。 每一級審批人員的審批信息。

      接口里關聯用戶,申領行為,發起審批。以及每一級審批的通過拒絕。以及扭轉到下一級審批就不講了,畢竟每個公司的業務不一致。這四張核心主表。就可以完成整個工作流的扭轉。

 

   

 

 








免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM