我正在做一个项目,需要从一个网站提取所有链接,使用此代码,我会得到所有的链接从一个URL:
import requests
from bs4 import BeautifulSoup, SoupStrainer
source_code = requests.get('https://stackoverflow.com/')
soup = BeautifulSoup(source_code.content, 'lxml')
links = []
for link in soup.find_all('a'):
links.append(str(link))
问题是,如果我想提取所有URL,我必须编写另一个for循环,然后再写一个....我想提取所有的网址是存在于这个网站,并在这个网站的子域.有没有什么方法可以做到这一点,而不写嵌套的?即使编写了嵌套的for,我也不知道应该使用多少个for来获取所有URL。
4条答案
按热度按时间ruarlubt1#
哇,它需要大约30分钟找到一个解决方案,我发现了一个简单而有效的方法来做到这一点,正如@α-α м яιcαη提到的,一些时间,如果你的网站链接到一个大的网站,如谷歌,等,它不会停止,直到你的内存得到充分的数据.所以有些步骤你应该考虑。
1.做一个while循环来搜索你的网站来提取所有的url
1.使用异常处理来防止崩溃
1.删除重复项并分隔url
1.设置一个url的数量限制,比如当找到1000个url时
1.停止while循环,以防止您的电脑的内存变满
这里有一个示例代码,它应该工作正常,我实际上测试了它,这对我来说很有趣:
输出将是:
我设置的限制为162,你可以增加它,因为许多你想和你公羊允许。
vsmadaxz2#
这个怎么样?
你也可以使用这个爬行框架,它可以帮助你做很多事情
0tdrvxhp3#
我为我的任务实现了这个,它能够从所有页面和页面中提取所有URL。这是一个递归函数。
让我解释一下它是如何工作的:
1.它将进入第一页:stackoverflow.com和链接将附加在链接列表中。
1.主页面中的任何链接都将作为URL参数传递给函数。这样,它将获取所有页面中的所有URL/链接,并将其添加到链接列表中。这有助于避免任何重复的链接。
1.如果没有可获取的链接,它将返回到主页并获取第二个链接,并将递归地在链接内的所有页面中移动。
1.最后,当没有更多的链接要解析时,所有的链接将被存储在一个 Dataframe 中。
u2nhd7ah4#
好吧,实际上你所要求的是可能的,但这意味着一个无限循环,它会一直运行,直到你的内存
BoOoOoOm
无论如何,这个想法应该像下面这样。
for item in soup.findAll('a')
和then item.get('href')
set
以摆脱重复的url,并与if
条件is not None
一起使用以摆脱None
对象。set
变成0
类似于len(urls)