Python机械化迭代网站的所有网页

时间:2013-12-19 17:28:25

标签: 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 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")

1 个答案:

答案 0 :(得分:1)

请注意,您希望为每个链接执行的操作与初始链接的操作相同:获取页面并访问每个链接。你可以像

那样递归地解决这个问题
def visit(br, url):
  response = br.open(url)
  links = br.links()
  for link in links:
    print link.url
    visit(br, link)

实践中会有点复杂:

  1. 您需要检测周期,例如,如果a.html链接到b.html,b.html链接到a.html,您不想打乒乓球并且一直来回走动。所以你可能需要一些方法来判断你是否已经访问了一个页面。由于您可能会找到很多页面,因此您应该有一种有效的方法来测试您是否已经访问过页面。一种直截了当的方式可能是使用看到的链接创建一个全局Python set

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

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