[파이썬 능숙 100일] Day42: 파이썬 웹 크롤러 개발_HTTP 요청 라이브러리에서 공통 구문과 실제 전투를 요청합니다.

목차

1개의 HTTP 프로토콜

2 HTTP 및 HTTPS

3 HTTP 요청 프로세스

 3.1 HTTP 요청 프로세스

3.2 GET 요청과 POST 요청

3.3 공통 요청 헤더

3.4 HTTP 응답

4 HTTP 요청 라이브러리는 공통 구문을 요청합니다.

4.1 GET 요청 보내기

 4.2 POST 요청 보내기

4.3 요청 매개변수 및 헤더

4.4 인코딩 형식

4.5 고급 작업 요청 - 파일 업로드

4.6 고급 작업 요청 - 쿠키 가져오기

4.7 고급 작업 요청 - 인증서 확인

5 전투

요청 라이브러리를 이용해 2023년 대학 입시 소식의 제목과 링크를 받아보세요


1개의 HTTP 프로토콜

        HTTP 프로토콜(Hypertext Transfer Protocol): HTTP는 클라이언트와 서버 간에 데이터를 전송하기 위한 프로토콜입니다. 요청-응답 모델을 기반으로 하며 클라이언트는 HTTP 요청을 보내고 서버는 HTTP 응답을 반환합니다. HTTP 프로토콜은 주로 웹 페이지와 리소스를 획득, 전송 및 표시하기 위해 웹 브라우저와 서버 간의 통신에 사용됩니다.

        웹 크롤링에서 HTTP(Hypertext Transfer Protocol) 프로토콜은 중요한 역할을 하며 클라이언트와 서버 간에 데이터를 전송하는 프로토콜입니다. 다음은 크롤러에서 HTTP 프로토콜의 몇 가지 주요 역할입니다.

  1. 웹페이지 콘텐츠 얻기: 크롤러는 HTTP 프로토콜을 사용하여 웹페이지 콘텐츠를 얻기 위해 서버에 요청을 보냅니다. GET 요청을 보내면 크롤러는 서버에 웹페이지의 HTML 코드를 반환하도록 요청할 수 있습니다.

  2. 요청 보내기: 크롤러는 GET, POST, PUT 등과 같은 다양한 HTTP 요청 방법을 사용하여 다양한 유형의 요청을 서버에 보낼 수 있습니다. GET 요청은 리소스를 가져오는 데 사용되고, POST 요청은 데이터 제출에 사용되며, PUT 요청은 리소스 업데이트에 사용됩니다.

  3. 매개변수 전달: 크롤러는 URL 매개변수 또는 HTTP 요청의 요청 본문 매개변수를 통해 쿼리 매개변수, 양식 데이터 등과 같은 다양한 데이터를 전달할 수 있습니다. 이는 특정 데이터를 스크랩하거나 검색을 수행할 때 유용합니다.

  4. 요청 헤더 설정: 크롤러는 HTTP 요청에 User-Agent, Referer, Cookie 등을 포함한 요청 헤더를 설정하여 다양한 유형의 브라우저 동작을 시뮬레이션하거나 웹사이트 크롤링 방지 조치를 우회할 수 있습니다.

  5. 응답 처리: 서버는 상태 코드, 응답 헤더 및 응답 본문이 포함된 HTTP 응답을 반환합니다. 크롤러는 상태 코드에 따라 요청의 성공 여부를 판단하고, 응답 헤더에서 정보를 얻고, 응답 본문에서 웹페이지 콘텐츠를 추출할 수 있습니다.

  6. HTML 콘텐츠 구문 분석: 크롤러는 HTML 콘텐츠를 구문 분석하여 필요한 정보를 추출합니다. 여기에는 일반적으로 웹페이지의 DOM 구조를 구문 분석하기 위해 Beautiful Soup와 같은 라이브러리를 사용하는 것이 포함됩니다.

  7. 시뮬레이션된 로그인: 액세스하기 위해 로그인이 필요한 웹사이트의 경우 크롤러는 로그인된 데이터를 얻기 위해 POST 요청을 시뮬레이션하여 로그인 양식을 제출할 수 있습니다.

  8. 크롤링 방지 처리: 크롤러는 액세스 빈도 제한, 인증 코드 등과 같은 웹사이트의 크롤링 방지 메커니즘을 접할 수 있습니다. 이 경우 크롤러는 요청 헤더를 적절하게 조정하고 프록시 IP 등을 사용하여 이러한 제한을 우회해야 합니다.

        간단히 말해서, HTTP 프로토콜은 크롤러 작업의 기본이며, 크롤러는 서버에 요청을 보내고 서버의 응답을 구문 분석함으로써 웹 페이지에서 필요한 데이터를 얻은 후 이를 처리, 분석 및 저장할 수 있습니다. 동시에 HTTP 프로토콜의 다양한 특성과 메커니즘을 이해하면 크롤러가 서버를 보다 효과적으로 작동하고 상호 작용하는 데 도움이 될 수 있습니다.

