Я пытаюсь научить себя Python, написав на нем очень простой веб-краулер.
Код для него здесь:
#!/usr/bin/python
import sys, getopt, time, urllib, re
LINK_INDEX = 1
links = [sys.argv[len(sys.argv) - 1]]
visited = []
politeness = 10
maxpages = 20
def print_usage():
print "USAGE:\n./crawl [-politeness <seconds>] [-maxpages <pages>] seed_url"
def parse_args():
#code for parsing arguments (works fine so didnt need to be included here)
def crawl():
global links, visited
url = links.pop()
visited.append(url)
print "\ncurrent url: %s" % url
response = urllib.urlopen(url)
html = response.read()
html = html.lower()
raw_links = re.findall(r'<a href="[\w\.-]+"', html)
print "found: %d" % len(raw_links)
for raw_link in raw_links:
temp = raw_link.split('"')
if temp[LINK_INDEX] not in visited and temp[LINK_INDEX] not in links:
links.append(temp[LINK_INDEX])
print "\nunvisited:"
for link in links:
print link
print "\nvisited:"
for link in visited:
print link
parse_args()
while len(visited) < maxpages and len(links) > 0:
crawl()
time.sleep(politeness)
print "politeness = %d, maxpages = %d" % (politeness, maxpages)
Я создал небольшую тестовую сеть в том же рабочем каталоге примерно из 10 страниц, которые связаны друг с другом по-разному, и, похоже, работает нормально, но когда я сам отправляю ее в реальный Интернет, она не может анализировать ссылки из файлы, которые он получает.
Он может нормально получить html-код, потому что я могу его распечатать, но кажется, что часть re.findall()
не делает то, что должна, потому что список ссылок никогда не заполняется. Возможно, я неправильно написал свое регулярное выражение? Он отлично работал, чтобы найти такие строки, как <a href="test02.html"
, а затем проанализировать ссылку, но по какой-то причине это не работает для реальных веб-страниц. Возможно, это часть http, которая отбрасывает его?
Я никогда раньше не использовал регулярное выражение с Python, поэтому я уверен, что это проблема. Может ли кто-нибудь дать мне представление о том, как лучше выразить шаблон, который я ищу? Спасибо!
BeautifulSoup
. - person Lev Levitsky   schedule 18.04.2014html
не имеет символов Unicode? - person Pedro Lobito   schedule 18.04.2014http://www.theage.com.au/digital-life/mobiles/Mobiles
(я только что запустил ее на возрастном веб-сайте, чтобы проверить), и она должна была получить эту ссылку, не так ли? я не думаю, что там есть какие-либо символы юникода .. - person guskenny83   schedule 18.04.2014