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

递归地抓取网站及其外部链接,为数据分析项目n Python创建图形,python,beautifulsoup,scrapy,web-crawler,scrapy-spider,Python,Beautifulsoup,Scrapy,Web Crawler,Scrapy Spider,我有一个项目,我正试图为数据分析实验做准备。我心里有一条管道,但我不知道如何继续获取我需要的数据。 我想抓取一个网站,找到所有的内部和外部链接,将它们分开,递归抓取外部链接,直到它达到一定的深度。我想这样做是为了为一个网站创建一个所有连接的图表,然后使用中心性算法找到中心节点并从那里开始。 理想情况下,我希望在这个项目中使用Python2。 我看了一眼刮擦的、漂亮的汤和其他图书馆,但都很混乱 特别是在抓取和创建图表方面,任何帮助和/或建议都将不胜感激 多谢各位 编辑: 我正在尝试实现您建议的解决

我有一个项目,我正试图为数据分析实验做准备。我心里有一条管道,但我不知道如何继续获取我需要的数据。 我想抓取一个网站,找到所有的内部和外部链接,将它们分开,递归抓取外部链接,直到它达到一定的深度。我想这样做是为了为一个网站创建一个所有连接的图表,然后使用中心性算法找到中心节点并从那里开始。 理想情况下,我希望在这个项目中使用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()

刮痧应该适合这个。大多数人使用它从网站中提取数据(抓取),但它也可以用于简单的抓取

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

正如您描述的用例一样,我建议您使用两种不同的scrapy Spider:

  • 一个用于现场抓取,仅此域具有
    允许的\u域
    设置,以及非常高或甚至为0(=无限)的
    最大\u深度
    设置,因此它将爬网整个域
  • 一个用于非现场刮取,具有空的
    允许的\u域
    (将允许所有域)和较低的
    最大\u深度
    设置,以便在一定数量的跃点后停止
parse
方法的角度来看,scrapy有一个
Request
Item
的概念。您可以从解析响应的方法返回
请求

  • 请求将触发scrapy访问一个网站,然后根据结果调用您的
    parse
    方法
  • 项目允许您指定为项目定义的结果
因此,无论何时,只要您想要跟随链接,您都会从您的解析方法中
产生
请求。对于项目的所有结果,您将生成

在你的情况下,我想说你的
项目
是这样的:

class LinkItem(scrapy.Item):
    link_source = scrapy.Field()
    link_target = scrapy.Field()
这将允许您返回项目
link\u source=”http://example.com/“,链接\目标=”http://example.com/subsite“
如果您在
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
方法中手动执行此操作,scrapy随
中间件一起提供。其中一个中间件名为
OffsiteMiddleware
,它将检查您的爬行器是否允许访问特定域(使用
allowed\u domains
选项,检查scrapy教程)。另一个是
DepthMiddleware
(也可以查看教程)

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

我目前认为,除了scrapy之外,不需要其他库和项目来收集数据


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

非常感谢!我将建立一个完整的关于scrapy的项目,并尝试实现你所说的。我真的很感谢你的帮助:)顺便说一句,我投了赞成票,但没有足够的声誉来表现:)