【问题标题】:Speed up web-scraping加快网页抓取速度
【发布时间】:2016-06-14 15:32:14
【问题描述】:

我有一个项目,我必须抓取 50 位演员的所有评分,这意味着我必须访问和抓取大约 3500 个网页。这需要的时间比我预期的要长,我正在寻找一种加快速度的方法。我知道有像 scrapy 这样的框架,但我想在没有任何其他模块的情况下工作。是否有一种快速简便的方法来重写我的代码,或者这会花费太多时间吗? 我的代码如下:

    def getMovieRatingDf(movie_links):

        counter = -1
        movie_name = []
        movie_rating = []
        movie_year = []

        for movie in movie_links.tolist()[0]:
            counter += 1

            request = requests.get('http://www.imdb.com/' + movie_links.tolist()[0][counter])
            film_soup = BeautifulSoup(request.text, 'html.parser')

            if (film_soup.find('div', {'class': 'title_wrapper'}).find('a').text).isdigit():
            movie_year.append(int(film_soup.find('div', {'class': 'title_wrapper'}).find('a').text))

            # scrap the name and year of the current film
            movie_name.append(list(film_soup.find('h1'))[0])

            try:
                movie_rating.append(float(film_soup.find('span', {'itemprop': 'ratingValue'}).text))

           except AttributeError:
                movie_rating.append(-1)
      else:
        continue

      rating_df = pd.DataFrame(data={"movie name": movie_name, "movie rating": movie_rating, "movie year": movie_year})
      rating_df = rating_df.sort_values(['movie rating'], ascending=False)

return rating_df

【问题讨论】:

  • 你似乎有不稳定的缩进,而 Python,在所有编程语言中,都不喜欢不稳定的缩进。你粘贴的东西有用吗? return 不属于所示的 defelse: continue 和以下行也没有正确缩进。

标签: python html web-scraping beautifulsoup html-parsing


【解决方案1】:

主要瓶颈很容易通过查看代码来确定。它具有阻止性质。在处理当前页面之前,您不会下载/解析下一页。

如果你想加快速度,以非阻塞方式异步进行。这就是Scrapy 提供的开箱即用:

在这里,您会注意到 Scrapy 的主要优势之一:请求是 异步调度和处理。 这意味着 Scrapy 不会 需要等待请求完成和处理,它可以发送 另一个请求或在此期间做其他事情。这也意味着 即使某些请求失败或 处理时发生错误。

另一种选择是从requests 切换到grequests,示例代码可以在这里找到:


我们还可以在 HTML 解析阶段改进一些事情:

  • html.parser切换到lxml(需要lxmlto be installed):

    film_soup = BeautifulSoup(request.text, 'lxml')
    
  • 使用SoupStrainer只解析文档的相关部分

【讨论】:

    猜你喜欢
    • 2014-05-12
    • 2013-06-06
    • 1970-01-01
    • 2021-10-01
    • 2020-08-08
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多