Python网络蜘蛛和寻找正确链接的问题

时间:2013-08-14 07:03:49

标签: python web-crawler

所以我制作了一个网络蜘蛛,扫描给定网站上的所有链接,我已经为他配置了两个条件。

代码:

import urllib
import re
import mechanize
from bs4 import BeautifulSoup
import urlparse
import cookielib
from urlparse import urlsplit
from publicsuffix import PublicSuffixList

url = "http://www.physiotherme.com"

br = mechanize.Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
br.set_handle_robots(False)
br.set_handle_equiv(False)
br.set_handle_redirect(True)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
page = br.open(url, timeout=10)

htmlcontent = page.read()
soup = BeautifulSoup(htmlcontent)

urls = set()
contact_keys = ["impressum", "kontakt"]
found_contact_urls = {}

for link in br.links(text_regex=re.compile('^((?!IMG).)*$')):
    new_url = urlparse.urljoin(link.base_url, link.url)
    urls.add(new_url)
    for key in contact_keys:
        if key in new_url:
            found_contact_urls[key] = new_url
            break
for key in contact_keys:
    if key in found_contact_urls:
        print found_contact_urls[key]
        break
    else:
        print url
        break

想法是蜘蛛检查集合中的链接,如果他发现其中有'impressum'的链接,则将其打印出来,如果没有,则打印出其中带有'kontakt'的链接。< / p>

如果找不到这两个链接,那么他会打印出主站点的地址。

我正在查看的以下网站(http://www.physiotherme.com)与'impressum'没有关联,但与'kontakt'字词有链接。

但是我的蜘蛛没有打印出该链接http://www.physiotherme.com/kontakt.html,他从主网站http://www.physiotherme.com打印出一个,即使是'kontakt'的链接也在我的网址集中。如果我把print urls放在最后,我在集合中看到了想要的链接:

set(['http://www.physiotherme.com/sauna.html', 'http://www.physiotherme.com/kontakt.html', 'http://www.physiotherme.com/offen.html'])

所以我不知道我的代码有什么问题。为什么他不打印http://www.physiotherme.com/kontakt.html

编辑:

刚刚注意到,如果我删除

else:
    print url
    break

打印出与kontakt的链接。但这不是我的解决方案,因为在其他一些不同网站的情况下,如果找不到contact_keys中的那两个,我想打印主网址。

1 个答案:

答案 0 :(得分:0)

您的代码逻辑与您的描述不一致。代码的最后一部分应该是:

for link in br.links(text_regex=re.compile('^((?!IMG).)*$')):
    new_url = urlparse.urljoin(link.base_url, link.url)
    ......

key_found_flag = False
for key in contact_keys:
    if key in found_contact_urls.keys():   
        print found_contact_urls[key]
        key_found_flag = True
        break
if not key_found_flag:
    print url