我正在尝试使用beautifulsoup和urllib构建网络抓取工具。爬网程序正在运行,但它不会打开站点中的所有页面。它打开第一个链接并转到该链接,打开该页面的第一个链接,依此类推。 这是我的代码:
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.parse import urljoin
import json, sys
sys.setrecursionlimit(10000)
url = input('enter url ')
d = {}
d_2 = {}
l = []
url_base = url
count = 0
def f(url):
global count
global url_base
if count <= 100:
print("count: " + str(count))
print('now looking into: '+url+'\n')
count += 1
l.append(url)
html = urlopen(url).read()
soup = BeautifulSoup(html, "html.parser")
d[count] = soup
tags = soup('a')
for tag in tags:
meow = tag.get('href',None)
if (urljoin(url, meow) in l):
print("Skipping this one: " + urljoin(url,meow))
elif "mailto" in urljoin(url,meow):
print("Skipping this one with a mailer")
elif meow == None:
print("skipping 'None'")
elif meow.startswith('http') == False:
f(urljoin(url, meow))
else:
f(meow)
else:
return
f(url)
print('\n\n\n\n\n')
print('Scrapping Completed')
print('\n\n\n\n\n')
答案 0 :(得分:0)
如果count
达到100,则不会再打开其他链接。因此,我认为你应该在离开for循环后将count
减少一个。如果这样做,count
将类似于当前链接深度(100将是最大链接深度)。
如果变量count
应该引用已打开链接的数量,那么您可能希望以另一种方式控制链接深度。
答案 1 :(得分:0)
您看到此行为的原因是代码递归调用您的函数时。一旦代码找到有效链接,就会再次调用函数f
,防止for循环的其余部分一直运行,直到它返回。
你所做的是深度优先搜索,但互联网非常深。你想要先进行广度搜索。
修改代码的最简单方法可能就是拥有一个全球的链接列表。让for循环将所有被抓取的链接附加到此列表的末尾,然后在for循环之外,删除列表的第一个元素并按照该链接。
您可能需要稍微更改逻辑以获取最大数量。