递归地抓取网站及其外部链接,为数据分析项目n Python创建一个图形

2024-09-30 22:25:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个项目,我正试图把它放在一起做一个数据分析实验。我心里有一条管道,但我不知道如何继续获取我需要的数据。 我想抓取一个网站,找到所有的内部和外部链接,分开他们,并爬行外部链接递归,直到它达到一定的深度。我想这样做来创建一个网站的所有连接图,然后使用中心性算法来找到中心节点并从那里继续。 理想情况下,我希望在这个项目中使用Python2。 我看了一眼,漂亮的汤和其他图书馆,但都是相当混乱。在

任何帮助和/或建议将是非常感谢爬行和创建图形特别是

谢谢你

编辑:

我正在尝试实现您建议的解决方案,并且使用下面的代码,我可以在调试信息中看到,它正在查找链接,但要么它们没有保存在LinkList类中,要么我提取错误,它们正在被过滤。在

有什么建议吗?在

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()

Tags: 项目nameurl网站mainlinksitem中心
1条回答
网友
1楼 · 发布于 2024-09-30 22:25:02

斯皮奇应该可以用这个。大多数人使用它从网站中提取数据(抓取),但它也可以用于简单的爬行。在

在scrapy中,你有蜘蛛,它们会抓取网站并跟踪链接。一个垃圾项目可以由许多spider组成,但是在标准设置中,每个spider都有自己的队列并执行自己的任务。在

正如您描述的用例一样,我推荐两种不同的scrapy spider:

  • 一个用于现场抓取,仅对该域使用allowed_domains设置和非常高甚至是0(=无限)MAX_DEPTH设置,以便它将爬网整个域
  • 一个用于使用空的allowed_domains(将允许所有域)和一个低的MAX_DEPTH设置的异地抓取,以便在经过一定数量的跳跃后停止

从您的parse方法的角度来看,scray有一个Request和{}的概念。您可以从解析响应的方法返回Request和{}:

  • 请求将触发scrapy访问一个网站,并在结果上调用您的parse方法
  • 项允许您指定为项目定义的结果

因此,无论何时你想跟踪一个链接,你将从你的解析方法中yield一个Request。对于项目的所有结果,您将得到Item。在

在你的例子中,我认为你的Item是这样的:

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

这将允许您返回项目link_source="http://example.com/", link_target="http://example.com/subsite",如果您在http://example.com/页面上找到了/subsite的链接:

^{pr2}$

您可能会看到我没有做任何深度检查等等,您不必在您的parse方法中手动执行此操作,Middleware附带了crapy ships。其中一个中间件名为OffsiteMiddleware,它将检查你的蜘蛛是否被允许访问特定的域(使用选项allowed_domains,查看垃圾教程)。另一个是DepthMiddleware(也可以查看教程)。在

这些结果可以写在任何你想写的地方。Scrapy附带了一个名为feed exports的东西,它允许您将数据写入文件。如果您需要更高级的东西,例如数据库,可以查看scrapy的Pipeline。在

我目前不认为需要其他库和项目,除了为您的数据收集废料。在

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

相关问题 更多 >