【问题标题】:How can scrapy be used to extract the link graph of a website?scrapy如何用于提取网站的链接图?
【发布时间】:2012-10-09 14:18:36
【问题描述】:

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

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

【问题讨论】:

    标签: web-crawler scrapy


    【解决方案1】:

    我不知道有什么工具或贡献可以精确地产生你想要的东西。你必须为此建立一个scrapy spider。我可以在这里解释必要的步骤:

    • 创建一个scrapy项目并生成一个默认的spider

      $ 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")
    

    【讨论】:

    • 我是scrapy的新手,我已经按照你上面发布的sitegraph答案,我有一些疑问:- 1)我有网址列表,想为列表中的所有网址,我们该怎么做? 2)我想利用相应页面的爬网内容 3)我想将站点图及其内容存储在 hdfs 中,我们如何实现? 我对这些主题完全陌生,请帮助我出来。
    猜你喜欢
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多