【问题标题】:Optimizing a webcrawl优化网络爬虫
【发布时间】:2017-07-28 18:47:25
【问题描述】:

接下来的爬行虽然很短,但速度非常慢。我的意思是,“在一部完整的故事片中流行”,慢。

def bestActressDOB():
    # create empty bday list
    bdays = []    
    # for every base url
    for actress in getBestActresses("https://en.wikipedia.org/wiki/Academy_Award_for_Best_Actress"):
        # use actress list to create unique actress url
        URL = "http://en.wikipedia.org"+actress
        # connect to html
        html = urlopen(URL)
        # create soup object
        bsObj = BeautifulSoup(html, "lxml")
        # get text from <span class='bday">
        try:
            bday = bsObj.find("span", {"class":"bday"}).get_text()
        except AttributeError:
            print(URL)
        bdays.append(bday)
        print(bday)
    return bdays

它从一个维基百科页面上的表格中获取每位获得奥斯卡奖提名的女演员的姓名,然后将其转换为列表,使用这些名称创建 URL 以访问每位女演员的 wiki,并在其中获取她的出生日期.该数据将用于计算每位女演员被提名或获得奥斯卡最佳女演员奖的年龄。除了 Big O,有没有办法实时加快速度。我对这种事情没有什么经验,所以我不确定这有多正常。想法?

编辑:请求的子程序

def getBestActresses(URL):
    bestActressNomineeLinks = []
    html = urlopen(URL)
    try:
        soup = BeautifulSoup(html, "lxml")
        table = soup.find("table", {"class":"wikitable sortable"})
    except AttributeError:
        print("Error creating/navigating soup object")
    table_row = table.find_all("tr")
    for row in table_row:
        first_data_cell = row.find_all("td")[0:1]
        for datum in first_data_cell:
            actress_name = datum.find("a")
            links = actress_name.attrs['href']
            bestActressNomineeLinks.append(links)
    #print(bestActressNomineeLinks)
    return bestActressNomineeLinks

【问题讨论】:

  • 如果速度是第一优先,那么我建议将您的解析器重写(或集成)到Scrapy 框架。
  • 感谢您的回复!该代码现在正在 Spyder 中运行,并将被传输到 Jupyter 笔记本,在那里它将与用于补充的数据分析和统计数据一起使用。 Scrapy 需要它自己的目录,并且无法与 Jupyter 中的 Pandas + stats 包集成,不是吗?
  • 好吧,我认为你把事情搞混了——SpyderJupyter 是 IDE。换句话说,Scrapy 是一个有自己的东西的模块,例如,BeautifulSoup 或任何其他用于解析的模块。我使用pandasScrapy,在Spyder 中编写我的代码并从bash 启动解析器。
  • 我认为多线程/异步是@Dmitry 的观点。这里的瓶颈可能是网络 IO 但没有看到getBestActresses() 很难说。
  • @pguardiario - 不知道如何对除针之外的任何东西进行多线程处理。不过,我会发布 getBestActresses() 供您查看。没什么。它只是从 wiki 表中读取女演员姓名的链接,而且速度非常快。

标签: python-3.x web-scraping beautifulsoup web-crawler


【解决方案1】:

我建议在速度更快的计算机上尝试,甚至在谷歌云平台、Microsoft azure 或亚马逊网络服务等服务上运行。没有任何代码可以让它运行得更快。

【讨论】:

  • 感谢您的评论!从理论上讲,这是有道理的,但这是针对小型数据分析/统计项目的。我的 Mac 必须在它所在的位置。为这个特定项目学习额外技术所增加的成本与预期回报相比是不合理的。
  • 所有这些服务都提供可以运行它的免费版本!我过去一直使用它们,从未付款。如果我有帮助,请将我的答案标记为正确,以便其他人可以看到!
  • 我会检查他们。然而,在这种情况下,我所说的“增量成本”是指“额外的麻烦”。如上所述,这一切都在一个 Jupyter 笔记本中进行,它将讲述一个分析/统计故事。在一个地方(环境)做所有事情是理想的。但是,我会检查您的建议。如果我走那条路,我一定会相信你的回应。
猜你喜欢
  • 2013-03-29
  • 2017-05-16
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
相关资源
最近更新 更多