반응형

 

회사 인터넷망 위에서 Python 프로그램을 개발 중인데

Selenium 또는 Selenium-Wire 모듈을 사용하면 반드시 googlechromelabs.github.io  사이트에 접속되어야만 합니다.

하지만 제가 다니는 회사는 프록시 서버를 지나지 않는 이상 Github 사이트에 접속이 불가능하다는 사실...

방화벽 신청까지 해봤지만 결과는 반려 처리ㅜㅜ 어쩔 수 없이 프록시로...

 

제 코드는 3가지 모듈 (selenium-wire, selenium, request)을 사용합니다.

이 경우 Proxy 설정 방법에 관해 공유드리겠습니다.

import certifi
import json
import requests
from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service


# Selenium 또는 Selnium-Wire를 사용하는 경우
def driver_load():
    # webdriver 로드 #
    chromedriver = ".\\chromedriver.exe"
    service = Service(executable_path=chromedriver)

    seleniumwire_options = {
        "proxy": {
            "http": "<Proxy Server>:<Proxy Port>",
            "https": "<Proxy Server>:<Proxy Port>"
        }
    }

    # Set Options
    options = webdriver.ChromeOptions()
    options.add_argument('--proxy-server=<Proxy Server>:<Proxy Port>')

    # Set up the Chrome WebDriver
    driver = webdriver.Chrome(service=service, seleniumwire_options=seleniumwire_options, options=options)

    return driver


# Requests를 사용하는 경우
def request_post(post_url, params, headers):
    proxies = {
        "http": "<Proxy Server>:<Proxy Port>",
        "https": "<Proxy Server>:<Proxy Port>",
        "no_proxy": "localhost,127.0.0.1 "
    }

    params_json = json.dumps(params)
    response = requests.post(post_url, data=params_json, headers=headers, proxies=proxies, verify=certifi.where())

    return response

 

 

내용이 유용하셨다면 좋아요&댓글 부탁드립니다.
이 블로그를 이끌어갈 수 있는 강력한 힘입니다!

caul334@gmail.com

반응형
반응형

Selenium wire 모듈을 사용하다보면 가끔 POST 요청으로 백그라운드에서 XHR 요청이 발생하는 경우 있습니다.

 

하지만 문제는 POST 요청에 대한 파라미터를 변경한 값을 결과 값으로 가져오고 싶은데 그게 어렵다는 문제입니다ㅠㅠ

 

이런 경우 아래와 같은 코드를 사용하면 Selenium wire 모듈을 통해서도 얼마든지 세션을 유지하면서 Post 요청을 사용할 수 있습니다.

 

  해결책 - Python 코드

from seleniumwire import webdriver
import requests

# WebDriver 설정
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(seleniumwire_options={}, options=options)

# Selenium 모듈로 홈페이지 요청
url = 'https://example.com'
driver.get(url)

# POST 요청을 하는 특정 페이지 요청 값을 수정하여 requests 모듈로 재요청
for idx, request in enumerate(driver.requests):
	if '</api와 같은 홈페이지 uri 값>' in request.url and request.method == 'POST':
		post_url = request.url
		headers = request.headers
		params = {
			'key1': 'val1',
			'key2': 'val2'
		params_json = json.dumps(params)
		response = requests.post(post_url, data=params_json, headers=headers)
		print(response.text)
		break

 

 

caul334@gmail.com

내용이 유용하셨다면 좋아요&댓글 부탁드립니다.
이 블로그를 이끌어갈 수 있는 강력한 힘입니다!

반응형
반응형

트렌드를 파악하기 위해 네이버에서 데이터랩에서 제공하는 API 중 하나인 쇼핑 인사이트 API를 사용해보았습니다.

막상 사용하려 소스코드를 확인해보니 requests 모듈이 아닌 urllib 모듈이여서 사용하기 난감했습니다.

제가 평소에 requests 모듈에 친숙해 있기 때문이였죠. (requests 모듈은 알아두면 두고두고 쓸데가 많습니다.)

그래서 추후에 또 사용할 수도 있어서 이번 기회를 통해 urllib에서 requests 모듈로 변경해서 사용해보자고 생각했습니다.

 

  원본 소스코드

#-*- coding: utf-8 -*-
import os
import sys
import urllib.request
client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"
url = "https://openapi.naver.com/v1/datalab/shopping/categories";
body = "{\"startDate\":\"2017-08-01\",\"endDate\":\"2017-09-30\",\"timeUnit\":\"month\",\"category\":[{\"name\":\"패션의류\",\"param\":[\"50000000\"]},{\"name\":\"화장품/미용\",\"param\":[\"50000002\"]}],\"device\":\"pc\",\"ages\":[\"20\",\"30\"],\"gender\":\"f\"}";

request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)
request.add_header("Content-Type","application/json")
response = urllib.request.urlopen(request, data=body.encode("utf-8"))
rescode = response.getcode()
if(rescode==200):
    response_body = response.read()
    print(response_body.decode('utf-8'))
else:
    print("Error Code:" + rescode)

 

API에 대한 사용방법 등 상세한 설명은 아래 링크로 달아두었습니다.

쇼핑인사이트 API 사용법

 

쇼핑인사이트 - Datalab

쇼핑인사이트 쇼핑인사이트 개요 개요 쇼핑인사이트 API 개요 쇼핑인사이트 API는 네이버 데이터랩의 쇼핑인사이트를 API로 실행할 수 있게 하는 RESTful API입니다. 네이버 통합검색의 쇼핑 영역과

developers.naver.com

 

 

  수정된 소스코드 (requests 모듈)

import requests
import json
import pprint

####################################
client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"
####################################

url = "https://openapi.naver.com/v1/datalab/shopping/categories"

payload = {"startDate": "2017-08-01",
           "endDate": "2017-09-30",
           "timeUnit": "month",
           "category": [
               {"name": "패션의류",
                "param": ["50000000"]},
               {"name": "화장품/미용",
                "param": ["50000002"]}],
           "device": "pc",
           "ages": ["20", "30"],
           "gender": "f"}

headers = {"X-Naver-Client-Id": client_id, "X-Naver-Client-Secret": client_secret, "Content-Type": "application/json"}
res = requests.post(url, data=json.dumps(payload), headers=headers)

print(res.status_code)
aaa = json.loads(res.text)
pprint.pprint(aaa)

 

  소스코드 실행 결과 (requests 모듈)

위 소스를 실행하면 아래와 같은 가독성 있는 결과를 얻을 수 있습니다.

 

내용이 유용하셨나요? 좋아요&댓글 부탁드립니다.
이 블로그를 이끌어갈 수 있는 강력한 힘입니다!

caul334@gmail.com

반응형

+ Recent posts