1.1 HTTP 요청 구조

         HTTP 요청은 다음 부분으로 구성됩니다.

  1. 요청 라인: 요청 방법, 대상 URL 및 프로토콜 버전이 포함됩니다.
  2. 요청 헤더: User-Agent, Accept, Cookie 등과 같은 요청에 대한 메타 정보를 포함합니다.
  3. 빈 줄: 요청 헤더와 요청 본문을 구분하는 데 사용됩니다.
  4. 요청 본문(Request Body): POST 등의 메소드를 사용할 때만 나타나며, 요청의 실제 데이터를 담고 있습니다.

1.2 HTTP 응답 구조

         HTTP 응답은 다음 부분으로 구성됩니다.

  1. 상태 표시줄: 프로토콜 버전, 상태 코드 및 상태 정보가 포함되어 있습니다.
  2. 응답 헤더: Content-Type, Content-Length 등과 같은 응답에 대한 메타 정보를 포함합니다.
  3. 빈 줄: 응답 헤더와 응답 본문을 구분하는 데 사용됩니다.
  4. 응답 본문: HTML 콘텐츠, JSON 데이터 등 응답의 실제 데이터를 포함합니다.

1.3 일반적인 HTTP 메소드

  1. GET: 서버에서 데이터를 가져와 URL에 데이터를 추가하는 데 사용됩니다.
  2. POST: 서버에 데이터를 제출하고 요청 본문에 데이터를 포함하는 데 사용됩니다.
  3. PUT: 요청 본문의 데이터를 포함하여 서버의 리소스를 업데이트하는 데 사용됩니다.
  4. DELETE: 서버에서 리소스를 삭제하고 URL에 데이터를 추가하는 데 사용됩니다.
  5. HEAD: GET과 유사하지만 리소스의 메타 정보를 얻는 데 사용되는 응답 헤더만 반환합니다.
  6. OPTIONS: 서버가 지원하는 HTTP 메소드를 쿼리하는 데 사용됩니다.

1.4 일반적인 HTTP 상태 코드:

  1. 200 OK: 요청이 성공했습니다.
  2. 201 Created: 리소스가 성공적으로 생성되었습니다.
  3. 400 Bad Request: 요청이 잘못되었습니다.
  4. 401 Unauthorized: 요청이 승인되지 않았습니다.
  5. 403 금지됨: 서버가 요청을 거부합니다.
  6. 404 찾을 수 없음: 요청한 리소스가 존재하지 않습니다.
  7. 500 내부 서버 오류: 내부 서버 오류입니다.

예: 다음은 Python http.server모듈을 사용하여 간단한 HTTP 서버를 생성하고 GET 및 POST 요청을 보내는 방법을 보여주는 간단한 예입니다. 이 예제를 터미널에서 실행한 다음 브라우저에서 해당 URL을 방문할 수 있습니다.

# 创建一个简单的HTTP服务器
# 在终端运行:python http_server_example.py
import http.server
import socketserver

