2016-06-14 3 views
0

У меня есть проект, где мне нужно соскрести все рейтинги 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 
+0

Вы, кажется, имеет неустойчивые отступы, и Python , из всех языков программирования, не любит неустойчивый отступ. Работает ли то, что вы вставляете? «Возврат» не относится к показанной «def». Строки 'else: continue' и следующие строки также не имеют отступов. –

ответ

6

Основное узкое место легко определить, просто глядя на код. Он имеет блокирующий характер. Вы не загружаете/разбираете следующую страницу до тех пор, пока не будет обработан ток.

Если вы хотите ускорить работу, сделайте это асинхронно неблокирующим образом. Это то, что Scrapy предлагает вне коробки:

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

Другим вариантом было бы перейти от requests к grequests, пример кода можно найти здесь:


Мы можем также улучшить пару вещей в HTML- этап анализа:

  • переключателя в lxml от html.parser (требуется lxmlto be installed):

    film_soup = BeautifulSoup(request.text, 'lxml') 
    
  • использования SoupStrainer для синтаксического анализа только соответствующей часть документа