Web クローラー | 入門チュートリアル 解析ライブラリ pyquery

Web クローラー開発のための実用的なソース コード: https://github.com/MakerChen66/Python3Spider

オリジナルであることは簡単ではありません。この記事では盗作と転載が禁止されています。長年の実用的なクローラー開発経験の要約であり、侵害を調査する必要があります。 !

1.pyqueryの導入

1.1 パイクエリとは何ですか?

以前、非常に強力なWebページ解析ライブラリであるBeautiful Soupの使い方を紹介しましたが、少し使いにくい、使いにくいと感じることはありませんか?CSS セレクターがそれほど強力ではないと感じますか? CSS セレクターも使用する解析ライブラリである pyquery には、多くの属性メソッドと基本的な CSS セレクターが含まれているだけでなく、ノード操作と多くの疑似クラス セレクターもサポートされているため、その機能は Beautiful Soup よりも強力です

1.2 pyqueryをインストールする

pip install pyquery -i https://pypi.doubanio.com/simple

他のミラーソースを指定することもできます

1.3 pyqueryのインポート

from pyquery import PyQuery as pq



2、pyqueryの使用

2.1 初期化

pyquery を初期化するには、文字列、URL、ファイル名などを直接渡すなど、さまざまな方法があります。詳しく見てみましょう

文字列の初期化
例を使用して感覚を理解してみましょう

from pyquery import PyQuery as pq

html = '''
<div class="wrap">
<div id="container">
    <ul class="list">
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>
 </div>
'''

doc = pq(html)
print(doc('li'))

まず PyQuery オブジェクトを導入し、pq という名前を付けます。次に HTML 文字列を宣言し、それをパラメータとして PyQuery クラスに渡します。これでオブジェクトの初期化が完了します。次に、初期化されたオブジェクトを CSS セレクターに渡します。ここでは、すべての li ノードを選択できるように、li ノードを渡します。出力結果は次のようになります: URL 初期化 初期化パラメーターは、文字列を渡すだけでなく、URL も渡すことが

でき
ここに画像の説明を挿入
ます

from pyquery import PyQuery as pq

doc = pq(url='https://www.qiushibaike.com/hot/')
print(doc('title'))

PyQuery オブジェクトは、最初にこの URL をリクエストし、次に返された HTML コンテンツで初期化を完了します。これは、Web ページのソース コードを文字列の形式で PyQuery クラスに渡して初期化するのと同じです。同じ機能があります。次の

コードのように

from pyquery import PyQuery as pq
import requests

doc = pq(requests.get('https://www.qiushibaike.com/hot/').text)
print(doc('title'))


ここに画像の説明を挿入
ファイルの初期化 もちろん
、文字列やURLを渡すだけでなく、ローカルファイル名を渡すこともできますが、この場合はパラメータにfilenameを指定する必要があります。

from pyquery import PyQuery as pq

doc = pq(filename='demo.html')
print(doc('li'))

ここではローカル HTML ファイル demo.html が必要で、その内容は解析される HTML 文字列です。

2.2 基本的な CSS セレクター

例を使用して、pyquery の CSS セレクターの使用法を感じてください。

from pyquery import PyQuery as pq

html = '''
<div class="wrap">
<div id="container">
    <ul class="list">
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>
 </div>
'''

doc = pq(html)
print(doc('#container .list li'))
print(type(doc('#container .list li')))

PyQuery オブジェクトを初期化した後、CSS セレクター #container.list li が渡されます。これは、最初に ID がcontainerであるノードを選択し、次に内部クラスがlistであるノード内のすべての li ノードを選択し、次にcontent とその型の printout

出力結果は次のとおりです。
ここに画像の説明を挿入
ご覧のとおり、修飾されたノードを正常に取得しました。その型は依然として PyQuery 型です。

2.3 ノードの検索

次に、一般的に使用されるクエリ関数をいくつか紹介します。これらの関数は、jQuery の関数とまったく同じように使用されます。子ノードは、

すべて
の子孫ノードを検索するために find() メソッドを使用する必要があります。このときに渡されるパラメータは、 CSS セレクター: コードの冗長性を避けるために、前の HTML を例に挙げてみましょう。

doc = pq(html)
items = doc('.list')
html = items.find('li')
print(html)
print(type(html))

クラスが list であるノードを選択し、ノード内のすべての子孫ノード li を選択しました。

出力結果は次のようになります:
ここに画像の説明を挿入
子ノードを検索したいだけの場合は、children() メソッドを使用できます。