class MyHandler(http.server.SimpleHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(b'Hello, GET request!')

    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        post_data = self.rfile.read(content_length)
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        response = f'Hello, POST request! Data: {post_data.decode()}'
        self.wfile.write(response.encode())

if __name__ == "__main__":
    PORT = 8000
    with socketserver.TCPServer(("", PORT), MyHandler) as httpd:
        print(f"Serving at port {PORT}")
        httpd.serve_forever()

        브라우저를 방문하면 http://localhost:8000서버 응답을 볼 수 있습니다. curl또는 requests라이브러리와 같은 도구를 사용하여 HTTP 요청을 보내고 응답을 받을 수 있습니다 .

2 HTTP 및 HTTPS

        HTTP(Hypertext Transfer Protocol)와 HTTPS(Hypertext Transfer Protocol Secure)는 모두 클라이언트와 서버 간에 데이터를 전송하기 위한 프로토콜이지만 둘 사이에는 중요한 보안 및 암호화 차이가 있습니다.

HTTP(Hypertext Transfer Protocol): HTTP는 웹 브라우저와 웹 서버 간에 통신하는 하이퍼텍스트 데이터를 전송하기 위한 프로토콜입니다. HTTP 프로토콜은 일반 텍스트로 전송됩니다. 즉, 전송된 데이터는 암호화되지 않으며 쉽게 도청되거나 변조될 수 있습니다. 일반적으로 통신에는 포트 80을 사용합니다 .

HTTPS(Hypertext Transfer Protocol Secure): HTTPS는 암호화 및 인증 메커니즘을 사용하여 전송된 데이터를 보호하는 보안 버전의 HTTP입니다. HTTPS에서는 데이터가 암호화되어 전송되므로 도청 및 변조가 더 어렵습니다. 암호화를 달성하기 위해 HTTPS는 SSL(Secure Sockets Layer) 또는 TLS(Transport Layer Security) 프로토콜을 사용합니다. HTTPS는 일반적으로 통신에 포트 443을 사용합니다 .

주요 차이점:

  1. 보안: 가장 눈에 띄는 차이점은 보안입니다. HTTP는 데이터를 암호화하지 않는 반면, HTTPS는 암호화를 통해 데이터 전송을 보호하여 데이터 기밀성과 무결성을 보장합니다.

  2. 암호화: HTTPS는 SSL 또는 TLS 프로토콜을 사용하여 데이터를 암호화하므로 전송 중에 데이터가 쉽게 도청되거나 변조될 수 없습니다. HTTP는 암호화를 제공하지 않으며 제3자가 데이터를 모니터링하고 수정할 수 있습니다.

  3. 인증: HTTPS는 암호화 프로세스 중에 서버를 인증하여 올바른 서버와 통신할 수도 있습니다. HTTP는 이 기능을 제공하지 않으며 중간자 공격에 취약할 수 있습니다.

  4. URL 접두사: HTTP URL은 "http://"로 시작하고, HTTPS URL은 "https://"로 시작합니다.

        HTTPS는 보안 측면에서 HTTP보다 우수하지만 암호화 및 암호 해독 프로세스와 관련된 일부 계산 오버헤드로 인해 HTTPS는 HTTP보다 약간 느립니다. 그러나 컴퓨팅 성능이 향상되면서 HTTPS의 성능 격차는 점차 좁아지고 있습니다.

        현대 웹에서는 사용자 개인 정보 보호와 데이터 보안이 매우 중요하므로 많은 웹 사이트가 사용자 데이터 보호를 보장하기 위해 HTTPS를 사용하도록 전환하고 있습니다.

3 HTTP 요청 프로세스

 3.1 HTTP 요청 프로세스

         HTTP 요청 프로세스에는 클라이언트가 서버에 요청을 보내고, 서버가 요청을 처리하고 응답을 반환하는 과정이 포함됩니다. 다음은 HTTP 요청의 기본 프로세스입니다.

  1. 클라이언트는 요청 메서드(GET, POST 등), 대상 URL, 요청 헤더, 요청 본문 등을 포함하여 HTTP 요청을 시작합니다.
  2. 서버는 요청을 수신 및 처리하고 요청 방법 및 URL에 따라 해당 리소스를 찾습니다.
  3. 서버는 상태 코드, 응답 헤더, 응답 본문 등을 포함하는 HTTP 응답을 생성합니다.
  4. 서버는 클라이언트에게 다시 응답을 보냅니다.
  5. 클라이언트는 응답을 수신하고 응답 콘텐츠를 처리합니다.

3.2 GET 요청과 POST 요청

         GET 및 POST는 서버에 요청을 보내는 데 사용되는 HTTP 요청 방법입니다.

  • GET 요청: 서버에서 데이터를 얻는 데 사용되며 URL을 통해 매개변수를 전달합니다. 요청 매개변수는 URL에 표시되며 데이터를 얻는 데 적합합니다.
  • POST 요청: 서버에 데이터를 제출하는 데 사용되며 요청 매개변수가 요청 본문에 전달되고 데이터 추가 및 수정과 같은 작업이 수행됩니다.

3.3 공통 요청 헤더

         HTTP 요청의 요청 헤더에는 사용자 에이전트, 콘텐츠 유형 등과 같은 요청에 대한 추가 정보가 포함되어 있습니다. 다음은 몇 가지 일반적인 요청 헤더입니다.

  • 사용자 에이전트: 클라이언트(일반적으로 브라우저)의 유형과 버전을 식별합니다.
  • Content-Type: 요청 본문의 미디어 유형(예: application/json, application/x-www-form-urlencoded 등)을 지정합니다.
  • 권한 부여: 인증을 위한 인증 자격 증명이 포함되어 있습니다.
  • Referer: CSRF 공격을 방지하는 데 사용되는 요청의 소스 URL을 나타냅니다.
  • 쿠키: 클라이언트의 쿠키 정보를 포함하며 세션 상태를 유지하는 데 사용됩니다.

3.4 HTTP 응답

         HTTP 응답에는 상태 코드, 응답 헤더, 응답 본문 등을 포함하여 서버의 요청 처리 결과가 포함됩니다.

  • 상태 코드(Status Code): 요청에 대한 서버의 처리 상태를 나타냅니다. 예를 들어 200 OK는 성공을 의미하고, 404 Not Found는 리소스를 찾을 수 없음을 의미합니다.
  • 응답 헤더: Content-Type, Server 등과 같은 응답에 대한 메타 정보를 포함합니다.
  • 응답 본문: 웹페이지의 HTML 콘텐츠, JSON 데이터 등 실제 응답 콘텐츠를 포함합니다.

다음은 Python requests라이브러리를 사용하여 GET 요청을 보낸 후 응답을 구문 분석하고 인쇄하는 방법을 보여주는 예입니다.

import requests

url = 'https://www.example.com'
response = requests.get(url)

print("Status Code:", response.status_code)
print("Headers:", response.headers)
print("Content:", response.text)

4 HTTP 요청 라이브러리는 공통 구문을 요청합니다.

  requestsHTTP 요청을 보내고 HTTP 응답을 처리하는 데 일반적으로 사용되는 Python 라이브러리입니다. requests다음은 라이브러리의 기본 사용법 예 입니다 .

먼저 라이브러리가 설치되어 있는지 확인하십시오 requests. 설치되어 있지 않은 경우 다음 명령을 사용하여 설치할 수 있습니다.

pip install requests

그런 다음 Python 코드에서 라이브러리를 가져와 requests이를 사용하여 HTTP 요청을 보내고 응답을 처리할 수 있습니다.

4.1 GET 요청 보내기

requests.get()다음 예제에서는 메서드를         사용하여 requests라이브러리를 사용하여 간단한 GET 요청을 보내고 응답을 처리하는 방법을 보여줍니다.

import requests

# 发送GET请求获取网页内容
url = 'https://www.baidu.com'  # 替换为您要访问的网页URL
response = requests.get(url)
response.encoding = 'utf-8'  # 指定编码为UTF-8
html_content = response.text

# 输出网页内容
print(html_content)

일반적인 구문:

GET 요청을 시작합니다 .

import requests

response = requests.get('https://www.example.com')
print(response.text)  # 输出响应内容

매개변수를 사용하여 GET 요청을 시작합니다 .

params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://www.example.com', params=params)

 요청 보내기 및 헤더 설정 :

headers = {'User-Agent': 'My User Agent'}
response = requests.get('https://www.example.com', headers=headers)

응답 상태 코드 가져오기 :

response = requests.get('https://www.example.com')
status_code = response.status_code

 응답 헤더 정보 가져오기 :

response = requests.get('https://www.example.com')
headers = response.headers

응답 콘텐츠 가져오기(바이트)

response = requests.get('https://www.example.com')
content = response.content

 응답 내용(텍스트) 가져오기

response = requests.get('https://www.example.com')
text = response.text

응답에서 JSON 데이터를 처리합니다 .

response = requests.get('https://api.example.com/data.json')
data = response.json()

 처리 시간 초과 :

try:
    response = requests.get('https://www.example.com', timeout=5)  # 5秒超时
except requests.Timeout:
    print("请求超时")

예외 처리 :

try:
    response = requests.get('https://www.example.com')
    response.raise_for_status()  # 抛出HTTP错误状态码异常
except requests.HTTPError as http_err:
    print(f"HTTP错误: {http_err}")
except requests.RequestException as req_err:
    print(f"请求异常: {req_err}")

 4.2 POST 요청 보내기

다음 예에서는 requests라이브러리를 사용하여 데이터와 함께 POST 요청을 보내는 방법을 보여줍니다.

import requests

# 登录URL和登录所需的数据
login_url = 'https://mail.163.com/'
login_data = {
    'username': 'your_username',  # 替换为您的邮箱用户名
    'password': 'your_password'   # 替换为您的邮箱密码
}

# 创建会话对象
session = requests.Session()

# 发送POST请求模拟登录
response = session.post(login_url, data=login_data)

# 检查登录是否成功
if '退出' in response.text:
    print("Login successful.")
else:
    print("Login failed.")

        이 샘플 코드에서는 requests.Session()세션 개체를 생성하여 여러 요청에 걸쳐 세션 상태를 유지할 수 있습니다. 그런 다음 session.post()이 메서드를 사용하여 POST 요청을 보내 로그인을 시뮬레이션합니다. login_url이 예에서는 데모로 사서함 163의 로그인 페이지를 사용합니다. 및 login_data로그인에 필요한 실제 로그인 URL과 데이터로 바꿔야 합니다 .

        이는 단순한 예일 뿐이며 실제 웹사이트에는 인증 코드, 동적 토큰 등과 같은 더 복잡한 로그인 로직이 있을 수 있습니다. 동시에 크롤러가 웹사이트를 방문할 때 귀하의 행동이 적법하고 규정을 준수하는지 확인하기 위해 웹사이트의 규칙과 정책을 준수해야 합니다.

일반적인 구문:

POST 요청 보내기 

data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://www.example.com', data=data)

 JSON 데이터 전송을 위한 POST 요청 :

import json

data = {'key1': 'value1', 'key2': 'value2'}
headers = {'Content-Type': 'application/json'}
response = requests.post('https://www.example.com', data=json.dumps(data), headers=headers)

4.3 요청 매개변수 및 헤더

requests라이브러리를         사용하여 HTTP 요청을 보낼 때 요청 매개변수와 헤더를 통해 추가 정보를 전달할 수 있습니다. 요청 매개변수는 일반적으로 GET 요청이나 쿼리 매개변수가 있는 요청에 사용되는 반면, 요청 헤더는 사용자 에이전트, 쿠키 등과 같은 다양한 정보를 전달하는 데 사용됩니다. 다음은 요청 매개변수 및 헤더에 대한 샘플 코드입니다.

import requests

# 请求参数示例
params = {
    'key1': 'value1',
    'key2': 'value2'
}

# 请求头部示例
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Referer': 'https://www.baiud.com',
    'Cookie': 'your_cookie_data'
}

