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 などに重点を置いています。ご注目をお待ちしております。一緒に成長し、コーディングしましょう!
転載指示: この記事は盗作と転載を禁止しており、侵害があれば調査する必要があります。