fromurllib.parseimporturljoin,urlparseimportrequestsfrombs4importBeautifulSoupfromloguruimportloggerimportgraphinateDEFAULT_MAX_DEPTH=0defpage_links_graph_model(max_depth:int=DEFAULT_MAX_DEPTH):""" Create a graph model based on page links. Args: max_depth (int, optional): The maximum depth to crawl for page links. Defaults to DEFAULT_MAX_DEPTH. Returns: GraphModel: A graph model representing the page links. """def_links(url:str,depth=0,**kwargs):reqs=requests.get(url)logger.debug('Analyzing Page: {url}')soup=BeautifulSoup(reqs.text,'lxml')logger.debug('Done Analyzing Page: {url}')forlinkinsoup.find_all('a',href=True):child_url=link.get('href')ifchild_url.startswith('javascript:'):continueelifchild_url.startswith('//'):child_url=f"https:{child_url}"elifnotbool(urlparse(child_url).netloc):child_url=urljoin(url,child_url)elifnotchild_url.startswith('http'):continueyield{'source':url,'target':child_url}ifdepth<max_depth:yield from_links(child_url,depth=depth+1,**kwargs)graph_model=graphinate.model(name='Web')@graph_model.edge()deflink(url,**kwargs):yield from_links(url,**kwargs)returngraph_modelif__name__=='__main__':model=page_links_graph_model(1)params={# 'url': 'https://github.com/erivlis/graphinate''url':'https://erivlis.github.io/graphinate/'}graphinate.materialize(model=model,graph_type=graphinate.GraphType.DiGraph,default_node_attributes={'type':'url'},builder=graphinate.builders.NetworkxBuilder,builder_output_handler=graphinate.materializers.matplotlib.plot,**params)