Web爬网程序无法打开页面中的所有链接

时间:2016-11-02 20:23:28

标签: python beautifulsoup web-crawler urllib

我正在尝试使用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')

2 个答案:

答案 0 :(得分:0)

如果count达到100,则不会再打开其他链接。因此,我认为你应该在离开for循环后将count减少一个。如果这样做,count将类似于当前链接深度(100将是最大链接深度)。

如果变量count应该引用已打开链接的数量,那么您可能希望以另一种方式控制链接深度。

答案 1 :(得分:0)

您看到此行为的原因是代码递归调用您的函数时。一旦代码找到有效链接,就会再次调用函数f,防止for循环的其余部分一直运行,直到它返回。

你所做的是深度优先搜索,但互联网非常深。你想要先进行广度搜索。

修改代码的最简单方法可能就是拥有一个全球的链接列表。让for循环将所有被抓取的链接附加到此列表的末尾,然后在for循环之外,删除列表的第一个元素并按照该链接。

您可能需要稍微更改逻辑以获取最大数量。