【问题标题】:Can't solve HTTP Error 429 with time.sleep()无法使用 time.sleep() 解决 HTTP 错误 429
【发布时间】:2020-06-11 20:19:31
【问题描述】:

我需要抓取 Google 搜索结果链接。

但是,即使我在代码中输入了time.sleep(),我仍然会收到 HTTP 错误 429。

它适用于 50 - 100 行,然后给出错误 429。但是我需要抓取数百个条形码链接。

我该如何解决这个问题?

import time
from itertools import chain

import pandas as pd
import requests
from bs4 import BeautifulSoup

barcode_df = pd.read_csv("C:/Users/emina/Coding_Projects/PycharmProjects/drug_interaction(pycharm)/barcodes.csv")
barcode_list2d = barcode_df.values.tolist()    
barcode_list = list(chain.from_iterable(barcode_list2d))  # This is the list we'll iterate over    
barcode_list = [x for x in barcode_list if type(x) == str]
barcode_list_deneme = barcode_list[0:20]    
barcode_list1 = barcode_list[0:1000]

USER_AGENT = "some user agent"
headers = {"user-agent": USER_AGENT}


def append_links_to_csv(barcode):
    if resp.status_code == 200:
        soup = BeautifulSoup(resp.content, "html.parser")
        for g in soup.find_all('div', class_='r'):
            anchors = g.find_all('a')
            if anchors:
                link = anchors[0]['href']  # Parses search link
                l.write(barcode + "," + link + "\n")
            time.sleep(0.06)
    else:
        print(resp.status_code)


count = 0 


l = open("links.csv", "a")

for barcode in barcode_list1:
    
    query = barcode + "+" + "site:ilacabak.com"
    url = f"https://google.com/search?q={query}"        
    resp = requests.get(url, headers=headers)
    append_links_to_csv(barcode)
    count += 1
    print(count)        
    time.sleep(1.5)
    
    if count % 100 == 0:
        l.close()
        l = open("links.csv", "a")
l.close()

【问题讨论】:

  • 你想爬取谷歌?祝你好运。简单的睡眠不会阻止 Google 将您识别为机器人。

标签: python python-requests http-error


【解决方案1】:

您可以尝试做的一件事是将user-agentsRetry-After header 结合使用,如果响应状态代码为429,这将指示在发出新请求之前等待多长时间,如Sameer Naik已经建议了。

例如:

import random, requests

user_agent_list = [
  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Safari/605.1.15',
  'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0',
  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36',
  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:77.0) Gecko/20100101 Firefox/77.0',
  'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36',
]

for _ in range(len(user_agent_list)):
  #Pick a random user agent
  user_agent = random.choice(user_agent_list)

  headers = {'User-Agent': user_agent}

requests.get('URL', headers=headers)

或者,您可以通过使用来自 SerpApi 的 Google Search Engine Results API 来忘记考虑它。这是一个带有免费计划的付费 API。查看Playground

您的情况的不同之处在于,您需要考虑要从结构化 JSON 中提取哪些数据,而不是想办法绕过 Google( 或其他搜索引擎)的阻止。

或者如何从 HTML 中提取某些元素(特别是如果您需要的数据位于 JavaSript 但您不想使用浏览器自动化,例如 seleniumrequests-html

要集成的示例代码:

from serpapi import GoogleSearch

params = {
  "api_key": "YOUR_API_KEY",
  "engine": "google",
  "q": "Coffee",
  "location": "Austin, Texas, United States",
  "google_domain": "google.com",
  "gl": "us",
  "hl": "en"
  # other query parameters
}

search = GoogleSearch(params)
results = search.get_dict()

for result in results['organic_results']:
    print(result['title'], result['link'], sep='\n')

# prints all results from the first page of organic results

免责声明,我为 SerpApi 工作。

【讨论】:

    【解决方案2】:

    检查响应是否包含 Retry-After 标头并在重试之前等待几秒钟。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-24
      • 2012-10-24
      • 2021-05-18
      • 2018-02-24
      • 2014-05-04
      • 2019-03-16
      • 2014-08-29
      • 1970-01-01
      相关资源
      最近更新 更多