2012-12-17 5 views
0

Я пытаюсь получить данные обо всех играх команды в обычном сезоне, очищенном от http://www.basketball-reference.com/boxscores/201112250DAL.html. Я получил все другие функции фермизации данных, которые работают нормально, проблема заключается в том, что я скребок скребок. Это тестовый код, который я использовал для получения URL-адреса следующей страницы. Я мог бы использовать это, чтобы получить данные из всех 66 игр, которые команда играла в течение регулярного сезона, но это много набирает, чтобы очистить его таким образом. Каким будет самое простое решение для автоматизации этого?Looping скребок

Спасибо!

URL = "http://www.basketball-reference.com/boxscores/201112250DAL.html" 

html = urlopen(URL).read() 
soup = BeautifulSoup(html) 

def getLink(html, soup): 
    links = soup.findAll('a', attrs={'class': 'bold_text'}) 
    if len(links) == 2: 
     a = links[0] 
     a = str(a) 
     a = a[37:51] 
     return a 
    if len(links) == 3: 
     a = links[1] 
     a = str(a) 
     a = a[37:51] 
     return a 
    if len(links) == 4: 
     a = links[3] 
     a = str(a) 
     a = a[37:51] 
     return a 

print getLink(html, soup) 
URL1 = "http://www.basketball-reference.com/boxscores" + getLink(html, soup) + "html" 
print URL1 
html1 = urlopen(URL1).read() 
soup1 = BeautifulSoup(html1) 

print getLink(html1, soup1) 
+1

Если вы просто пытаетесь разработать URL-адреса, было бы проще вместо этого просто захватить http://www.basketball-reference.com/teams/DAL/2012_games.html и буквально вычеркнуть строки, которые выглядят например "/boxscores/*.html"? Это даст вам 66 регулярных игр плюс плей-офф .. – tanantish

+0

Это всего лишь тест, чтобы пройти через URL-адреса, в главном коде есть функции, которые учитывают статистику, интересующую каждую игру. Мне просто интересно, как сделать этот процесс как можно быстрее. – user1851527

+0

Я думал о том, как использовать страницу /DAL/2012_games.html как ваш индекс? Вы можете получить это один раз и легко получить 66 URL-адресов, которые вам нужны, и поместить их в список, а затем подать это. Сортировка в обход всего соскабливания страницы для правильной ссылки «следующая игра» (так как я не видел никаких простые шаблоны для сравнения) – tanantish

ответ

3

Проще всего было бы пойти в http://www.basketball-reference.com/teams/DAL/2012_games.html и сделать что-то вроде этого:

URL = 'http://www.basketball-reference.com/teams/DAL/2012_games.html' 
html = urllib.urlopen(URL).read() 
soup = BeautifulSoup(html) 

links = soup.findAll('a',text='Box Score') 

Это возвращает список всех <a> тегов с текстом «Box Score». Проверьте это с этим:

for link in links: 
    print link.parent['href'] 
    page_url = 'http://www.basketball-reference.com' + link.parent['href'] 

Отсюда, сделать еще один запрос на page_url и продолжить кодирование.

Это весь код, который я использовал, и он работал отлично для меня:

from BeautifulSoup import BeautifulSoup 
import urllib 


url = 'http://www.basketball-reference.com/teams/DAL/2012_games.html' 
file_pointer = urllib.urlopen(url) 
soup = BeautifulSoup(file_pointer) 

links = soup.findAll('a',text='Box Score') 
for link in links: 
    print link.parent['href'] 
+0

Thnx, я никогда не думал о том, чтобы попробовать это так. Дала вам идею быстрой проверки, и она не работала; У меня есть KeyError: 'href'. – user1851527

+0

Вы уверены, что хотите href для родителей? В этом случае вы получите KeyError, так как родительский тег A будет TD, который собирается бросить KeyError. Он отлично работает, если вы вместо этого обращаетесь к атрибуту href ссылки ('link ['href']' вместо 'link.parent ['href']') – tanantish

0

Самый простой Проще всего было бы использовать scrapy. Какие последующие ссылки для вас автоматически.

Это позволяет вам легко создавать сложные правила, по которым следует следовать и игнорировать URL-адреса. Затем Scrapy выполнит любой URL-адрес, соответствующий вашим правилам. Это требует, чтобы вы узнали, как работает scrapy, но они обеспечивают отличный быстрый учебник о том, как начать работу.