So let's remember the code we had at the end of unit 2 for crawling the web.
So we used 2 variables. We initialized "tocrawl" to the seed, a list containing just the seed,
and we're going to use "tocrawl" to keep track of the pages to crawl.
We initialized "crawled" to the empty list, and we're keeping track of the pages we found using "crawled."
Then we had a loop that would continue as long as there were pages left to crawl.
We'd pop the last page off the "tocrawl" list.
If it's not already crawled, then we'll union into "tocrawl" all the links that we can find on that page,
and then we'll add that page to the list of pages we've already crawled.
So now we want to figure out how to change this so instead of just finding all the URLs,
we're building up our index.
We're looking at the actual content of the pages, and we're adding it to our index.
So the first change to make, we're updating the index, and we're going to change the return result.
So instead of returning "crawled" what we want to return at the end is the index.
`If we wanted to keep track of all the URLs crawled, we could still return "crawled" and return both "crawled" and "index,"
but let's keep things simple and just return "index."
That's what we really want for being able to respond to search queries.
So now we have one other change to make, and this is the important one.
We need to find a way to update the index to reflect all the words that are found on the page that we've just crawled.
I'm going to make one change before we do that.
Since both "getalllinks" and what we need to do to add the words to the index depend on the page,
let's introduce a new variable and store the content of the page in that variable.
This will save us from having to call "get_page" twice. "Get_page" is fairly expensive.
It requires a web request to get the content of the page.
It makes a lot more sense to store that in a new variable, and that will simplify this code.
So now we just need to pass in content.
So we have one missing statement,
and I'll leave it to you to see if you can figure out statement we need there to finish the web crawler.
When it's done, the result of "crawl-web," what we return as "index"
should be an index of all the content we find starting from the seed.
Am Ende von Unit 2 hatten wir also den folgenden Code.
Wir hatten 2 Variable. "Tocrawl" initialisierten wir mit "seed" - einer Liste nur mit "seed" -
und wir nehmen "tocrawl", um die noch nicht gecrawlten Seiten zu speichern.
"crawled" initialisierten wir mit einer leeren Liste und wir speichern die gefunden Seiten unter "crawled".
Dann hatten wir einen Loop, der so lange ausgeführt wird, bis wir keine Seiten zum Crawlen mehr haben.
Wir entfernen mit pop die letzte Seite von der "tocrawl"-Liste.
Wenn sie noch nicht gecrawlt worden ist, führen wir "union" aus, so dass sich alle Links der Seite unter "tocrawl" befinden,
und dann fügen wir diese Seite zu den Seiten, die bereits gecrawlt wurden, hinzu.
Nun wollen wir dies anders machen. Anstatt nur alle URL´s zu finden,
wollen wir unseren Index aufbauen.
Wir schauen auf den Inhalt der Seite und wir fügen ihn unserem Index hinzu.
Als erste Änderung aktualisieren wir den Index und ändern "return result".
So bekommen wir am Ende nicht "crawled", sondern Index.
Wenn wir alle gecrawlten URL´s verfolgen wollten, könnten wir "crawled" beibehalten und sowohl "crawled" als auch "index" mit return auslösen,
aber wir wollen es einfacher machen und lösen nur return"index" aus.
Das ist unser eigentliches Ziel, um Suchanfragen zu beantworten.
Jetzt müssen wir eine weitere wichtige Veränderung vornehmen.
Wir müssen den Index aktualisieren, so dass alle Wörter der gecrawlten Seite dort gelistet sind.
Zuvor mache ich eine weitere Änderung.
Da "getalllinks" und alles, womit wir Index aktualisieren müssen, von der Seite abhängt,
wollen wir eine neue Variable einführen und den Seiteninhalt in dieser Variablen speichern.
So müssen wir "get_page" nicht zweimal aufrufen. "Get_page" ist sehr kostspielig.
Wir müssen eine Webseite aufrufen, um den Seiteninhalt zu erhalten.
Es ist viel sinnvoller, diesen in einer neuen Variablen zu speichern. So wird der Code einfacher.
Jetzt müssen wir nur noch "content" einfügen.
Jetzt fehlt nur noch eine Programmzeile.
Findet bitte heraus, wie wir die Programmzeile definieren, um den Web Crawler fertig zu stellen.
Danach sollte das Ergebnis von "crawl-web" ( nach return "index")
einen Index mit dem Gesamtinhalt ab "seed" umfassen.
Ricordiamo il codice che avevamo alla fine della lezione 2 per attraversare il web
Abbiamo usato 2 variabili. Abbiamo inizializzato "tocrawl" con la pagina seme, una lista che contiene solo la pagina seme
ed useremo "tocrawl" per tenere traccia delle pagine da attraversare
Abbiamo inizializzato "crawled" come lista vuota, e terremo traccia delle pagine trovate usando "crawled"
Poi avevamo un ciclo che continuava fino a che rimanevano pagine da attraversare
Estraevamo l'ultima pagina dalla lista "tocrawl"
Se non era già stata attraversata, tramite "union" avremo aggiunto a "tocrawl" tutti i collegamenti che potevamo trovare su quella pagina
poi avremmo aggiunto quella pagina alla lista di pagine già attraversate
Ora vogliamo trovare un modo per modificare ciò così che, invece che cercare solo tutti gli URL
costruiremo anche il nostro indice
Cercheremo nell'effettivo contenuto delle pagine, e lo aggiungeremo al nostro indice
Quindi il primo cambiamento da fare è l'aggiornamento dell'indice, e la modiifica del risultato da ritornare.
Invece che ritornare "crawled", quello che vogliamo ritornare alla fine è l'indice
"Se volessimo tenere traccia di tutti gli URL attraversati, potremmo ancora ritornare "crawled" ed "index"
ma non complichiamo le cose e ritorniamo semplicemente "index"
Che è quello che veramente ci serve per essere in grado di rispondere alle interrogazioni di ricerca
Quindi abbiamo un altro cambiamento da fare, e questo è importante
Dobbiamo trovare un modo di aggiornare l'indice in modo da riflettere tutte le parole che sono state trovate nella pagina che abbiamo appena attraversato
Prima di fare questo andrò a fare una modifica
Visto che "getalllinks" e quello che dobbiamo fare per aggiungere le parole all'indice dipende dalla pagina
introduciamo una nuova variabile nella quale conserviamo il contenuto della pagina
Questo ci risparmierà dal dover chiamare "get_page" due volte. "get_page" è molto costosa
Occore una richiesta web per ottenere il contenuto della pagina
E' molto più sensato conservarlo in una nuova variabilie, ed il codice risulterà semplificato.
Ora dobbiamo solo passare il contenuto
Quindi abbiamo una istruzione mancante
e lascierò a voi cercare di scoprire l'istruzione che ci serve qui per finire il web crawler
Alla fine, il risultato di "crawl_web", quello che ritorniamo come indice
dovrebbe essere un indice di tutto il contenuto che abbiamo trovato a partire dalla pagina seme
レッスン2の終わりで使用した Webをクロールするためのコードを思い出しましょう
2つの変数を使用しました tocrawlにシードだけを 含んでいるリストを設定しました
クロールするページを追跡するために tocrawlを使用します
crawledに空のリストを設定しました crawledを使用して見つけたページを追跡します
その後クロールするページが残っている場合に限り ループを継続します
リストtocrawlから最後のページを取り出します
まだクロールしていなければ そのページで見つける全リンクをtocrawlに統合します
そしてそのページを すでにクロールしてあるページのリストに追加します
ではすべてのURLを見つけるだけでなく 変更をする方法を見ていきましょう
インデックスを作成するためです
ページの実際のコンテンツを見ます それをインデックスに追加します
まず1つ目の変更としてindexを更新します returnの結果を変更します
最後に返す必要のあるcrawledは返しません
クロールしたすべてのURLを追跡する必要があるなら crawledを返すことができます
しかし簡単にするために indexをただ返すだけにします
これがクエリの検索に応えるために 本当に必要なことです
これで1つの変更が完了しました これは重要な変更の1つです
クロールして見つけた単語をすべて反映するために indexの更新方法を知る必要があります
その前に1つ変更を加えます
get＿all＿linkと単語をindexに加える方法は そのページによって変わってきます
新しい変数を挿入し その変数にページのコンテンツを保存します
get＿pageを2度呼び出す必要がなくなります get＿pageはとてもコストが高いものです
ページのコンテンツを取得するために Webリクエストが必要になります
新しい変数にそれを保存した方が このコードを単純化できとても理にかなっています
これでcontentを渡すだけになりました
まだ文が1つ足りません
Webクローラを完成させるために必要な文を 皆さんが解明できるか確かめる問題を出します
終了した時インデックスとして返す crawl＿webの結果は
シードから開始して見つけたコンテンツのすべての インデックスである必要があります
先来回忆一下第二单位结尾学到的网络搜索代码
我们用了两个变量 用“tocrawl”初始化只包含种子的链表
再用“tocrawl”来跟踪需要搜索的页面
我们将“crawled”初始化为空链表 并用“crawled”来跟踪已找到的网页
这样 只要仍有页面需要搜索 就可持续循环
我们可弹出“tocrawl”链表的最后一页
如尚未搜索 则将该页面找到的所有链接统一放入“tocrawl”中
之后 再将页面添加进搜索完毕的网页链表
现在我们要了解 如何进行改变
我们不仅是查找所有URL 还要构建我们自己的索引
我们浏览页面的实际内容 并添加进索引
因此 第一个变动就是更新索引 并改变返回结果
所以最后 我们不是返回“crawled” 而是回到索引
如希望对所有搜索过URL进行跟踪 则仍可返回“crawled” 并在最后返回“crawled”和“index”两个结果
但为了简单起见 这里仅仅返回index 即索引
要对搜索查询作出响应 这是切实需要的
现在要作另一个很重要的变动
我们要设法更新索引 来映射在搜索过的页面上找到的所有词
这之前 我要先作个改动
因为“getalllinks”和我们将词添加进索引的工作都依赖网页
所以 要引入一个新变量 并将网页内容存储在于该变量
这样就不用两次调用“get_page”了 这个程序其实挺贵的
获得网页内容需要一个网络指令
将之存储在新变量中更加合理 并可简化代码工作
现在 我们只需传入内容
这里缺少一个语句
我希望大家能够找出这个语句 来完成网络搜索
完成后 “crawl-web”的结果 即返回的“index”
应当就是从种子页面找到的所有内容的索引
讓我們回憶一下第二單位末尾的 crawl-web 程式碼
我們用了兩個變數，我們將 tocrawl 初始化為 只包含種子頁面的列表
使用 tocrawl 來追蹤需要爬行的頁面
我們將 crawled 初始化為空列表， 並且使用 crawled 來追蹤已找到的網頁
我們有個 loop ，只要有頁面需要爬行，就會繼續下去
我們會將 tocrawl 列表的最後一頁 pop 出來
如果它還未被爬行過，我們把所有在該頁面找到的 links， 與 tocrawl 做聯集
之後，再將頁面加到 crawled 列表
現在我們要了解如何進行改變，不僅是找到所有 urls
還要建立我們自己的索引 (index)
我們瀏覽頁面的實際內容，將它加入我們的 index
因此第一個改變，就是更新 index 並改變傳回的結果
我們傳回的不是 crawled，而是 index
如果要對所有爬行過的 url 進行追蹤， 仍得傳回 crawled，傳回 crawled 和 index
但為了簡單起見，這裡僅傳回 index
這是我們真正想對搜尋查詢 (search queries) 所做的回應
現在要作另一個改變，一個很重要的改變
我們要設法更新 index ， 以反映爬行過的頁面裡找到的所有字組 (words)
這之前我要先作個改變
既然 get-all-links 和我們將字組加入 index 的工作 都是根據網頁的內容
我們要引入一個新變數，將網頁內容儲存在變數裡
這樣就不用呼叫 get-page 兩次，呼叫這個程序並不划算
要取得網頁內容，需要做網路請求 (web request)
將它儲存在新變數中更加合理，並且可以簡化程式碼
現在我們只需傳入 content
這裡缺少一個陳述
我把這個問題留給大家， 看看你是否能想出這個陳述，來完成網頁蜘蛛
完成後，crawl-web 的結果，傳回的 index
是從種子頁面開始尋找，所有內容的索引 (index)