# 发送GET请求,带参数和头部
url = 'https://www.baidu.com'  # 替换为您要访问的网页URL
response = requests.get(url, params=params, headers=headers)

# 输出响应内容
print(response.text)

4.4 인코딩 형식

requests라이브러리를 사용하여 HTTP 요청을 보낼 때 인코딩 형식(문자 집합 또는 문자 인코딩이라고도 함)은 응답 콘텐츠를 디코딩하는 데 사용되는 규칙을 나타냅니다         . requests라이브러리는 응답의 인코딩을 자동으로 식별하고 형식을 지정하려고 시도하지만 때로는 응답 콘텐츠가 올바르게 구문 분석되도록 인코딩을 수동으로 설정해야 할 수도 있습니다.

다음은 인코딩 형식에 대한 몇 가지 설명과 예입니다.

  1. 인코딩 자동 식별: 기본적으로 라이브러리는 requests응답 헤더의 필드를 기반으로 Content-Type응답의 인코딩 형식을 자동으로 식별하려고 시도합니다 . 예를 들어 Content-Type포함된 charset=utf-8경우 requests응답 콘텐츠를 디코딩하는 데 UTF-8 인코딩이 사용됩니다.

  2. 인코딩 수동 설정: 자동으로 인식된 인코딩이 올바르지 않은 경우 인코딩을 수동으로 설정하여 왜곡된 문제를 해결할 수 있습니다. 이를 적절한 인코딩으로 설정 하면 response.encoding응답 콘텐츠가 올바르게 디코딩되도록 할 수 있습니다.

