网站及其外部链接递归,为数据分析项目N Python创建图形



我有一个项目,我正在尝试将数据分析实验组合在一起。我有一条管道,但我不完全知道如何获取所需的数据。我想爬网站并找到所有内部和外部链接,将它们分开并递归爬网,直到它达到一定深度为止。我想这样做以创建网站所有连接的图表,然后使用中心算法查找中心节点并从那里继续进行。理想情况下,我想将Python 2用于此项目。我看了纸杯,美丽的汤和其他图书馆,但这都很混乱。

任何帮助和/或建议都将在爬行和创建图表方面特别感谢

谢谢

编辑:

我正在尝试实现您建议的解决方案,并且在下面的代码中,我可以在调试信息中看到它正在找到链接,但它们没有保存在链接列表类中,或者我正在错误地提取它们他们正在过滤。

有什么建议?

class LinkList(Item):
    url = Field()
class WebcrawlerSpider(CrawlSpider):
    name = 'webcrawler'
    allowed_domains = ['https://www.wehiweb.com']
    start_urls = ['https://www.wehiweb.com']
rules = (
    Rule(LxmlLinkExtractor(allow=()), callback='parse_obj', follow=True),
)
def parse_obj(self,response):
    item = LinkList()
    item['url'] = []
    for link in LxmlLinkExtractor(allow=(),deny = self.allowed_domains).extract_links(response):
        item['url'].append(link.url)
        yield item
def main():
    links = LinkList()
    process = CrawlerProcess()
    process.crawl(WebcrawlerSpider)
    process.start()
    print(links.items())
if __name__ == "__main__":
    main()

scrapy应该为此效果很好。大多数人使用它来从网站上提取数据(刮擦),但也可用于简单爬行。

在砂纸中,您的蜘蛛网站爬网并遵循链接。一个废品项目可以由许多蜘蛛组成,但是在标准设置中,每个蜘蛛都会有自己的队列并执行自己的任务。

正如您所描述的用例,我会建议两个单独的砂纸:

  • 一个用于现场用allowed_domains设置的现场刮擦,仅适用于此域,甚至很高,甚至是0(= =无限)MAX_DEPTH设置,以便它将爬网
  • 使用空的allowed_domains(将允许所有域)和较低的MAX_DEPTH设置用于异地刮擦,以便在一定数量的啤酒花之后停止

从您的 parse方法的角度上讲,有一个RequestItem的概念。您可以从解析响应的方法中返回RequestItem

  • 请求将触发零食访问网站,然后依次致电您的parse方法
  • 项目允许您指定您为项目定义的结果

因此,每当您想遵循链接时,您都会从解析方法中 yield Request。对于您项目的所有结果,您将产生Item

在您的情况下,我会说您的Item就是这样:

class LinkItem(scrapy.Item):
    link_source = scrapy.Field()
    link_target = scrapy.Field()

如果您在页面http://example.com/上并找到了/subsite的链接,则可以返回该项目link_source="http://example.com/", link_target="http://example.com/subsite"

def parse(self, response):
    # Here: Code to parse the website (e.g. with scrapy selectors 
    # or beautifulsoup, but I think scrapy selectors should
    # suffice
    # after parsing, you have a list "links"
    for link in links:
        yield Request(link)  # make scrapy continue the crawl
        item = LinkItem()
        item['link_source'] = response.url
        item['link_target'] = link
        yield item  # return the result we want (connections in link graph)

您可能会发现我没有进行任何深度检查等。您不必在parse方法中手动执行此操作,用Middleware进行废纸。其中一个中间件称为OffsiteMiddleware,将检查您的蜘蛛是否可以访问特定域(带有选项allowed_domains,请检查签证教程)。另一个是DepthMiddleware(还检查教程)。

这些结果可以在您想要的任何地方编写。零工带有所谓的feed exports的东西,使您可以将数据写入文件。如果您需要更高级的东西,例如数据库,您可以查看Scrapy的Pipeline

我目前没有对其他图书馆和项目的需求除外,除了进行数据收集以外。

当然,当您想使用数据时,您可能需要专门的数据结构而不是纯文本文件。

最新更新