requests 사용
requests 를 사용하여 웹페이지 정보를 가져온다.
import requests
resp = requests.get(url)
헤더 정보 추가
headers = {
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36",
"content-type": "application/json",
}
resp = requests.get(url, headers=headers)
프록시 사용
resp = requests.get(url, proxies=proxies)
"https://free-proxy-list.net/" 에서 제공하는 정보를 활용하여 프록시 서버 설정
필요에 따라 Https
를 지원하는 서버 목록만을 가져온다.
import requests
from scrapy import Selector
proxy_url = "https://free-proxy-list.net/"
resp = requests.get(proxy_url)
sel = Selector(resp)
tr_list = sel.xpath('//*[@id="proxylisttable"]/tbody/tr')
proxy_server_list = []
for tr in tr_list:
ip = tr.xpath("td[1]/text()").extract_first()
port = tr.xpath("td[2]/text()").extract_first()
https = tr.xpath("td[7]/text()").extract_first()
if https == "yes":
server = f"{ip}:{port}"
proxy_server_list.append(server)
proxy_server_list
를 사용하여 proxy를 설정한 requests를 요청한다.
from random import choice
proxy_server = choice(proxy_server_list)
proxies = {"http": proxy_server, 'https': proxy_server}
resp = requests.get(url, headers=headers, proxies=proxies)
해외 프록시를 사용하는 경우 응답이 늦을 수 있으니, 추가적으로 timeout 설정도 할 수 있다.
resp = requests.get(url, headers=headers, proxies=proxies, timeout=3)
요청이 실패하면, 프록시 목록에서 삭제한다.
import requests
from requests.exceptions import ProxyError, SSLError, ConnectTimeout
try:
resp = requests.get(url, headers=headers, proxies=proxies, timeout=3)
except (ProxyError, SSLError, ConnectTimeout) as e:
proxy_server_list.remove(proxy_server)
프록시가 실패하면 다음 프록시를 사용하도록 변경
def get_proxy_list():
proxy_url = "https://free-proxy-list.net/"
response = requests.get(proxy_url)
selector = Selector(response)
tr_list = selector.xpath('//*[@id="proxylisttable"]/tbody/tr')
server_list = []
server_list.extend(PROXIES)
for tr in tr_list:
ip = tr.xpath("td[1]/text()").extract_first()
port = tr.xpath("td[2]/text()").extract_first()
https = tr.xpath("td[7]/text()").extract_first()
if https == "yes":
server = f"{ip}:{port}"
server_list.append(server)
return server_list
while True:
if len(proxy_server_list) == 0:
proxy_server_list = get_proxy_list()
proxy_server = choice(proxy_server_list)
proxies = {"http": proxy_server, 'https': proxy_server}
print(f'proxies: {proxies}')
try:
resp = requests.get(url, headers=headers, proxies=proxies, timeout=5)
sel = Selector(resp)
break
except (ProxyError, SSLError, ConnectTimeout) as e:
proxy_server_list.remove(proxy_server)
print(f'proxy len: {len(proxy_server_list)}')
continue
'Programming > Python' 카테고리의 다른 글
파이썬 프로그램 버그 없이 만들기 8가지 팁 (0) | 2021.09.01 |
---|---|
Jupyter Lab CSS 변경 (0) | 2019.07.03 |
BeautifulSoup 파싱이 뭔가 이상하다 (1) | 2019.06.07 |
FTP file upload (0) | 2018.11.07 |
Jupyter lab 에 익스텐션 설치하기 (0) | 2018.11.06 |
댓글