【问题标题】:Python mechanize to iterate over all webpages of a websitePython 机械化迭代网站的所有网页
【发布时间】:2013-12-19 17:28:24
【问题描述】:

我想遍历网站的所有网页。我在这里尝试使用机械化,但它只查看网站的主要链接。应该怎么修改?

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")

【问题讨论】:

  • 为什么要使用机械化?如果你想用 Y 做 X,就问怎么做 X。因为 Y 可能不是最好的解决方案。
  • 我以为我会使用 beautifulsoup,但我发现 mechanize 比 beautifulsoup 快。我也考虑过创建一个蜘蛛,但不知道如何去做
  • 使用 mechanize(或类似的东西)可能是聪明的,而不是编写自己的爬虫。有关原因的详细解释,请参阅swizec.com/blog/scraping-with-mechanize-and-beautifulsoup/…

标签: python mechanize


【解决方案1】:

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

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

在实践中会变得有点复杂:

    1234563所以你可能需要一些方法来判断你是否已经访问过一个页面。由于您可能会找到很多页面,因此您应该有一种有效的方法来测试您是否已经访问过某个页面。一种直接的方法可能是使用带有可见链接的全局 Python set
  1. 您需要确定两个链接何时相等,例如http://www.apple.com/index.html 和 'http://www.apple.com/index.html#someAnchor` 是否应该相等?您可能需要对链接进行某种“规范化”。

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

【讨论】:

  • 我根据您的建议添加了新代码。它会抛出一些错误,例如:TypeError: expected string or buffer
猜你喜欢
  • 2011-05-12
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
相关资源
最近更新 更多