【问题标题】:How to speed up scraping in python?如何加快python中的抓取速度?
【发布时间】:2017-01-07 12:01:39
【问题描述】:

我想展示 10 家从用户角度来看最好的酒店。假设用户将输入“pool”,那么我必须计算来自 tripadvisor 的用户评论中的关键字“pool”,然后进行计数并根据计数显示前 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)

【问题讨论】:

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


    【解决方案1】:

    您应该使用数据库来存储您正在抓取以供重复使用的数据,而不是再次执行相同的工作。

    您的代码有一点改进:使用requests.Session() 来保持与服务器的连接

    Requests Document:

    Session 对象允许你在 要求。它还在从 会话实例,并将使用 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)
    

    【讨论】:

    • 如果我匹配网页上的关键字可以吗?并且不取消评论?
    • @Hifza ahmad 是的,你可以,不要使用 bs4,只需获取 response.text,而不是使用正则表达式查找所有关键字,这会快得多。 bs4 是解析 html 代码最慢的方式。
    猜你喜欢
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 2018-04-24
    • 1970-01-01
    • 2021-09-07
    • 2023-01-13
    相关资源
    最近更新 更多