首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加快网络抓取

加快网络抓取
EN

Stack Overflow用户
提问于 2016-06-14 15:32:14
回答 1查看 1.9K关注 0票数 1

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

代码语言:javascript
复制
    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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-14 15:36:23

通过查看代码就可以很容易地确定主要的瓶颈。这是一个阻塞性质的。在当前正在处理之前,您不会下载/解析下一页。

如果您想加快速度,请以非阻塞的方式异步执行。这就是刮痕提供的开箱即用的产品:

在这里,您注意到Scrapy的一个主要优点:请求是异步调度和处理的。--这意味着Scrapy不需要等待请求的完成和处理,它可以发送另一个请求或在此期间执行其他任务。这也意味着即使某些请求失败或在处理时发生错误,其他请求也可以继续进行。

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

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

  • lxml切换到html.parser (需要lxml 待安装): film_soup = BeautifulSoup(request.text,'lxml')
  • 使用SoupStrainer仅解析文档的相关部分
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37816338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档