如何使用Python和Mechanize从PHP页面获取所有链接

0 投票
3 回答
1876 浏览
提问于 2025-04-17 15:22

我想从一个网页中提取所有的链接。以下是我目前写的代码。

import mechanize
import lxml.html
from time import sleep

links = list()
visited_links = list()

br = mechanize.Browser()

def findLinks(url):
    response = br.open(url)
    visited_links.append(response.geturl())

    for link in br.links():
        response = br.follow_link(link)
        links.append(response.geturl())
        sleep(1)


findLinks("http://temelelektronik.net")

for link in links:
    if link in visited_links:
        links.remove(link)
    else:
        findLinks(link)
        print link

for link in visited_links:
    print link

其实我并不想写一个网络爬虫。我想做的是从网页中提取所有链接,并创建一个网站地图。我还想知道,是否可以使用mechanize和python从服务器获取文件的最后修改时间。

我想问的是,这段代码在处理HTML页面时运行得很好,但在处理php页面时却提取不到链接。比如说这个页面。我该如何从php页面中提取链接呢?

任何帮助都将不胜感激。谢谢!

3 个回答

-1

Mechanize的语法大致是这样的。

首先,我们创建一个新的代理:agent=Mechanize.new

然后,我们用这个代理去获取一个网页:page=agent.get(URL)

接下来,page.links会返回这个网页上所有链接的一个列表。

如果你想要获取第一个链接的文字内容(不包括链接地址),可以用page.links.first.text。

如果你想点击一个特定的链接,比如说文本是“Text”的那个,可以用page.link_with(:text=>"Text").click,这样就会返回点击这个链接后显示的页面。

希望这些信息对你有帮助。

0

这里有另一个解决方案,它使用网络爬虫来访问每一个链接。

import os, sys; sys.path.insert(0, os.path.join("..", ".."))

from pattern.web import Spider, DEPTH, BREADTH, FIFO, LIFO

class SimpleSpider1(Spider):

    def visit(self, link, source=None):
        print "visiting:", link.url, "from:", link.referrer

    def fail(self, link):
        print "failed:", link.url

spider1 = SimpleSpider1(links=["http://www.temelelektronik.net/"], domains=["temelelektronik.net"], delay=0.0)

print "SPIDER 1 " + "-" * 50
while len(spider1.visited) < 5:
    spider1.crawl(cached=False)
1

我不太了解mechanize这个东西,但我用过一个叫做 pattern.web 的模块,它有一个很简单好用的HTML DOM解析器。我觉得这个模块可以用来做网站地图,跟你想要的东西差不多:

from pattern.web import URL, DOM

url = URL("http://temelelektronik.net")
dom = DOM(url.download())
for anchor in dom.by_tag('a'):
    print(anchor.href)

撰写回答