【问题标题】:How to send thousands of HTTP Requests using grerequests?如何使用 grerequests 发送数千个 HTTP 请求?
【发布时间】:2023-01-12 15:36:31
【问题描述】:

我需要在 Glassdoor 上请求一家公司的所有评论页面,在某些情况下,可能有数千页。我正在尝试使用 grequests 来执行此操作,但我发现当我一次发送超过 100 个请求时,我将开始收到 403 error

我想出了这段代码来将请求分成 100 个块:

"reviews_url": "https://www.glassdoor.com/Reviews/Apple-Reviews-E1138.htm?"

batch = 100
responses = []
for j in range(math.ceil(num_pages/batch)):
    print("Batching requests: {}/{}".format(min(num_pages, (j+1)*batch),num_pages))
    rs = (
        grequests.get(
            reviewsUrl.replace(".htm", "_P" + str(k + 1) + ".htm"),
            headers=DEFAULT_HEADERS,
        )
        for k in range(min(num_pages, (j)*batch), min(num_pages, (j+1)*batch))
    )
    responses += grequests.map(rs)
    time.sleep(uniform(10,15))

这行得通,我得到了我需要的东西,但它太慢了,我需要为大约 8000 家公司做这件事。有一个更好的方法吗?我尝试减少批次之间的睡眠时间并再次开始收到 403。

【问题讨论】:

  • 我认为他们在源 IP 上设置了一些块,你需要相应地检查和模仿

标签: python web-scraping get grequests


【解决方案1】:

Error 403 表示你的请求没问题,但是那个服务器拒绝了。在您的情况下,因为您同时发出了太多请求。

没有超时的网络抓取 (time.sleep(uniform(10,15))) 会滥用服务器资源并可能影响其他用户的服务。因此,大多数网站都会限制您在某些(短)时间范围内可以执行的请求数量。服务器通过向您发送错误 403 来告知您已超过此限制。有时服务器也使用 420429。不遵守此消息至少是不礼貌的,并且通常违反服务条款。

你可以试试:

  1. 真的需要每次都取数据吗?如果您只需要执行一次(例如将数据保存到 csv 文件并稍后从中读取),则更长的下载时间并不重要。
  2. 请求之间的超时增加。
  3. 检查网站是否提供一些批量下载数据的方法(你试过Glassdoor api)?

【讨论】:

    猜你喜欢
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    • 2014-09-02
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多