doc = pq(html)
items = doc('.list')
html = items.find('li')
print(html.children())
print(type(html.children()))

ここでは、クラスが list であるノードを選択し、次にノード内のすべての子孫ノード li を選択し、最後にノードのすべての子ノードを選択します。

出力結果は次のとおりです。
ここに画像の説明を挿入
さらに、children() メソッドは次のように CSS セレクターを渡すこともできます。

items = doc('.list')
html = items.children('.active')
print(html)

出力結果は次のとおりです。
ここに画像の説明を挿入
親ノード
次のように、parent() メソッドを使用してノードの直接の親ノードを取得できます。

from pyquery import PyQuery as pq

doc = pq(html)
items = doc('.list')
container = items.parent()
print(container)
print(type(container))

まずクラスが list であるノードを選択し、次にparent() メソッドを使用してノードの直接の親ノードを取得します (その型はまだ PyQuery です。出力結果は次のとおりです

)
ここに画像の説明を挿入
。次のようにparents()メソッドを使用できます。

from pyquery import PyQuery as pq

doc = pq(html)
items = doc('.list')
parents = items.parents()
print(parents)
print(type(parents))

同様に、parents() メソッドは次のように CSS セレクターを渡すこともできます。

wrap = items.parents('.wrap')
print(wrap,type(wrap))

兄弟ノード 兄弟
ノードを取得するには、次のように兄弟ノード() メソッドを使用します。

doc = pq(html)
li = doc('.list .item-0.active')
print(li.siblings())

ここでは 3 番目の li ノードが選択されており、兄弟ノードが 4 つあります。1

番目、2 番目、4 番目、および 5 番目のノードの出力結果は次のとおりです。同様に、
ここに画像の説明を挿入
兄弟ノード () を CSS セレクターに渡して、次の結果を取得することもできます。兄弟ノード。次のように:

doc = pq(html)
li = doc('.list .item-0.active')
print(li.siblings('.active'))

出力は次のとおりです。
ここに画像の説明を挿入

2.4 トラバーサル

上記のことから、pyquery の選択ノードは単一ノードまたは複数ノードであることがわかりますが、型はすべて PyQuery 型であり、Beautiful Soup のようなリストを返すのではなく、単一ノードの場合は直接出力できます

。次のように、文字列に直接変換することもできます。

doc = pq(html)
li = doc('.list .item-0.active')
print(li)
print(str(li))

複数のノードの結果については
ここに画像の説明を挿入
、それらを取得するためにトラバースする必要があります。最初に items() メソッドを使用して型をジェネレーター型に変換し、次に次のように各 li ノードをトラバースします。

doc = pq(html)
lis = doc('li').items()
print(lis)
for li in lis:
  print(li,type(li))

items() を呼び出した後、li ノード オブジェクトを 1 つずつ取得するためにトラバースする必要があるジェネレーターが得られます。ノード タイプも PyQuery タイプです。出力結果は次のとおりです。拡張: enumerate も使用できます

() メソッドを再度実行して、各ノードのシリアル番号を取得できるようにします。
ここに画像の説明を挿入

doc = pq(html)
lis = doc('li').items()
print(lis)
for i,li in enumerate(lis):
  print(i,li,type(li))

出力は次のとおりです。
ここに画像の説明を挿入

2.5 情報へのアクセス

ノードを見つけた後, 私たちの最終的な目標は, もちろん, ノードに含まれる情報を抽出することです. より重要な情報には属性とテキスト

取得
が含まれます. 属性が PyQuery タイプのノードに抽出された後, attr() メソッドは次のようになります次のように、属性を取得するために呼び出されます。

doc = pq(html)
a = doc('.item-0.active a')
print(a,type(a))
print(a.attr('href'))

出力結果は次のとおりです。attr
ここに画像の説明を挿入
属性を呼び出して属性を取得することもできます。

print(a.attr.href)

これら 2 つのメソッドの結果はまったく同じです。
注意: 返された結果に複数のノードが含まれている場合、attr() メソッドを呼び出しても、最初のノードの属性のみが取得されます。ノードのすべての属性を取得するには、次を使用する必要があります。前述のトラバースによる

テキストの取得
次のように、text() メソッドを呼び出してノードの内部テキストを取得します。

doc = pq(html)
a = doc('.item-0.active a')
print(a)
print(a.text())

出力結果は次のとおりです。
ここに画像の説明を挿入
このノード内の HTML テキストを取得したい場合は、次のように html() メソッドを使用する必要があります。

