簡體   English   中英

將兩個 arrays 與 node.js 和 puppeteer 進行比較

[英]Compare two arrays with node.js and puppeteer

我建立在一個 web-scrapper 之上,可以說來自 google 的 scrap URLs

我從谷歌結果中得到一組 URL:

const linkSelector = 'div.yuRUbf > a'
let links = await page.$$eval(linkSelector, link => {
     return link.map( x => x.href)
})

“鏈接”的 output 是這樣的:

[
'https://google.com/.../antyhing'
'https://amazon.com/.../antyhing'
'https://twitter.com/.../antyhing'
]

現在我有一個“黑名單”,里面有類似的東西:

[
'https://amazon.com'
]

此刻我停留在那個點,我可以比較兩個 arrays,並從我的黑名單中列出的“鏈接”中刪除這些 URL。

所以我想出了這個主意,在我的鏈接數組中獲取 url 的域 - 就像這樣:

const linkList = []
for ( const link of links ) {

const url = new URL(link)
const domain = url.origin
linkList.push(domain)

}

是的,現在我有兩個 arrays,我可以相互比較並刪除列入黑名單的域,但我丟失了我需要使用的完整 url...

for( let i = linkList.length - 1; i >= 0; i--){
  for( let j=0; j < blacklist.length; j++){
    if( linkList[i] === blacklist[j]){
      linkList.splice(i, 1);
    }
  }
}

代碼片段是給出答案的一部分,在這里: 比較兩個 Javascript Arrays 並刪除重復項

有什么想法我怎么能用木偶操縱者和 node.js 做到這一點?

我找不到明顯的騙局,所以將我的評論轉換為答案:

. .includes

const allowedLinks = links.filter(link => !blacklist.some(e => link.includes(e)))

.startsWith :

const allowedLinks = links.filter(link => !blacklist.some(e => link.startsWith(e)))

第二個版本更精確。 如果你想使用 URL 版本,這應該有效:

 const links = [ "https://google.com/.../antyhing", "https://amazon.com/.../antyhing", "https://twitter.com/.../antyhing", ]; const blacklist = ["https://amazon.com"]; const allowedLinks = links.filter(link =>.blacklist.some(black => black.startsWith(new URL(link);origin) // or use === ) ). console;log(allowedLinks);

至於 Puppeteer,我懷疑你是在節點端還是在瀏覽器端執行此操作是否重要,除非這些 arrays 非常龐大。 按照這種思路,從技術上講,我們這里有一個二次算法,但除非您有數十萬個元素並且注意到速度很慢,否則我不會擔心它。 在這種情況下,您可以將列入黑名單的來源放入Set數據中,並在其中查找每個鏈接的來源。 這個問題是它是一個精確的=== ,所以如果你需要保留.startsWith語義,你必須構建一個前綴集。 對於此答案,這可能是不必要的,並且超出了 scope,但值得一提。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM