어떻게 웹 페이지를 캡처할 때 막힐 기회를 줄일 수 있습니까

이 블로그는 검색엔진이나 다른 사이트에서 파이톤, 루비 코드 예시를 사용해 캡처할 때 차단될 가능성을 줄이는 방법에 관한 것이다.
  • Check Network Tab First
  • Delays

  • User-Agent
  • Code and Response examples with/without User-Agent
  • Rotate User-Agents
  • Additional Headers
  • Ordered Headers
  • IP Rate Limit
  • Proxies
  • Non-Overused Proxies
  • Become Whitelisted
  • Using SerpApi to deal with Search Engines
  • Links
  • Outro
  • 네트워크 탭 먼저 보기


    가장 은밀한 옆길 시스템을 만들기 전에 dev tools 아래의 네트워크 옵션을 보십시오. 직접 API/서버를 통해 추출에 필요한 데이터를 호출할 수 있는지 확인하십시오.이렇게 하면 너는 일을 복잡하게 할 필요가 없다.
    참고: API 호출도 보호됩니다.예를 들어 가드보와 월마트는 적당한 headers 없이 API 요청을 막았다.
    확인하려면 Dev Tools -> Network -> Fetch/XHR으로 이동하십시오.왼쪽에서 서버에서 서버로 보내거나 보내는 요청을 볼 수 있습니다. 그 중 하나를 클릭하면 오른쪽에서 '미리 보기' 옵션의 응답을 볼 수 있습니다.


    요청 중 일부가 원하는 데이터를 포함하고 있다면, 그것을 누르고 오른쪽에 있는 헤더스 옵션 카드로 이동해서 URL을 복사해서 Python requests.get() 또는 Ruby HTTParty.get()으로 요청을 보내십시오.

    지체하다


    지연은 때때로 작용하지만, 이것은 용례에 달려 있고, 당신이 그것을 사용해야 하는지의 여부에 달려 있다.
    파이썬에서는 내장된 time.sleep 메서드를 사용할 수 있습니다.
    from time import sleep
    
    sleep(0.05)  # 50 milliseconds of sleep
    sleep(0.5)   # half a second of sleep
    sleep(3)     # 3 seconds of sleep 
    
    루비에서 sleep 메서드를 사용하는 것도 같은 프로세스입니다.
    # Called without an argument, sleep() will sleep forever
    sleep(0.5) # half a second
    sleep(4.minutes)
    
    # or longer..
    sleep(2.hours)
    sleep(3.days)
    

    사용자 에이전트


    이것은 가장 기본적인 것이다. 보통 대부분의 사이트에서 이 정도면 충분하지만, user-agent은 당신의 요청이 거절당하거나 막히지 않을 것이라고 보장할 수 없다.
    기본 해석에서 로봇이나 브라우저가 가짜 user-agent 문자열을 보내서 자신이 다른 클라이언트임을 발표할 때 user-agent은'진실'사용자 방문, 즉 user-agent spoofing을 충당해야 한다.
    요청이 막힐 수 있는 이유는 예를 들어 Python requests 라이브러리에서 기본 user-agent python-requests 이고 사이트는 로봇임을 이해한다. 만약에 대량의 요청을 보내면 사이트가 과부하되지 않도록 요청을 막을 수 있다.User-agent syntax은 다음과 같이 보입니다.
    User-Agent: <product> / <product-version> <comment>
    
    검사 what's your user-agent .
    Python requests 라이브러리에서 user-agentheaders으로 요청 dict() 에 전달할 수 있습니다. 다음과 같습니다.
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
    }
    
    # add request headers to request
    requests.get("YOUR_URL", headers=headers)
    
    Ruby( HTTPary gem 포함)의 절차는 동일합니다.
    headers = {
      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
    }
    
    # add request headers to request
    HTTParty.get("YOUR_URL", headers:headers)
    

    사용자 에이전트의 코드와 응답 예시가 있습니까?


    다음 예제에서는 Python 및 requests 라이브러리를 사용합니다.이 문제는 Stack OverFlow에서 흔히 볼 수 있습니다.
    구글 검색에서 데이터를 얻어 user-agentuser-agent을 요청 헤더에 전달하도록 하겠습니다.아래의 예는 주식 가격을 얻으려고 시도할 것이다.

    요청 헤더에 AttributeError을 전달하지 않고 보내기
    import requests, lxml
    from bs4 import BeautifulSoup
    
    params = {
      "q": "Nasdaq composite",
      "hl": "en",
    }
    
    soup = BeautifulSoup(requests.get('https://www.google.com/search', params=params).text, 'lxml')
    print(soup.select_one('[jsname=vWLAgc]').text)
    
    먼저 응답에는 HTML과 선택기가 다르기 때문에 및 print이 표시됩니다.
    print(soup.select_one('[jsname=vWLAgc]').text)
    AttributeError: 'NoneType' object has no attribute 'text'
    
    그 다음에 soup에서 requests.get() 대상이나 응답을 가져오려고 하면 <script>으로 표시된 HTML이거나 오류가 있는 HTML을 볼 수 있습니다.
    user-agent에 요청:
    import requests, lxml
    from bs4 import BeautifulSoup
    
    headers = {
        "User-Agent":
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
    }
    
    params = {
      "q": "Nasdaq composite",
      "hl": "en",
    }
    
    soup = BeautifulSoup(requests.get('https://www.google.com/search', headers=headers, params=params).text, 'lxml')
    print(soup.select_one('[jsname=vWLAgc]').text)
    
    # 15,363.52
    

    사용자 에이전트 교체


    만약 당신이 한 사이트에 대해 대량의 웹 캡처 요청을 하려고 한다면, 가장 좋은 것은 서로 다른 HTTP 헤더를 보내서 모든 요청이 랜덤으로 보이고, 그것이 서로 다른 컴퓨터/다른 브라우저로 보일 수 있도록 하는 것이다.
    절차:
  • WhatIsMyBrowser.com에서 최근 실제 브라우저의 사용자 프록시 문자열 목록을 수집했다.
  • 은 파이썬 list() 또는 txt 파일에 넣습니다.
  • 은 요청마다 list()을 사용하여 random.choice()에서 무작위로 문자열을 선택하도록 한다.
  • import requests, random
    
    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 user_agent_list:
      #Pick a random user agent
      user_agent = random.choice(user_agent_list)
    
      #Set the headers 
      headers = {'User-Agent': user_agent}
    
    requests.get('URL', headers=headers)
    
    Scraphero에서 how to fake and rotate User Agents using Python에 대해 자세히 알아보십시오.

    부제목


    때로는 user-agent만으로는 부족할 때도 있다.너는 추가 제목을 전달할 수 있다.예를 들면 다음과 같습니다.

  • Accept : Accept: <MIME_type>/<MIME_subtype>; Accept: <MIME_type>/*; Accept: */*

  • Accept-Language : Accept-Language: <language>; Accept-Language: *

  • Content-Type : Content-Type: text/html; img/png
  • 요청을 보낼 때 이 정보를 보낼 수 있는 정보는 more HTTP request headers을 참조하십시오.
    또한 인증 데이터를 전송해야 하는 경우 requests.Session() 을 사용할 수 있습니다.
    session = requests.Session()
    session.auth = ('user', 'pass')
    session.headers.update({'x-test': 'true'})
    
    # both 'x-test' and 'x-test2' are sent
    session.get('https://httpbin.org/headers', headers={'x-test2': 'true'})
    
    또는 cookies를 보내야 하는 경우:
    session = requests.Session()
    
    response = session.get('https://httpbin.org/cookies', cookies={'from-my': 'browser'})
    print(response .text)
    # '{"cookies": {"from-my": "browser"}}'
    
    response = session.get('https://httpbin.org/cookies')
    print(response.text)
    # '{"cookies": {}}'
    
    DevTools -> Network -> Click on the URL -> Headers에서 모든 요청/응답 제목을 볼 수 있습니다.
    Insomnia(URL->copy as cURL(Bash)을 마우스 오른쪽 단추로 클릭하면 보내는 HTTP 요청 헤더를 보고 동적으로 처리할 수 있습니다.

    또한 코드를 생성할 수도 있습니다(항상 완벽하지는 않습니다).

    순차적 제목


    특수한 경우, 제목을 질서정연하게 제공하기를 원할 수도 있습니다.
    이 점을 하려면 너는 이렇게 할 수 있다.
    from collections import OrderedDict
    import requests
    
    session = requests.Session()
    session.headers = OrderedDict([
        ('Connection', 'keep-alive'), 
        ('Accept-Encoding', 'gzip,deflate'),
        ('Origin', 'example.com'),
        ('User-Agent', 'Mozilla/5.0 ...'),
    ])
    
    # other code ...
    
    custom_headers = OrderedDict([('One', '1'), ('Two', '2')])
    req = requests.get('https://httpbin.org/get', headers=custom_headers)
    prep = session.prepare_request(req)
    print(*prep.headers.items(), sep='\n')
    
    # prints:
    '''
    ('Connection', 'keep-alive')
    ('Accept-Encoding', 'gzip,deflate')
    ('Origin', 'example.com')
    ('User-Agent', 'Mozilla/5.0 ...')
    ('One', '1')
    ('Two', '2')
    '''
    
    코드는 jfs에서 Stack OverFlow 응답에서 추출됩니다.그의 답안을 읽고 더 많은 정보를 얻으십시오. (주의: 이것은 러시아어로 쓴 것입니다.)Requests Header Ordering에 대해 자세히 알아보십시오.

    IP 속도 제한


    IP 속도 제한의 작동 방식은 API 속도 제한과 유사하지만 일반적으로 해당 항목에 대한 공개 정보는 없습니다.
    이것은 기본적인 보안 시스템으로 같은 IP에서 들어오는 요청을 금지하거나 막을 수 있다.즉, 일반 사용자는 동일한 도메인에 대해 몇 초 이내에 100개의 요청을 보내지 않으므로 연결이 위험/예외/의심으로 계속 표시되므로 X시간당 몇 개의 요청을 안전하게 수행할 수 있는지 확인할 수 없습니다.
    먼저 HTML을 로컬에 저장하고 필요한 모든 내용을 테스트한 다음 사이트에 실제 요청을 시작합니다.

    대리점


    때때로 요청 헤더를 전달하는 것은 부족하다.이 때 프록시와 요청 헤더를 결합해서 사용할 수 있습니다.
    일단 왜 대리예요?
  • , 비율대로 깎고 싶으면.웹 페이지 캡처를 할 때 요청을 할 때 대량의 데이터가 발생할 수 있습니다.에이전트는 데이터가 일반 사용자의 데이터처럼 보이도록 하여 균형을 이루는 데 사용된다.
  • 대상 웹 사이트가 일부 국가에서만 사용 가능한 경우 특정 지역 또는 장치에서 요청할 수 있습니다.
  • , 동일하거나 다른 사이트를 동시에 방문하고자 한다면 사이트에서 금지되거나 차단될 기회를 줄일 수 있습니다.
  • Python을 사용하여 proxies 을 요청에 전달합니다(user-agent과 동일).
    proxies = {
      'http': 'http://10.10.1.10:3128',
      'https': 'http://10.10.1.10:1080',
    }
    
    requests.get('http://example.org', proxies=proxies)
    
    이렇게 HTTParty to add proxies을 사용하거나 아래에 표시된 코드 세그먼트에 비슷한 코드를 사용합니다.
    http_proxy = {
      http_proxyaddr: "PROXY_ADDRESS",
      http_proxyport: "PROXY_PORT"
    }
    
    HTTParty.get("YOUR_URL", http_proxy:http_proxy)
    
    또는 HTTPrb to add proxies:
    HTTP.via("proxy-hostname.local", 8080)
      .get("http://example.com/resource")
    
    HTTP.via("proxy-hostname.local", 8080, "username", "password")
      .get("http://example.com/resource")
    

    과도하게 사용되지 않은 에이전트


    간단히 말하자면 가능하면 과도하게 사용하는 에이전트를 사용하지 마십시오. 왜냐하면:
  • 공공 에이전트는 가장 안전하지 않고 신뢰할 수 없는 에이전트입니다.
  • 공유 에이전트는 일반적으로 가장 저렴한 에이전트입니다. 많은 클라이언트가 비용을 부담하기 때문에 같은 가격으로 더 많은 에이전트를 사용합니다.
  • 많은 공공 에이전트를 긁어내서 list()에 저장하거나 .txt 파일에 저장하면 메모리를 절약하고 결과를 요청할 때 교체할 수 있습니다. 만약 결과가 당신이 원하는 것이 아니라면 다른 종류의 에이전트로 이동할 수 있습니다.
    다른 types of proxies에 대한 정보와 그 중 어떤 것이 가장 적합한지 알아보세요.

    화이트리스트에 오르다


    Get whitelisted (화이트리스트 가져오기) 는 웹 사이트에 IP 주소를 추가하여 목록을 허용하는 것을 가리킨다. 이 목록은 기본적으로 모든 내용이 거부될 때 허용되는 내용 목록이다.
    화이트리스트가 되는 방식의 하나는 수집된 데이터에 따라 정기적으로 유용한 일을 할 수 있다는 것이다. 이것은 약간의 견해를 가져올 수 있다.

    SerpApi를 사용한 검색 엔진 처리


    구글, 필응, 야후 등 검색엔진을 처리하고 있다면, 이 모든 문제를 피하기 위해 SerpApi을 사용할 수 있다.이것은 무료 유료 API다.
    가장 큰 차이점은 인증 부분을 제외하고는 모든 일이 최종 사용자를 위해 이루어졌기 때문에 고려할 필요도, 유지할 필요도, 확장할 방법도 없다는 것이다.

    링크


    User-AgentRequest HeadersResponse HeadersList of HTTP HeadersTypes of proxiesPython RequestsRuby HTTPartyAPI

    오트로


    질문이나 조언이 있으면 언제든지 댓글 부분이나 트위터를 통해 댓글을 남겨주세요.
    너의
    디미트리와 SerpApi팀의 다른 사람들.

    좋은 웹페이지 즐겨찾기