doc = pq(html)
li = doc('.item-0.active')
print(li)
print(li.html())

出力は次のとおりです。
ここに画像の説明を挿入


3. ノードの操作



pyquery は、ノードの属性の追加または削除、ノードの削除など、ノードを動的に変更するための一連のメソッドを提供します。これらの操作は、情報を抽出するための優れたトラバーサルをもたらすことがあります

from pyquery import PyQuery as pq

doc = pq(html)
li = doc('.item-0.active')
print(li)
li.removeClass('active')
print(li)
li.addClass('active')
print(li)

出力結果は次のとおりです:したがって、メソッド addClass() および deleteClass() は、ノードattr 、 text および html
ここに画像の説明を挿入
のクラス属性を動的に変更できます。ノード内のコンテンツを変更する text() および html() メソッド、例以下の通り:


html = '''
<ul class="list">
<li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
</ul>
'''
doc = pq(html)
li = doc('.item-0.active')
print(li)
li.attr('name','link')
print(li)
li.text('changed data')
print(li)
li.html('<span>changed data</span>')
print(li)

まず li ノードを選択し、次に attr() メソッドを呼び出して属性を変更します。このメソッドの最初のパラメータは属性名、2 番目のパラメータは属性値で、次に text() メソッドと html() メソッドを呼び出します。ノードコンテンツの内部コンテンツを変更するには、出力します

出力結果は次のとおりです。
ここに画像の説明を挿入
: attr() メソッドが最初のパラメータの属性名のみを渡す場合は、属性値を取得するためのものであり、2 番目のパラメータが渡される場合は、属性値を変更するために使用できます。属性値; text() メソッド and html() メソッドがパラメーターを渡さない場合は、ノード内のプレーン テキストと HTML テキストを取得し、それ以外の場合は割り当てられ

ます
。特定のノードは、情報を抽出するのに非常に便利な場合があります。

html = '''
  <div class="wrap">
    hello,world
    <p>this is a paragraph</p>
  </div>
'''
doc = pq(html)
wrap = doc('.wrap')
wrap('p').remove()
print(wrap.text())

出力は次のとおりです。

hello,world



4. 疑似クラスセレクター

CSS セレクターが強力であるもう 1 つの重要な理由は、最初のノード、最後のノード、奇数ノードと偶数ノード、特定のテキストを含むノードの選択など、さまざまな疑似クラス セレクターをサポートしていることです。

from pyquery import PyQuery as pq

html = '''
<div class="wrap">
<div id="container">
    <ul class="list">
         <li class="item-0">first item</li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1 active"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>
 </div>
'''
doc = pq(html)
li = doc('li:first-child')
print(li)
li = doc('li:last-child')
print(li)
li = doc('li:nth-child(2)')
print(li)
li = doc('li:gt(2)')
print(li)
li = doc('li:nth-child(2n)')
print(li)
li = doc('li:contains(second)')
print(li)

ここでは CSS3 の疑似クラス セレクターが使用されており、最初の li ノード、最後の li ノード、2 番目の li ノード、3 番目の li の後の li ノード、偶数の位置の li ノード、および 2 番目のテキストを含む li が使用されます。ノード

の出力は次のとおりです:
ここに画像の説明を挿入
概要
これまで、pyquery の一般的な使用法を紹介しましたが、その機能は非常に強力です. 多くの操作は、lxml や Beautiful Soup などの解析ライブラリでは利用できません

。 CSS セレクターの使用方法については、リンクを参照してください:
https://www.w3school.com.cn/css/index.asp

pyquery 解析ライブラリの詳しい使用方法については、リンク
https://pyquery.readthedocs.ioを参照してください。

5. 原文へのリンク

私のオリジナルの公開アカウントの原文へのリンク:クリックして原文を読んでください

オリジナリティを高めるのは簡単ではありません。役に立ったと思ったら、高評価をいただければ幸いです。ありがとうございます。

6. 著者情報

著者: Xiaohong の釣り日報、目標: プログラミングをもっと面白くする!

元の WeChat 公開アカウント:「Xiaohong Xingkong Technology」。アルゴリズム、クローラー、ウェブサイト、ゲーム開発、データ分析、自然言語処理、AI などに重点を置いています。ご注目をお待ちしております。一緒に成長し、コーディングしましょう!

転載指示: この記事は盗作と転載を禁止しており、侵害があれば調査する必要があります。

おすすめ

転載: blog.csdn.net/qq_44000141/article/details/121568618