다음은 응답 콘텐츠를 올바르게 구문 분석하기 위해 인코딩 형식을 수동으로 지정하는 방법을 보여주는 예입니다.

import requests

# 发送GET请求获取网页内容
url = 'https://www.baidu.com'  # 替换为您要访问的网页URL
response = requests.get(url)
response.encoding = 'utf-8'  # 手动设置编码为UTF-8

# 输出响应内容
print(response.text)

4.5 고급 작업 요청 - 파일 업로드

    requests라이브러리를 사용하면 파일 업로드 요청을 보낼 수 있습니다. 즉, 요청의 일부로 파일을 서버에 보낼 수 있습니다. 이는 파일 업로드 기능이 포함된 API와 상호작용할 때 유용합니다.

파일 업로드 요청을 보내려면 업로드할 파일을 매개변수로 전달하는 requests.post()메소드를         사용할 수 있습니다 . 인수는 키가 필드 이름이고 값이 파일 객체인 사전이어야 합니다. 파일 객체는 함수를 사용하여 생성할 수 있습니다.filesfilesopen()

다음은 로컬 파일을 서버에 업로드한다고 가정하는 간단한 파일 업로드 예입니다.

import requests

# 目标URL和文件路径
url = 'https://www.example.com/upload'  # 替换为实际的上传URL
file_path = 'path/to/your/file.txt'  # 替换为实际的文件路径

