gpt4 book ai didi

web-crawler - 如何使用scrapy提取网站的链接图?

转载 作者:行者123 更新时间:2023-12-04 10:04:53 25 4
gpt4 key购买 nike

给定一个起始 URL start (以及关于可允许域等的一些规则)我想生成一个有向图(V,E),其中 V 中的节点是否可以从 start 访问页面,并且有一条弧线 (u,v)E每当页面上有超链接时 u指向页面 v .

是否有一种简单的方法可以使用 scrapy 获得这样的图? ?如果另一个开源工具可以更轻松/更好地实现目标,我也很乐意使用它。

最佳答案

我不知道任何工具或贡献可以准确地产生你想要的东西。为此,您必须构建一个爬虫蜘蛛。我可以在这里解释必要的步骤:

  • 创建scrapy项目并生成默认蜘蛛
    $ scrapy startproject sitegraph
    $ cd sitegraph
    $ scrapy genspider graphspider mydomain.com
  • 这将创建一个包含 items.py 文件的目录。在此文件中添加以下几行
    from scrapy.item import Item, Field

    class SitegraphItem(Item):
    url=Field()
    linkedurls=Field()
  • 在spiders目录中你会发现graphspider.py替换为(当然mydomain.com需要替换):
    from scrapy.selector import HtmlXPathSelector
    from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
    from scrapy.contrib.spiders import CrawlSpider, Rule
    from scrapy.utils.url import urljoin_rfc
    from sitegraph.items import SitegraphItem

    class GraphspiderSpider(CrawlSpider):
    name = 'graphspider'
    allowed_domains = ['mydomain.com']
    start_urls = ['http://mydomain/index.html']

    rules = (
    Rule(SgmlLinkExtractor(allow=r'/'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
    hxs = HtmlXPathSelector(response)
    i = SitegraphItem()
    i['url'] = response.url
    i['http_status'] = response.status
    llinks=[]
    for anchor in hxs.select('//a[@href]'):
    href=anchor.select('@href').extract()[0]
    if not href.lower().startswith("javascript"):
    llinks.append(urljoin_rfc(response.url,href))
    i['linkedurls'] = llinks
    return i
  • 然后编辑 settings.py 文件并添加(相应地更改文件名):
    FEED_FORMAT="jsonlines"
    FEED_URI="file:///tmp/sitegraph.json"
  • 现在你可以运行:
    $ scrapy crawl graphspider
  • 这将生成一个 json 文件,您可以使用它来构建图形。

  • 您可以使用像 networkx 这样的包来分析它 或 pygraphviz 来绘制它(不推荐用于大型站点)
    import json
    import pygraphviz as pg

    def loadgraph(fname):
    G=pg.AGraph(directed=True)
    for line in open(fname):
    j=json.loads(line)
    url=j["url"]
    G.add_node(url)
    for linked_url in j["linkedurls"]:
    G.add_edge(url,linked_url)
    return G

    if __name__=='__main__':
    G=loadgraph("/tmp/sitegraph.json")
    G.layout(prog='dot')
    G.draw("sitegraph.png")

    关于web-crawler - 如何使用scrapy提取网站的链接图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12802114/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com