【问题标题】:Looping a scraper循环刮板
【发布时间】:2012-12-17 12:28:15
【问题描述】:

我正在尝试从http://www.basketball-reference.com/boxscores/201112250DAL.html 中获取一支球队在常规赛中的所有比赛数据。我让所有其他数据农业功能正常工作,我遇到的问题是循环刮板。 这是我用来获取下一页 URL 的测试代码。我可以使用它来获取一支球队在常规赛期间打过的所有 66 场比赛的数据,但是要通过这种方式进行大量输入。实现自动化的最简单解决方案是什么?

谢谢!

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)

【问题讨论】:

  • 如果您只是想计算出 URL,那么直接抓取 basketball-reference.com/teams/DAL/2012_games.html 并从字面上删除看起来像 "/boxscores/*.html" 的字符串会更容易吗?这将为您带来 66 场常规比赛和季后赛......
  • 这只是一个测试,通过 URL,主代码中有函数,可以从每个游戏中获取我感兴趣的统计信息。我只是想知道如何使这个过程尽可能快。
  • 我正在考虑使用 /DAL/2012_games.html 页面作为您的索引?您可以检索一次,然后轻松获取所需的 66 个 URL 并将其粘贴在列表中,然后将其输入。有点绕过页面的整个抓取以获取正确的“下一个游戏”链接(因为我没有看到任何匹配的简单模式)

标签: python loops web-scraping beautifulsoup


【解决方案1】:

最简单的方法是转到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')

这将返回所有带有“Box Score”文本的<a> 标签的列表。用这个测试它:

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']

【讨论】:

  • Thnx,我从没想过这样尝试。快速测试您的想法,但没有成功;我得到了一个 KeyError:'href'。
  • 你确定你想要父母的href吗?在这种情况下,您将得到一个 KeyError,因为 A 标签的父级将是一个 TD,这将引发 KeyError。如果您改为访问链接的 href 属性(link['href'] 而不是 link.parent['href']),则效果很好
【解决方案2】:

最简单的方法是使用scrapy。它会自动为您跟随链接。

它允许您轻松创建复杂的规则来遵循和忽略哪些 url。然后,Scrapy 将遵循与您的规则匹配的任何 url。它确实需要您了解 scrapy 的工作原理,但它们提供了一个很好的快速入门教程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 2021-06-14
    • 2023-03-31
    • 2019-05-09
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多