# 创建文件对象
with open(file_path, 'rb') as file:
    files = {'file': file}  # 'file'是字段名称,可以根据实际情况更改

    # 发送文件上传请求
    response = requests.post(url, files=files)

# 输出响应内容
print(response.text)

이 예에서는 함수를 사용하여 open()바이너리 모드로 파일을 연 다음 파일 개체를 files인수로 전달합니다. files사전 에서 키는 서버가 수신할 것으로 예상되는 필드 이름이고 값은 파일 개체입니다. 'file'실제 필드 이름으로 바꿔야 합니다 .

실제 서버에는 인증, 토큰 등과 같은 다른 추가 필드나 매개변수가 필요할 수 있습니다. 실제 상황에 따라 코드를 조정해야 합니다.

4.6 고급 작업 요청 - 쿠키 가져오기

requests라이브러리         에서는 response.cookies속성을 통해 서버로부터 받은 쿠키 정보를 얻을 수 있습니다. 쿠키는 클라이언트와 서버 간의 상태 정보를 저장하기 위해 서버가 HTTP 응답 헤더에 설정한 일부 키-값 쌍입니다. 다음은 쿠키 획득에 대한 자세한 지침과 예입니다.

import requests

# 发送GET请求获取网页内容
url = 'https://www.example.com'  # 替换为您要访问的网页URL
response = requests.get(url)

# 获取响应中的Cookie信息
cookies = response.cookies

# 打印Cookie信息
for cookie in cookies:
    print("Name:", cookie.name)
    print("Value:", cookie.value)

        이 예에서는 메서드를 사용하여 requests.get()GET 요청을 보내고 response.cookies속성을 사용하여 응답에서 쿠키 정보를 가져옵니다. 각 쿠키의 이름과 값을 얻기 위해 반복할 수 있는 객체를 response.cookies반환합니다 .RequestsCookieJar

        응답에 여러 쿠키가 포함될 수 있으며 각 쿠키는 키-값 쌍입니다. 세션에 저장하고 다음 요청으로 전송하는 등 실제 필요에 따라 이러한 쿠키 정보를 추가로 처리할 수 있습니다.

