序文
この記事のテキストと写真はインターネットからのものであり、学習とコミュニケーションのみを目的としています。これらは商用目的ではありません。ご不明な点がございましたら、処理についてお問い合わせください。
PS:Pythonの学習教材が必要な場合は、以下のリンクをクリックして自分で入手できます
Pythonの無料学習資料とグループコミュニケーションの回答クリックして参加
みなさん、こんにちは。今日はPythonクローラーの基本的な操作についてお話しますが、とにかく、このように始めています、ハハ。
実際、私が最初にPythonを学んだとき、私はデータ処理と分析、パンダなどに行きました。後で、クローラーはとても楽しく、オンラインデータを手動で収集するという面倒な問題を解決できることがわかりました。たとえば、tappapゲームの評価のコンテンツ、特定のビデオWebサイトの集中砲火、特定のドラマ、特定のレビュー、特定の歯のショップ情報、ホスト情報など。
クローラーに関しては、基本的な操作は一部しかありませんが、個人的な経験から、これらの基本は基本的に従来のニーズを満たすことができると感じています。高度なクローラースキルについては、クロールの基本を理解した後、誰もが自然に高度な学習のアイデアと方法を身に付けることができます。
次に、トピックに入りましょう〜
0.クローラーの基本プロセス
クローラープロセスのモジュール化は、基本的に次の手順に要約できます。
- [√]ウェブページのURLを分析する:データをクロールするウェブサイトを開き、実際のページデータのURLアドレスを見つけます。
- [√]ウェブページデータのリクエスト:ウェブページデータのリクエストをシミュレートします。ここでは、リクエストライブラリの使用法を紹介します。
- [√]ウェブページデータの分析:リクエストされたウェブページデータに応じて、さまざまな方法を使用して必要なデータに解析します(ウェブページデータがhtmlソースコードの場合、Beautiful Soup、xpath、および正規表現分析を使用します。ウェブページデータはjson形式であり、辞書リストなどの基本的な知識を直接使用して処理できます)
- [√]ウェブページデータの保存:一般的に、解析されたデータはより構造化されており、txt、csv、json、excelなどのテキストとして保存するか、MySql、MongoDB、SqlLiteなどのデータベースに保存できます。
1.WebページのURLを分析します
ターゲットWebサイトがある場合、静的Webページの場合、Webページのデータを直接取得するために、WebページのアドレスバーのURLをgetリクエストに渡すだけでよいことがあります。ただし、これが動的なWebページの場合、WebページのアドレスバーのURLをgetリクエストに渡してWebページのデータを取得することはできません。多くの場合、この時点でページをめくると、WebページのアドレスバーにURLが表示されます。起こりません。
次に、この2つの場合の実際のページデータのURLアドレスを取得する方法を個別に紹介します。
1.1静的ウェブページ
静的なWebページの場合、WebアドレスバーのURLが必要です。
シェルの中古住宅ネットワーク(https://bj.ke.com/ershoufang/)を例にとると、WebアドレスバーのURLは(https://bj.ke.com/ershoufang/)になります。 pg2 /)。このタイプの状況はほとんど静的なWebページであり、ページめくりのURLルールは非常に明白です。
1.2動的なWebページ
動的なWebページの場合、通常、次の手順で実際のURLアドレスを見つけることができます。
1.ブラウザの開発者モードに入るには「F12」を押す必要があります
。2。「ネットワーク」-> XHRまたはJSを
クリックするか、すべてを見つけることができます。3。ページをめくります(次のページをクリックするか、下にスライドします)。さらにロードするには);
4.ステップ2で名前モジュールの内容の変更を観察し、それを探します。
Huya Xingxiu地区(https://www.huya.com/g/xingxiu)を例にとると、ページをめくっても(2ページ目など)WebアドレスバーのURLが変更されないことがわかります。
実際のURLアドレスを簡単に見つけるために、開発者モードで次のスクリーンショットを見つけることができます。プレビューはプレビュー結果であり、特定の名前を照合して見つけるのに役立ちます。
特定の名前を見つけたら、右側のヘッダーを選択して、要求されたWebページに必要な関連パラメーター情報を表示します。その変更法を明確にすることをお勧めします。Huya Xingxiuを例にとると、実際のURLアドレスと変更ルールは次のとおりです。
実際のURLアドレス
2.Webページデータを要求する
実際のデータのURLを決定したら、リクエストのgetまたはpostメソッドを使用してWebページデータをリクエストできます。
リクエストライブラリを使用するその他の方法については、(https://requests.readthedocs.io/zh_CN/latest/)にアクセスして表示できます。
2.1取得リクエストを送信する
In [1]: import requests
In [2]: url = 'https://bj.ke.com/ershoufang/'
In [3]: r = requests.get(url)
In [4]: type(r)
Out[4]: requests.models.Response
In [5]: r.status_code
Out[5]: 200
取得するのはResponseオブジェクトです。Webページデータを取得する場合は、textまたはcontent属性を使用して取得できます。さらに、取得するWebページデータがjson形式の場合は、組み込みのデータを使用できます。リクエストのjson()デコーダーメソッドでjsonデータの処理を 支援します。
- r.text:文字列タイプのデータ、一般的なWebページデータはテキストタイプですこの属性を使用します
- r.content:バイナリタイプのデータ。この属性は通常、Webページのデータがビデオまたは画像の場合に使用されます。
- r.json():jsonデータのデコード。このメソッド
は通常、ウェブページデータがjson形式の場合に使用されます。一部の動的ウェブページでは、要求されるURLは基本的なURLとキーワードパラメータの組み合わせです。現時点では、paramsキーワードを使用できます。文字列ディクショナリへのパラメータは、これらのパラメータを提供します。
In [6]: url = 'https://www.huya.com/cache.php'
...: parames = {
...: 'm': 'LiveList',
...: 'do': 'getLiveListByPage',
...: 'gameId': 1663,
...: 'tagAll': 0,
...: 'page': 2, # 翻页变化的就是这个参数
...: }
...:
...: r = requests.get(url, params=parames)
In [7]: r.url
Out[7]: 'https://www.huya.com/cache.php?m=LiveList&do=getLiveListByPage&gameId=1663&tagAll=0&page=2'
2.2POSTリクエストを送信する
通常、HTMLフォームのように、フォームとしてエンコードされたデータを送信する必要があります。これを実現するには、辞書をデータパラメータに渡すだけです。リクエストを行うと、データディクショナリはフォームとして自動的にエンコードされます。
>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.post("http://httpbin.org/post", data=payload)
多くの場合、送信するデータはフォームとしてエンコードされていません。dictの代わりに文字列を渡すと、データは直接公開されます。
>>> import json
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}
>>> r = requests.post(url, data=json.dumps(payload))
dictを自分でエンコードするだけでなく、jsonパラメーターを使用して直接渡すこともできます。そうすると、自動的にエンコードされます。
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}
>>> r = requests.post(url, json=payload)
2.3カスタムリクエストヘッダー
リクエストをシミュレートするときに、リクエストヘッダーが設定されていない場合、Webサイトはそれがクローラースクリプトからのものであることを見つけやすくなり、一部のWebサイトはこの種のシミュレーションリクエストを拒否します。したがって、リクエストヘッダーをカモフラージュに設定するだけで、通常はブラウザを設定できます。
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36",
}
r = requests.get(url, headers=headers)
実際、リクエストヘッダーには多くのパラメータを設定できます。具体的には、実際のクロールプロセスで分析および処理するために、開発者モードでリクエストヘッダーモジュールを確認できます。
HuyaXingxiuリクエストヘッダー
2.4応答コード
2.1で、応答コードはr.status_code属性を介して取得されることがわかりました。一般的に、数値200が返される場合は、Webページデータが正常に取得されたことを意味します。
応答コードは5つのタイプに分けられ、最初の桁で表されます。1xx:情報、受信したリクエスト、処理の続行2xx:成功、動作は正常に受け入れられ、理解され、採用されます3xx:リダイレクト、リクエストを完了するには、さらにアクション4xx:クライアントエラー、要求に構文エラーが含まれているか、要求を実行できません5xx:サーバーエラー、サーバーが明らかに無効な要求を実行できません
3.データを解析します
前述のように、リクエストしたWebページデータはHtmlソーステキストまたはjson文字列テキストのいずれかです。2つの解析方法は異なります。以下に簡単な説明をしますが、それは実際の状況によって異なります。
3.1Webページのhtmlテキスト分析
Webページのhtmlテキストの場合、Beautiful Soup、xpath、およびre正規表現の3つの解析方法があります。
シェル中古住宅の最新住宅(https://bj.ke.com/ershoufang/co32/)を例にとると、htmlソースコードは次のとおりです。getrequest後のデータを使用して分析します。
3.1.1美しいスープ
Beautiful Soupライブラリを使用するその他の方法については、チェックアウトできます(https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/)
最初にpipinstallbeautifulsoup4をインストールします。
Webページのhtmlテキストコンテンツr.textを最初のパラメーターとしてBeautifulSoupオブジェクトに渡し、オブジェクトの2番目のパラメーターはパーサーのタイプ(ここではlxmlが使用されます)であり、この時点でBeaufulSoupオブジェクトが初期化されます。次に、このオブジェクトをスープ変数に割り当てます。
from bs4 import BeautifulSoup
import requests
url = 'https://bj.ke.com/ershoufang/co32/'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')
家の名前を取得するためのコードは次のとおりです。
# 获取全部房源 所在的节点
sellList = soup.find(class_="sellListContent")
# 获取全部房源节点列表
lis = sellList.find_all('li',class_="clear")
# 选取第一个房源节点
div = lis[0].find('div',class_="info clear")
# 采集房源名称
title = div.find('div',class_="title")
print(title.text)
明春西园 2室1厅 南 北
3.1.2 xpath
XML Path LanguageのフルネームであるXPathは、XMLドキュメント内の情報を検索するための言語であるXMLパス言語です。
最初にlxmlpipをインストールします。lxmlをインストールします。
一般的なルールは次のとおりです。
最初にlxmlライブラリのetreeモジュールをインポートし、次にHTMLテキストのセクションを宣言し、HTMLクラスを呼び出して初期化し、XPath解析オブジェクトを正常に構築します。
from lxml import etree
import requests
url = 'https://bj.ke.com/ershoufang/co32/'
r = requests.get(url)
html = etree.HTML(r.text)
コピーによって取得されたXpath:// * [@ id = "beike"] / div [1] / div [4] / div [1] / div [4] / ul / li [1] / div / div [1] / a
# 获取 全部房源所在节点 ul,根据属性匹配精准查找
ul = html.xpath('.//ul[@class="sellListContent"]')[0]
# 获取房源列表
lis = ul.xpath('.//li[@class="clear"]')
# 选取第一个房源节点
li = lis[0]
# 获取其房源名称
li.xpath('./div/div[1]/a/text()')
['明春西园 2室1厅 南 北']
3.1.3再定期
WebページのHTMLの再定期的な解析については、以前に公開された記事「クローラーWebページのHTMLのPython正規表現の学習」も確認できます。
# 找到房源名称所在的前后字符,然后组成正则表达式
re.findall(r'<a class="VIEWDATA CLICKDATA maidian-detail" title="(.*?)"',r.text,re.S)[0]
'明春西园 2室1厅 南 北'
3.2jsonテキスト分析
r.json()はリクエストで提供され、jsonデータのデコードに使用できます。このメソッドは通常、Webページデータがjson形式の場合に使用されます。さらに、json.loads()メソッドとeval()メソッドを使用して処理することもできます。
url = 'https://www.huya.com/cache.php'
parames = {
'm': 'LiveList',
'do': 'getLiveListByPage',
'gameId': 1663,
'tagAll': 0,
'page': 2, # 翻页变化的就是这个参数
}
r = requests.get(url, params=parames)
data = r.json()
type(data)
dict
このように解析して得られたデータが辞書であり、辞書のどのフィールドが必要かを調べて取り出します。
4.データを保存します
必要なデータを取得したら、ローカルに書き込むことができます。
テキストデータの場合、csvモジュールまたはpandasモジュールを使用してローカルcsvファイルまたはExcelファイルに書き込むことができます。また、pymysqlモジュールを使用してデータベースに書き込むことも、sqliteを使用してローカルデータベースに書き込むこともできます。
ビデオや写真の場合は、ファイルを開いてバイナリコンテンツを書き込み、ローカルに保存できます。
実際のケースと組み合わせてデータを保存する方法を学ぶことができます。