递归地抓取网站及其外部链接,为数据分析项目n Python创建图形
我有一个项目,我正试图为数据分析实验做准备。我心里有一条管道,但我不知道如何继续获取我需要的数据。 我想抓取一个网站,找到所有的内部和外部链接,将它们分开,递归抓取外部链接,直到它达到一定的深度。我想这样做是为了为一个网站创建一个所有连接的图表,然后使用中心性算法找到中心节点并从那里开始。 理想情况下,我希望在这个项目中使用Python2。 我看了一眼刮擦的、漂亮的汤和其他图书馆,但都很混乱 特别是在抓取和创建图表方面,任何帮助和/或建议都将不胜感激 多谢各位 编辑: 我正在尝试实现您建议的解决方案,通过下面的代码,我可以在调试信息中看到,它正在查找链接,但不是它们没有保存在LinkList类中,就是我提取了错误的链接,它们正在被过滤 有什么建议吗递归地抓取网站及其外部链接,为数据分析项目n Python创建图形,python,beautifulsoup,scrapy,web-crawler,scrapy-spider,Python,Beautifulsoup,Scrapy,Web Crawler,Scrapy Spider,我有一个项目,我正试图为数据分析实验做准备。我心里有一条管道,但我不知道如何继续获取我需要的数据。 我想抓取一个网站,找到所有的内部和外部链接,将它们分开,递归抓取外部链接,直到它达到一定的深度。我想这样做是为了为一个网站创建一个所有连接的图表,然后使用中心性算法找到中心节点并从那里开始。 理想情况下,我希望在这个项目中使用Python2。 我看了一眼刮擦的、漂亮的汤和其他图书馆,但都很混乱 特别是在抓取和创建图表方面,任何帮助和/或建议都将不胜感激 多谢各位 编辑: 我正在尝试实现您建议的解决
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:
- 一个用于现场抓取,仅此域具有
设置,以及非常高或甚至为0(=无限)的允许的\u域
设置,因此它将爬网整个域最大\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的项目,并尝试实现你所说的。我真的很感谢你的帮助:)顺便说一句,我投了赞成票,但没有足够的声誉来表现:)