human
I am working on the file "SearchEngine.ipynb".
The first task is:
a ) Der Crawler
Der Crawler wurde mit der Bibliothek Scrapy umgesetzt. Es wurde sich hier gegen eine Einrichtung eines Projektes und für eine Scriptbasierte Lösung entschieden.
Um die Ausführung über das Notebook zu regeln, wurde über das MagicFlag %%writefile die Klasse in eine Datei geschrieben und der Aufruf über von Scrapy über subprocess umgesetzt.
Die Klasse HtwSpider implementiert über die Einstiegspunkte, die Extraktionsanweisungen sowie dem gewünschten Link-Verhalten den Crawler.
Dabei werden der Titel, der Text und die ausgehenden Links aller Seiten gespeichert, die von den EInstiegspunkten aus eirreichbar sind.
Can you write Python program for it?

=====
Write me a the Python program you requested?
assistant
#Here is the Python program you requested.

%%writefile ./my_spider.py
# %%writefile ./my_spider.py
# %load ./my_spider.py

import scrapy
import json

class HtwSpider(scrapy.Spider):
    name = 'htw_spider'
    
    start_urls = [
        'http://people.f4.htw-berlin.de/~zhangg/pages/teaching/pages/d01.html',
        'http://people.f4.htw-berlin.de/~zhangg/pages/teaching/pages/d06.html',
        'http://people.f4.htw-berlin.de/~zhangg/pages/teaching/pages/d08.html'
    ]

    def parse(self, response):
         
        # - Extracting the needed attributes.
        title = response.xpath('//title/text()').extract()[0]
        text = ' '.join([t.strip() for t in response.xpath('//body/text()').extract()]).strip()
        hrefs =  [l.split('.')[0] for l in response.xpath('//a/@href').extract()]
                      
        # - Printing the extracted data for logging. 
        print("\n ----DATA\n\n%s\n" % json.dumps({title : {'text': text, 
                        'refs' : hrefs }}))
        
        # - Yielding the extracted dataset as dict
        yield {'title': title,
               'text': text, 
               'refs' : hrefs }
        # - Here we find the actual spider.
        # - This goes through all a_hrefs and scrapes the needed data.
        for next_page in response.xpath('//a/@href').extract():
            if next_page is None:
                continue
            next_page = response.urljoin(next_page)
            yield scrapy.Request(next_page, callback=self.parse)