如何加快python中的抓取?

时间:2017-01-07 12:01:39

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

我希望从用户角度展示最好的10家酒店。假设用户将进入“池”然后我必须在tripadvisor的用户评论中计算关键字“池”,然后计算并根据计数显示前10个酒店名称。为此目的,我目前正在废除酒店(迪拜)的所有评论,然后我将匹配关键字并显示前10名酒店名称。但酒店审查报废是花了太多时间我能做什么?任何帮助?除了抓取之外的其他方法?这是我的报废评论代码:

import requests
from bs4 import BeautifulSoup

offset = 0
url = 'https://www.tripadvisor.com/Hotels-g295424-oa' + str(offset) + '-Dubai_Emirate_of_Dubai-Hotels.html#EATERY_LIST_CONTENTS'

urls = []
r = requests.get(url)
soup = BeautifulSoup(r.text, "html.parser")

for link in soup.find_all('a', {'last'}):
      page_number = link.get('data-page-number')
      last_offset = int(page_number) * 30
      print('last offset:', last_offset)

for offset in range(0, last_offset, 30):
   print('--- page offset:', offset, '---')

     url = 'https://www.tripadvisor.com/Hotels-g295424-oa' + str(offset) + '-Dubai_Emirate_of_Dubai-Hotels.html#EATERY_LIST_CONTENTS'

    r = requests.get(url)
    soup = BeautifulSoup(r.text, "html.parser")

    for link in soup.find_all('a', {'property_title'}):
        iurl='https://www.tripadvisor.com/' + link.get('href')

        r = requests.get(iurl)
        soup = BeautifulSoup(r.content, "lxml")
        #look for the partial entry of the review
        resultsoup = soup.find_all("p", {"class" : "partial_entry"})

           for review in resultsoup:
              review_list = review.get_text()
              print(review_list)

1 个答案:

答案 0 :(得分:1)

您应该使用数据库来存储您要重用的数据,而不是再次执行相同的工作。

您的代码略有改进:使用requests.Session()维护与服务器的连接

Requests Document

  

Session对象允许您跨越某些参数   要求。它还会在所有请求中保留cookie   会话实例,并将使用urllib3的连接池。因此,如果   您正在向同一主机(底层TCP)发出多个请求   连接将被重用,这可能会导致重大连接   性能提升(参见HTTP持久连接)。

with requests.Session() as session:
    for offset in range(0, last_offset, 30):
        print('--- page offset:', offset, '---')

    url = 'https://www.tripadvisor.com/Hotels-g295424-oa' + str(offset) + '-Dubai_Emirate_of_Dubai-Hotels.html#EATERY_LIST_CONTENTS'

    r = session.get(url)
    soup = BeautifulSoup(r.text, "html.parser")

    for link in soup.find_all('a', {'property_title'}):
        iurl='https://www.tripadvisor.com/' + link.get('href')

        r = session.get(iurl)