我有一个项目,我正在尝试将数据分析实验组合在一起。我有一条管道,但我不完全知道如何获取所需的数据。我想爬网站并找到所有内部和外部链接,将它们分开并递归爬网,直到它达到一定深度为止。我想这样做以创建网站所有连接的图表,然后使用中心算法查找中心节点并从那里继续进行。理想情况下,我想将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
方法的角度上讲,有一个Request
和Item
的概念。您可以从解析响应的方法中返回Request
和Item
:
- 请求将触发零食访问网站,然后依次致电您的
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
。
我目前没有对其他图书馆和项目的需求除外,除了进行数据收集以外。
当然,当您想使用数据时,您可能需要专门的数据结构而不是纯文本文件。