目次
リクエストライブラリを使用して、2023年大学入試ニュースのタイトルとリンクを取得します
1 HTTPプロトコル
HTTP プロトコル (ハイパーテキスト転送プロトコル): HTTP は、クライアントとサーバー間でデータを転送するためのプロトコルです。これは要求応答モデルに基づいており、クライアントは HTTP 要求を送信し、サーバーは HTTP 応答を返します。HTTP プロトコルは主に、Web ページとリソースを取得、送信、表示するための Web ブラウザとサーバー間の通信に使用されます。
Web クローリングでは、HTTP (Hypertext Transfer Protocol) プロトコルが重要な役割を果たします。これは、クライアントとサーバーの間でデータを転送するためのプロトコルです。クローラーにおける HTTP プロトコルの重要な役割を以下に示します。
Web ページのコンテンツの取得:クローラーは、HTTP プロトコルを使用してサーバーにリクエストを送信し、Web ページのコンテンツを取得します。GET リクエストを送信することで、クローラーはサーバーに Web ページの HTML コードを返すように要求できます。
リクエストの送信:クローラーは、GET、POST、PUT などのさまざまな HTTP リクエスト メソッドを使用して、さまざまな種類のリクエストをサーバーに送信できます。GET リクエストはリソースの取得に使用され、POST リクエストはデータの送信に使用され、PUT リクエストはリソースの更新に使用されます。
パラメータの受け渡し:クローラーは、URL パラメータまたは HTTP リクエストのリクエスト本文パラメータを介して、クエリ パラメータ、フォーム データなどのさまざまなデータを渡すことができます。これは、特定のデータをスクレイピングしたり、検索を実行したりするときに役立ちます。
リクエスト ヘッダーの設定:クローラーは、ユーザー エージェント、リファラー、Cookie などを含む HTTP リクエストにリクエスト ヘッダーを設定して、ブラウザーのさまざまな種類の動作をシミュレートしたり、Web サイトのクロール防止対策をバイパスしたりできます。
応答の処理:サーバーは、ステータス コード、応答ヘッダー、および応答本文を含む HTTP 応答を返します。クローラーはステータスコードに基づいてリクエストが成功したかどうかを判断し、レスポンスヘッダーから情報を取得し、レスポンスボディからWebページの内容を抽出します。
HTML コンテンツの解析:クローラーは、HTML コンテンツを解析して必要な情報を抽出します。これには通常、Beautiful Soup などのライブラリを使用して Web ページの DOM 構造を解析することが含まれます。
シミュレートされたログイン:アクセスするためにログインが必要な Web サイトの場合、クローラーは POST リクエストをシミュレートしてログイン フォームを送信し、ログイン データを取得できます。
アンチクローリング処理:クローラーは、アクセス頻度の制限や検証コードなど、Web サイトのアンチクローリング メカニズムに遭遇する可能性があります。この場合、クローラはリクエスト ヘッダーを適切に調整し、プロキシ IP を使用するなどして、これらの制限を回避する必要があります。
つまり、HTTP プロトコルはクローラーの動作の基礎であり、サーバーにリクエストを送信し、サーバーの応答を解析することで、クローラーは Web ページから必要なデータを取得し、それを処理、分析、保存できます。同時に、HTTP プロトコルのさまざまな特性とメカニズムを理解すると、クローラーがより効果的に動作し、サーバーと対話するのに役立ちます。
1.1 HTTPリクエストの構造
HTTP リクエストは次の部分で構成されます。
- リクエスト行:リクエストメソッド、ターゲット URL、プロトコルバージョンが含まれます。
- リクエストヘッダー: User-Agent、Accept、Cookie などのリクエストに関するメタ情報が含まれます。
- 空行:リクエストヘッダーとリクエストボディを区切るために使用されます。
- リクエストボディ (Request Body): POST などのメソッドを使用する場合にのみ表示され、リクエストの実際のデータが含まれます。
1.2 HTTPレスポンスの構造
HTTP 応答は次の部分で構成されます。
- ステータス行:プロトコルのバージョン、ステータス コード、およびステータス情報が含まれます。
- 応答ヘッダー: Content-Type、Content-Length などの応答に関するメタ情報が含まれます。
- 空行:応答ヘッダーと応答本文を区切るために使用されます。
- 応答本文: HTML コンテンツ、JSON データなどの応答の実際のデータが含まれます。
1.3 一般的な HTTP メソッド
- GET:サーバーからデータを取得し、URL にデータを追加するために使用されます。
- POST:データをサーバーに送信し、リクエスト本文にデータを含めるために使用されます。
- PUT:リクエスト本文のデータを含む、サーバー上のリソースを更新するために使用されます。
- DELETE:サーバーからリソースを削除し、URL にデータを追加するために使用されます。
- HEAD: GET と似ていますが、リソースのメタ情報を取得するために使用される応答ヘッダーのみを返します。
- オプション:サーバーによってサポートされている HTTP メソッドをクエリするために使用されます。
1.4 一般的な HTTP ステータス コード:
- 200 OK:リクエストは成功しました。
- 201 Created:リソースは正常に作成されました。
- 400 Bad Request:リクエストが間違っています。
- 401 Unauthorized:リクエストは不正です。
- 403 Forbidden:サーバーはリクエストを拒否しました。
- 404 Not Found:要求されたリソースは存在しません。
- 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 (ハイパーテキスト転送プロトコル) と HTTPS (ハイパーテキスト転送プロトコル セキュア) はどちらもクライアントとサーバー間でデータを転送するためのプロトコルですが、両者の間にはセキュリティと暗号化に関して重要な違いがあります。
HTTP (ハイパーテキスト転送プロトコル): HTTP は、Web ブラウザと Web サーバー間で通信するハイパーテキスト データを転送するためのプロトコルです。HTTP プロトコルはクリア テキストで送信されます。つまり、送信データは暗号化されていないため、簡単に盗聴され、改ざんされる可能性があります。通常、通信にはポート 80 を使用します。
HTTPS (Hypertext Transfer Protocol Secure): HTTPS は、暗号化および認証メカニズムを使用して送信データを保護する HTTP の安全なバージョンです。HTTPS ではデータが暗号化されて送信されるため、盗聴や改ざんがより困難になります。暗号化を実現するために、HTTPS は SSL (Secure Sockets Layer) または TLS (Transport Layer Security) プロトコルを使用します。HTTPS は通常、通信にポート 443 を使用します。
主な違い:
セキュリティ:最も顕著な違いはセキュリティです。HTTP はデータを暗号化しませんが、HTTPS は暗号化によってデータ送信を保護し、データの機密性と整合性を確保します。
暗号化: HTTPS は、SSL または TLS プロトコルを使用してデータを暗号化し、送信中にデータが簡単に盗聴されたり改ざんされたりすることを防ぎます。HTTP は暗号化を提供しないため、データは第三者によって監視および変更される可能性があります。
認証: HTTPS は、暗号化プロセス中にサーバーを認証して、正しいサーバーと通信していることを確認することもできます。HTTP はこの機能を提供していないため、中間者攻撃に対して脆弱になる可能性があります。
URL プレフィックス: HTTP URL は「http://」で始まり、HTTPS URL は「https://」で始まります。
HTTPS はセキュリティの点では HTTP よりも優れていますが、暗号化と復号化のプロセスに多少の計算オーバーヘッドがかかるため、HTTPS は HTTP よりわずかに遅くなります。ただし、コンピューティング能力の向上に伴い、HTTPS のパフォーマンスの差は徐々に縮まってきています。
現代の Web では、ユーザーのプライバシーとデータ セキュリティの保護が非常に重要であるため、多くの Web サイトがユーザー データの保護を確保するために HTTPS の使用に切り替えています。
3 HTTPリクエスト処理
3.1 HTTPリクエストの処理
HTTP リクエスト プロセスには、クライアントがサーバーにリクエストを送信し、サーバーがリクエストを処理して応答を返すことが含まれます。HTTP リクエストの基本的なプロセスは次のとおりです。
- クライアントは、リクエスト メソッド (GET、POST など)、ターゲット URL、リクエスト ヘッダー、リクエスト本文などを含む HTTP リクエストを開始します。
- サーバーはリクエストを受信して処理し、リクエストのメソッドと URL に従って対応するリソースを見つけます。
- サーバーは、ステータス コード、応答ヘッダー、応答本文などを含む HTTP 応答を生成します。
- サーバーはクライアントに応答を返します。
- クライアントは応答を受信し、応答の内容を処理します。
3.2 GETリクエストとPOSTリクエスト
GET および POST は、サーバーにリクエストを送信するために使用される HTTP リクエスト メソッドです。
- GET リクエスト: URL 経由でパラメータを渡し、サーバーからデータを取得するために使用されます。リクエスト パラメータは URL に表示され、データの取得に適しています。
- POST リクエスト:サーバーにデータを送信するために使用され、リクエスト パラメーターがリクエスト本文に渡され、データの追加や変更などの操作が実行されます。
3.3 一般的なリクエストヘッダー
HTTP リクエストのリクエスト ヘッダーには、ユーザー エージェント、コンテンツ タイプなど、リクエストに関する追加情報が含まれています。一般的なリクエスト ヘッダーをいくつか示します。
- ユーザーエージェント:クライアント (通常はブラウザ) のタイプとバージョンを識別します。
- Content-Type:リクエスト本文のメディア タイプ (application/json、application/x-www-form-urlencoded など) を指定します。
- 認可:認証のための認証資格情報が含まれます。
- リファラー: CSRF 攻撃を防ぐために使用されるリクエストのソース URL を示します。
- Cookie:クライアントの Cookie 情報が含まれており、セッション状態を維持するために使用されます。
3.4 HTTPレスポンス
HTTP レスポンスには、ステータス コード、レスポンス ヘッダー、レスポンス ボディなど、サーバーによるリクエストの処理結果が含まれます。
- ステータス コード (ステータス コード):リクエストに対するサーバーの処理ステータスを示します。たとえば、200 OK は成功を意味し、404 Not Found はリソースが見つからないことを意味します。
- 応答ヘッダー: Content-Type、サーバーなどの応答に関するメタ情報が含まれます。
- 応答本文: Web ページの HTML コンテンツ、JSON データなどの実際の応答コンテンツが含まれます。
以下は、Pythonrequests
ライブラリを使用して 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 リクエスト ライブラリのリクエストの共通構文
requests
は、HTTP リクエストの送信と HTTP レスポンスの処理に一般的に使用される Python ライブラリです。requests
ライブラリの基本的な使用例を次に示します。
まず、ライブラリがインストールされていることを確認してくださいrequests
。インストールされていない場合は、次のコマンドを使用してインストールできます。
pip install requests
その後、ライブラリを Python コードにインポートしrequests
、それを使用して HTTP リクエストを送信し、応答を処理できます。
4.1 GETリクエストの送信
次の例は、このメソッドを使用して、ライブラリrequests.get()
を使用して単純な GET リクエストを送信し、応答を処理する方法を示しています。requests
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 リクエストを送信し、ログインをシミュレートします。この例では、メールボックス 163 のログイン ページをデモンストレーションとして使用します。実際のログイン URL とログインに必要なデータにlogin_url
置き換える必要があります。login_data
これは単なる例であり、実際の Web サイトには確認コードや動的トークンなどのより複雑なログイン ロジックが含まれる場合があることに注意してください。同時に、クローラーが Web サイトにアクセスするときは、ユーザーの行動が合法で準拠していることを確認するために、Web サイトのルールとポリシーに従う必要があります。
一般的な構文:
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 リクエストまたはクエリ パラメーターを含むリクエストに使用され、リクエスト ヘッダーはユーザー エージェント、Cookie などのさまざまな情報を渡すために使用されます。以下はリクエストパラメータとヘッダーに関するサンプルコードです。
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
ライブラリは、応答のエンコーディングを自動的に識別して書式設定しようとしますが、場合によっては、応答のコンテンツが正しく解析されるようにエンコーディングを手動で設定する必要があります。
エンコード形式の説明と例をいくつか示します。
-
エンコーディングを自動的に識別する:デフォルトでは、ライブラリは
requests
応答ヘッダーのフィールドに基づいてContent-Type
応答のエンコーディング形式を自動的に識別しようとします。たとえば、Content-Type
これが含まれている場合charset=utf-8
、requests
応答コンテンツのデコードに UTF-8 エンコーディングが使用されます。 -
エンコードを手動で設定する:自動的に認識されたエンコードが正しくない場合は、エンコードを手動で設定して文字化けの問題を解決できます。これを適切なエンコーディングに設定することで
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()
メソッドを使用して、files
アップロードするファイルをパラメータとして渡します。files
引数は、キーがフィールド名、値がファイル オブジェクトである辞書である必要があります。ファイル オブジェクトはopen()
関数を使用して作成できます。
以下は、ローカル ファイルをサーバーにアップロードすることを想定した、単純なファイル アップロードの例です。
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 高度な操作のリクエスト - Cookie の取得
requests
ライブラリ では、response.cookies
プロパティを通じてサーバーから受信したCookie情報を取得できます。Cookie は、クライアントとサーバー間の状態情報を保存するためにサーバーによって HTTP 応答ヘッダーに設定されるキーと値のペアです。以下は、Cookie を取得するための詳細な手順と例です。
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
属性を使用して応答内の Cookie 情報を取得します。反復処理して各 Cookie の名前と値を取得できるオブジェクトをresponse.cookies
返します。RequestsCookieJar
応答には複数の Cookie が含まれる場合があり、各 Cookie はキーと値のペアであることに注意してください。これらの Cookie 情報は、セッションに保存したり、次のリクエストに送信したりするなど、実際のニーズに応じてさらに処理できます。
また、Cookie を手動で設定して後続のリクエストで使用したい場合は、リクエスト ヘッダーにフィールドを追加することで実行できますCookie
。例えば:
import requests
# 设置Cookie
cookies = {'cookie_name': 'cookie_value'}
# 发送GET请求并添加Cookie到请求头部
url = 'https://www.example.com' # 替换为您要访问的网页URL
response = requests.get(url, cookies=cookies)
# 处理响应...
この例では、
cookies
パラメーターを使用して、リクエストに送信される Cookie 情報を追加します。これは、Cookie を手動で処理する必要がある場合に役立ちます。
4.7 高度な操作のリクエスト - 証明書の検証
requests
ライブラリでは、verify
パラメータを使用して SSL 証明書を検証するかどうかを制御できます。SSL 証明書の検証は、サーバーとの安全な暗号化された接続を保証するために使用されるプロセスです。デフォルトでは、requests
ライブラリは SSL 証明書を検証しますが、verify
パラメータを設定することで検証を無効にしたり、カスタム証明書を提供したりすることができます。
以下に、証明書検証の詳細な手順と例を示します。
-
デフォルトの検証:デフォルトでは、
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 Web クローラーで、Baidu 検索エンジンから「2023 年大学入学試験合格」に関するニュースの見出しとリンクを取得するために使用されます。
まず、requests ライブラリ (HTTP リクエストの送信用)、BeautifulSoup ライブラリ (HTML ドキュメントの解析用)、time ライブラリ (プログラムの実行の一時停止用) をインポートします。
まず、関数 fetch_news_by_page() を定義します。この関数は、フェッチするページ数を示すパラメーター page_number を受け取ります。
関数内では、まず検索キーワード「2023年 大学受験 入学」と、1ページあたりに表示する結果数result_per_pageを定義します。
次に、検索キーワードとページネーション パラメータを含む Baidu 検索 URL が構築されます。ここでは、f-string フォーマット文字列を使用して、page_number と results_per_page を URL に挿入します。
次に、ヘッダー ディクショナリが定義されます。これには、リクエストを送信するブラウザをシミュレートするために使用される、User-Agent および Referer の 2 つのフィールドが含まれます。
request.get() 関数を使用して GET リクエストを送信し、ヘッダー ディクショナリをパラメータとして渡します。
リクエストが成功した場合 (つまり、HTTP ステータス コードが 200 の場合)、返された HTML ドキュメントは BeautifulSoup を使用して解析されます。
解析された HTML ドキュメントで、すべてのニュースの見出しとリンクを見つけます。ここでは、find_all() 関数を使用して、クラス 'result' を持つすべての div 要素を検索し、h3 タグ (クラスは 't') と各 div 要素内のタグを検索します。
タイトルとリンクが見つかった場合は、news_list リストに追加されます。
最後に、リクエストが失敗した場合は、失敗したステータス コードを出力し、None を返します。
メイン プログラムで、 fetch_news_by_page() 関数を呼び出して、最初の 3 ページの検索結果を調べて出力します。頻繁なネットワーク要求を回避するために、各印刷結果の後に 2 秒の一時停止があります。