Используйте python для сканирования сайта - PullRequest
0 голосов
/ 21 июля 2011

Поэтому я ищу динамичный способ сканирования веб-сайта и получения ссылок с каждой страницы.Я решил поэкспериментировать с Beauitfulsoup.Два вопроса: как мне сделать это более динамически, чем при использовании вложенных операторов while для поиска ссылок.Я хочу получить все ссылки с этого сайта.Но я не хочу продолжать помещать вложенные циклы while.

    topLevelLinks = self.getAllUniqueLinks(baseUrl)
    listOfLinks = list(topLevelLinks)       

    length = len(listOfLinks)
    count = 0       

    while(count < length):

        twoLevelLinks = self.getAllUniqueLinks(listOfLinks[count])
        twoListOfLinks = list(twoLevelLinks)
        twoCount = 0
        twoLength = len(twoListOfLinks)

        for twoLinks in twoListOfLinks:
            listOfLinks.append(twoLinks)

        count = count + 1

        while(twoCount < twoLength):
            threeLevelLinks = self.getAllUniqueLinks(twoListOfLinks[twoCount])  
            threeListOfLinks = list(threeLevelLinks)

            for threeLinks in threeListOfLinks:
                listOfLinks.append(threeLinks)

            twoCount = twoCount +1



    print '--------------------------------------------------------------------------------------'
    #remove all duplicates
    finalList = list(set(listOfLinks))  
    print finalList

В любом случае, у меня есть второй вопрос, чтобы сказать, получил ли я все ссылки с сайта.Пожалуйста, прости меня, я немного новичок в Python (год или около того), и я знаю, что некоторые из моих процессов и логики могут быть детскими.Но я должен как-то учиться.В основном я просто хочу сделать это более динамичным, чем использование вложенного цикла while.Заранее благодарим за понимание.

Ответы [ 5 ]

4 голосов
/ 21 июля 2011

Проблема паутинга по веб-сайту и получения всех ссылок является распространенной проблемой. Если вы ищете в Google «python web site site», вы можете найти библиотеки, которые сделают это за вас. Вот тот, который я нашел:

http://pypi.python.org/pypi/spider.py/0.5

Еще лучше, Google нашел этот вопрос уже заданным и ответил здесь на StackOverflow:

Кто-нибудь знает хороший веб-сканер на Python, который я мог бы использовать?

2 голосов
/ 21 сентября 2011

Если вы используете BeautifulSoup, почему бы вам не использовать метод findAll () ??По сути, в моем сканере я делаю:

self.soup = BeautifulSoup(HTMLcode)
for frm in self.soup.findAll(str('frame')):
try:
    if not frm.has_key('src'):
        continue
    src = frm[str('src')]
    #rest of URL processing here
except Exception, e:
    print  'Parser <frame> tag error: ', str(e)

для тега фрейма.То же самое касается тегов "img src" и "a href".Хотя мне нравится эта тема - возможно, это я, у которой здесь что-то не так ... редактировать: есть экземпляр верхнего уровня, который сохраняет URL-адреса и получает HTML-код от каждой ссылки позже ...

0 голосов
/ 21 июля 2011

Использование scrapy :

Scrapy - это быстрый высокоуровневый просмотр экрана и сканирование в Интернете каркас, используемый для сканирования веб-сайтов и извлечения структурированных данных из их страницы. Он может использоваться для самых разных целей, от данных от добычи до мониторинга и автоматического тестирования.

0 голосов
/ 21 июля 2011

1) В Python мы не учитываем элементы контейнера и используем их для индексации; мы просто перебираем его элементы, потому что это то, что мы хотим сделать.

2) Для обработки нескольких уровней ссылок мы можем использовать рекурсию.

def followAllLinks(self, from_where):
    for link in list(self.getAllUniqueLinks(from_where)):
        self.followAllLinks(link)

Это не обрабатывает циклы ссылок, но и оригинальный подход. Вы можете справиться с этим, создав set уже посещенных ссылок по ходу работы.

0 голосов
/ 21 июля 2011

Чтобы ответить на ваш вопрос из комментария, вот пример (он написан на ruby, но я не знаю python, и они достаточно похожи, чтобы вы могли легко следить за ним):

#!/usr/bin/env ruby

require 'open-uri'

hyperlinks = []
visited = []

# add all the hyperlinks from a url to the array of urls
def get_hyperlinks url
  links = []
  begin
    s = open(url).read
    s.scan(/(href|src)\w*=\w*[\",\']\S+[\",\']/) do
      link = $&.gsub(/((href|src)\w*=\w*[\",\']|[\",\'])/, '')
      link = url + link if link[0] == '/'

      # add to array if not already there
      links << link if not links =~ /url/
    end
  rescue
    puts 'Looks like we can\'t be here...'
  end
  links
end

print 'Enter a start URL: '
hyperlinks << gets.chomp
puts 'Off we go!'
count = 0
while true
  break if hyperlinks.length == 0
  link = hyperlinks.shift
  next if visited.include? link
  visited << link
  puts "Connecting to #{link}..."
  links = get_hyperlinks(link)
  puts "Found #{links.length} links on #{link}..."
  hyperlinks = links + hyperlinks
  puts "Moving on with #{hyperlinks.length} links left...\n\n"
end

извините за рубин, но это лучший язык: P и его не должно быть сложно адаптировать или, как я уже сказал, понять.

...