Python mechanize可以迭代一个网站的所有网页

Python mechanize可以迭代一个网站的所有网页,python,mechanize,Python,Mechanize,我想迭代一个网站的所有网页。我在这里尝试使用mechanize,但它只查看网站的主要链接。我应该如何修改它 import mechanize import lxml.html br = mechanize.Browser() response = br.open("http://www.apple.com") for link in br.links(): print link.url br.follow_link(link) # takes EITHER Link ins

我想迭代一个网站的所有网页。我在这里尝试使用mechanize,但它只查看网站的主要链接。我应该如何修改它

import mechanize
import lxml.html

br = mechanize.Browser()
response = br.open("http://www.apple.com")

for link in br.links():
    print link.url
    br.follow_link(link)  # takes EITHER Link instance OR keyword args
    print br
    br.back()
这是新代码:

import mechanize
import lxml.html

links  = set()                             
visited_links  = set()


def visit(br, url):
  response = br.open(url)
  links = br.links()
  for link in links:
    if not link.url in links:
      visited_links.add(link.url)  
      visit(br, link)
      print link.url


if __name__ == '__main__':
  br = mechanize.Browser()
  visit(br,"http://www.apple.com")

请注意,您希望对每个链接执行的操作与对初始链接执行的操作相同:获取页面并访问每个链接。你可以像这样递归地解决这个问题

def visit(br, url):
  response = br.open(url)
  links = br.links()
  for link in links:
    print link.url
    visit(br, link)
在实践中会变得更加复杂:

  • 您需要检测循环,即如果a.html链接到b.html,b.html链接到a.html,您就不想一直打乒乓球和来回。因此,您可能需要某种方法来判断您是否已经访问了某个页面。因为您可能会找到很多页面,所以应该有一种有效的方法来测试您是否已经访问了某个页面。一种简单的方法可能是使用一个带有可见链接的全局Python

  • 您需要决定两个链接何时相等,例如,应该
    http://www.apple.com/index.html
    和'`是否相等?您可能需要对链接进行某种“规范化”

  • 您的程序可能需要很长时间,而且它肯定是“I/O绑定”的,即您的程序将坐在那里等待某个页面下载。您可以通过考虑并行访问多个页面来加快速度—但是它们需要使用一组共享的
    可见页面,这样两个作业就不会访问同一页面


  • 你为什么使用机械化?如果你想用Y来做X,只需要问一下如何做X。因为Y可能不是最好的解决方案。我想我会使用beautifulsoup,但我发现mechanize比beautifulsoup快。我也考虑过创建一个爬行器,但不知道如何使用mechanize(或类似的东西)可能是聪明的,而不是编写自己的爬行器。为了更好地解释原因,请参见我根据您的建议添加了一个新代码。它抛出一些错误,如:TypeError:预期的字符串或缓冲区