1. 程式人生 > 其它 >Python爬蟲指令碼 ,Uni-APP複選框做出雙向繫結 ,Net5工作流建模 。的一點經驗

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 繫結 在哪個工作流,在工作流的那個節點。 每一級審批人員的審批資訊。

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