또한 쿠키를 수동으로 설정하고 후속 요청에 사용하려면 요청 헤더에 필드를 추가하면 됩니다 Cookie. 예를 들어:

import requests

# 设置Cookie
cookies = {'cookie_name': 'cookie_value'}

# 发送GET请求并添加Cookie到请求头部
url = 'https://www.example.com'  # 替换为您要访问的网页URL
response = requests.get(url, cookies=cookies)

# 处理响应...

 이 예에서는 매개변수를 사용하여 cookies요청에 전송할 쿠키 정보를 추가합니다. 이는 쿠키를 수동으로 처리해야 하는 상황에 유용합니다.

4.7 고급 작업 요청 - 인증서 확인

requests라이브러리 에서는 verify매개변수를 통해 SSL 인증서 검증 여부를 제어할 수 있습니다. SSL 인증서 확인은 서버와의 암호화된 보안 연결을 보장하는 데 사용되는 프로세스입니다. 기본적으로 requests라이브러리는 SSL 인증서를 확인하지만 verify확인을 비활성화하거나 매개변수를 설정하여 사용자 지정 인증서를 제공할 수 있습니다.

다음은 인증서 확인에 대한 자세한 지침과 예입니다.

  1. 기본 유효성 검사: 기본적으로 requests라이브러리는 SSL 인증서의 유효성을 검사합니다. 서버와의 통신을 암호화하는 것이 안전한 방법입니다. 예를 들어:

import requests

# 发送GET请求
url = 'https://www.example.com'  # 替换为您要访问的网页URL
response = requests.get(url)

# 处理响应...

유효성 검사 비활성화: 경우에 따라 자체 서명된 인증서에 액세스하는 서버와 같은 인증서 유효성 검사를 비활성화할 수 있습니다. verify매개변수를 다음으로 설정하여 False유효성 검사를 비활성화 할 수 있습니다 .

import requests

# 发送GET请求并禁用证书验证
url = 'https://www.example.com'  # 替换为您要访问的网页URL
response = requests.get(url, verify=False)

# 处理响应...

 인증서 유효성 검사를 비활성화하면 보안이 저하되므로 위험을 이해한 후에만 사용해야 합니다.

사용자 정의 인증서:verify 사용자 정의 인증서를 사용하여 서버에 연결해야 하는 경우 매개변수 값 으로 인증서 파일의 경로를 제공할 수 있습니다 .

import requests

# 发送GET请求并使用自定义证书进行验证
url = 'https://www.example.com'  # 替换为您要访问的网页URL
response = requests.get(url, verify='/path/to/custom/certificate.pem')

# 处理响应...

 이 예에서는 /path/to/custom/certificate.pem사용자 정의 인증서 파일의 경로입니다.

 데이터 보안을 보호하려면 실제 응용 프로그램에서는 인증서 확인을 켜두는 것이 좋습니다. 특정 상황에서 인증서 유효성 검사를 비활성화하거나 사용자 정의해야 하는 경우 가능한 보안 위험을 이해하고 적절한 조치를 취해야 합니다.

5 전투

요청 라이브러리를 이용해 2023년 대학 입시 소식의 제목과 링크를 받아보세요

import requests
from bs4 import BeautifulSoup
import time

def fetch_news_by_page(page_number):
    keyword = "2023年高考录取"
    results_per_page = 10
    pn = (page_number - 1) * results_per_page

    # 构造搜索的URL,包括搜索关键词和分页参数
    url = f"https://www.baidu.com/s?wd={keyword}&pn={pn}"
    
    # 添加头部信息模拟浏览器请求
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36",
        "Referer": "https://www.baidu.com/"
    }

    # 发送请求
    response = requests.get(url, headers=headers)

    # 如果请求成功
    if response.status_code == 200:
        # 解析网页内容
        soup = BeautifulSoup(response.text, 'html.parser')
        news_list = []

        # 找到所有的新闻标题和链接
        for news in soup.find_all('div', class_='result'):
            title_elem = news.find('h3', class_='t')
            title = title_elem.get_text() if title_elem else None

            link_elem = news.find('a')
            link = link_elem['href'] if link_elem and 'href' in link_elem.attrs else None

            if title and link:
                news_list.append({"title": title, "link": link})

        return news_list
    else:
        print("请求失败,状态码:", response.status_code)
        return None

