技術共有

Python クローラーの原則と 3 つの小さなケース (ソース コード)

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. 爬虫類原理

Web クローラーは、Web コンテンツを自動的に取得するために使用されるプログラムです。ユーザーが Web ページを閲覧するプロセスをシミュレートし、HTTP リクエストを送信して Web ページのソース コードを取得し、解析および抽出テクノロジを使用して必要なデータを取得します。

1. HTTP リクエストとレスポンスのプロセス

クローラーは、URL、リクエスト メソッド (GET または POST など)、リクエスト ヘッダー (Headers) などを含む HTTP リクエストをターゲット Web サイトに送信します。サーバーはリクエストを受信すると、ステータス コード、レスポンス ヘッダー、およびレスポンス本文 (Web ページのコンテンツ) を含む HTTP レスポンスを返します。

2. 一般的に使用されるクローラーテクノロジー

  • リクエストライブラリ:例えばrequestsそしてaiohttp、HTTP リクエストの送信に使用されます。
  • 解析ライブラリ:例えばBeautifulSouplxmlそしてPyQuery、Web ページのコンテンツを解析するために使用されます。
  • リポジトリ:例えばpandasそしてSQLite、クロールされたデータを保存するために使用されます。
  • 非同期ライブラリ:例えばasyncioそしてaiohttp、非同期クローラーを実装し、クロール効率を向上させるために使用されます。

2. Python クローラーで一般的に使用されるライブラリ

1. ライブラリをリクエストする

  • リクエスト: HTTP 接続の永続性と接続プーリング、SSL 証明書の検証、Cookie などをサポートするシンプルで強力な HTTP ライブラリ。
  • エイオhttp: asyncio に基づく非同期 HTTP ライブラリ。同時実行性の高いクローラ シナリオに適しています。

2. ライブラリの解析

  • 美しいスープ: HTML および XML を解析するためのライブラリ。使いやすく、複数のパーサーをサポートしています。
  • xml の: XPath および CSS セレクターをサポートする効率的な XML および HTML 解析ライブラリ。
  • パイクエリ: jQuery と同様の構文を備えた使いやすい Python バージョンの jQuery。

3. リポジトリ

  • パンダ: データ構造とデータ分析ツールを提供し、複数のファイル形式をサポートする強力なデータ分析ライブラリ。
  • SQLite: SQL クエリをサポートし、小規模なクローラー プロジェクトに適した軽量のデータベース。

次に、Python クローラーの 7 つの小さなケースを使用して、Python クローラーの基本知識をよりよく学び、理解できるようにします。以下は、各ケースの概要とソース コードです。

ケース 1: トップ 250 の Douban 映画をクロールする

このケースでは、BeautifulSoupライブラリは、トップ 250 の Douban 映画から映画のタイトル、評価、レビュアーの数などの情報をクロールし、この情報を CSV ファイルに保存します。

  1. import requests
  2. from bs4 import BeautifulSoup
  3. import csv
  4. # 请求URL
  5. url = 'https://movie.douban.com/top250'
  6. # 请求头部
  7. headers = {
  8. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
  9. }
  10. # 解析页面函数
  11. def parse_html(html):
  12. soup = BeautifulSoup(html, 'lxml')
  13. movie_list = soup.find('ol', class_='grid_view').find_all('li')
  14. for movie in movie_list:
  15. title = movie.find('div', class_='hd').find('span', class_='title').get_text()
  16. rating_num = movie.find('div', class_='star').find('span', class_='rating_num').get_text()
  17. comment_num = movie.find('div', class_='star').find_all('span')[-1].get_text()
  18. writer.writerow([title, rating_num, comment_num])
  19. # 保存数据函数
  20. def save_data():
  21. f = open('douban_movie_top250.csv', 'a', newline='', encoding='utf-8-sig')
  22. global writer
  23. writer = csv.writer(f)
  24. writer.writerow(['电影名称', '评分', '评价人数'])
  25. for i in range(10):
  26. url = 'https://movie.douban.com/top250?start=' str(i * 25) '