if __name__ == "__main__":
    for page in range(1, 4):  # 输出前三页
        print(f"第{page}页的搜索结果:")
        news = fetch_news_by_page(page)
        if news:
            for idx, item in enumerate(news, start=1):
                print(f"{idx}. {item['title']}")
                print(f"   Link: {item['link']}")
                print("=" * 50)
        else:
            print("没有搜索结果。")
        time.sleep(2)  # 添加延时,模拟人类浏览行为

출력은 다음과 같습니다.

         이 코드는 Python 웹 크롤러로, Baidu 검색 엔진에서 "2023년 대학 입시 입학"에 대한 뉴스 헤드라인과 링크를 가져오는 데 사용됩니다.

  1. 먼저 요청 라이브러리(HTTP 요청 전송용), BeautifulSoup 라이브러리(HTML 문서 구문 분석용) 및 시간 라이브러리(프로그램 실행 일시 중지용)를 가져옵니다.

  2. 먼저, 가져올 페이지 수를 나타내는 page_number 매개변수를 받는 fetch_news_by_page() 함수를 정의합니다.

  3. 함수 내에서 먼저 검색 키워드 "2023 대학 입시 입학"과 페이지당 표시되는 결과 수 results_per_page를 정의합니다.

  4. 그런 다음 검색 키워드 및 페이지 매김 매개변수를 포함하여 Baidu 검색 URL이 구성됩니다. 여기서 f-문자열 형식화 문자열은 page_number 및 results_per_page를 URL에 삽입하는 데 사용됩니다.

  5. 다음으로, 요청을 보내는 브라우저를 시뮬레이션하는 데 사용되는 User-Agent 및 Referer 두 필드를 포함하는 헤더 사전이 정의됩니다.

  6. GET 요청을 보내려면 request.get() 함수를 사용하고 헤더 사전을 매개변수로 전달하세요.

  7. 요청이 성공하면(즉, HTTP 상태 코드가 200) 반환된 HTML 문서는 BeautifulSoup을 사용하여 구문 분석됩니다.

  8. 구문 분석된 HTML 문서에서 모든 뉴스 헤드라인과 링크를 찾습니다. 여기서는 find_all() 함수를 사용하여 'result' 클래스가 있는 모든 div 요소를 찾은 다음 h3 태그(클래스는 't')와 각 div 요소의 태그를 찾습니다.

  9. 제목과 링크가 발견되면 news_list 목록에 추가됩니다.

  10. 마지막으로 요청이 실패하면 실패 상태 코드를 인쇄하고 None을 반환합니다.

  11. 메인 프로그램에서 fetch_news_by_page() 함수를 호출하여 처음 세 페이지의 검색 결과를 탐색하고 인쇄합니다. 빈번한 네트워크 요청을 피하기 위해 각 인쇄 결과 후에 2초 동안 일시 중지됩니다.

이전의:

[파이썬 능숙 100일] Day41: Python 웹 크롤러 개발_크롤러 기본 소개_LeapMay의 블로그-CSDN 블로그 웹 크롤러(Web Crawler)는 인터넷에서 정보를 검색하고 가져오는 자동화된 프로그램입니다. 크롤러는 웹페이지를 탐색하고, 데이터를 수집하고, 추가 처리 및 분석을 위해 정보를 추출할 수 있습니다. 웹 크롤러는 검색 엔진, 데이터 수집, 정보 모니터링 및 기타 분야에서 중요한 역할을 합니다. 1.1 작동 방식 초기 URL 선택: 크롤러는 일반적으로 크롤링을 시작하려는 웹사이트의 홈페이지 또는 기타 페이지인 하나 이상의 초기 URL로 시작합니다. HTTP 요청 보내기: 각 초기 URL에 대해 크롤러는 웹페이지 콘텐츠를 가져오기 위해 HTTP 요청을 보냅니다. https://blog.csdn.net/qq_35831906/article/details/132377113?spm=1001.2014.3001.5502

추천

출처blog.csdn.net/qq_35831906/article/details/132381253