前回の記事では、グラフィッククラウド表示のためのbilibiliの弾幕のクロール:ステーションBでの「CharlotteAnnoyance」のサブタイトルワードクラウド表示のクロールは、クロールデータとデータ表示の組み合わせの例です。ここでは、クローラーの一般的なツールを紹介します。
目次
一般的なツール
データクロールの3つのステップ:データのダウンロード---データの分析---データの分析。いくつかの一般的なツールが使用されています。リクエストはURLコンテンツのダウンロード、正規表現、beautifulsoup、lxmlはhtmlドキュメントの迅速な解析です。Tqdmは処理の進行状況を表示し、ffmpyがビデオストリームを処理し、matplotlibとseabornがデータを視覚的に分析して表示できます。
-
リクエスト
リクエストパッケージは、相互作用をシミュレートするためにURLのget、put、post、deleteなどのメソッドを提供します。Response.textはUnicode形式で返され、通常はutf-8形式に変換する必要があります。そうしないと文字化けします。response.contentはバイナリモードで、ビデオなどをダウンロードできます。視聴したい場合は、utf-8形式にデコードする必要があります。
response.content.decode( "utf-8)またはresponse.encoding =" utf-8 "のいずれかを使用すると、コードの文字化けの問題を回避できます。
response = requests.get("https://www.baidu.com")
print(type(response))
print(response.status_code)
print(type(response.text))
response.enconding = "utf-8'
print(response.text)
print(response.cookies)
print(response.content)
print(response.content.decode("utf-8"))
パラメータとヘッダーを使用してリクエストを取得します。
url = 'http://www.baidu.com'
headers={
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0"
}
data = {
'name':'yzg',
'age':'18'
}
response = requests.get(url,params=data,headers=headers)
print(response.url)
print(response.text)
URLアドレスにデータを投稿します。
url = 'http://xxx'
data = {
'name':'yzg',
'age':'23'
}
response = requests.post(url,data=data)
print(response.text)
URLアクセス後に応答を取得します。
response = requests.get("http://www.baidu.com")
#打印请求页面的状态(状态码)
print(type(response.status_code),response.status_code)
#打印请求网址的headers所有信息
print(type(response.headers),response.headers)
#打印请求网址的cookies信息
print(type(response.cookies),response.cookies)
#打印请求网址的地址
print(type(response.url),response.url)
#打印请求的历史记录(以列表的形式显示)
print(type(response.history),response.history)
セッションの保持に使用できるCookieを取得します。
response = requests.get('https://www.baidu.com')
print(response.cookies)
for key,value in response.cookies.items():
print(key,'==',value)
url = 'http://xxxx'
cookies = {'xx': 'x', 'xx': 'y'}
r = requests.get(url, cookies=cookies)
print(r.json())
-
lxml
lxmlは、HTML / XML / XPath解析メソッドをサポートする解析ライブラリであり、解析効率が非常に高くなっています。XPath(XML Path Language)は、XMLドキュメント内の情報を検索するための言語です。元々はXMLドキュメントの検索に使用されていました。 HTMLドキュメントの検索にも適しています。
XPathの使用法の詳細については、http://www.w3school.com.cn/xpath/index.aspを参照してください。
Python lxmlライブラリの使用法の詳細については、http://lxml.de/を参照してください。
xpathの一般的なルール:
式 | 説明 |
ノード名 | このノードのすべての子ノードを選択します |
/ | 現在のノードから直接の子を選択します |
// | 現在のノードから子孫ノードを選択します |
。 | 現在のノードを選択します |
.. | 現在のノードの親ノードを選択します |
@ | 属性を選択 |
* | ワイルドカード、すべての要素ノードと要素名を選択します |
@ * | すべての属性を選択 |
[@attrib] | 特定の属性を持つすべての要素を選択します |
[@ attrib = 'value'] | 指定された値を持つ指定された属性を持つすべての要素を選択します |
[鬼ごっこ] | 指定された要素を持つすべての直接子ノードを選択します |
[タグ= 'テキスト'] | 指定されたすべての要素を選択すると、テキストコンテンツはテキストノードになります |
テキストを読み、ノードを解析します。
from lxml import etree
text='''
<div>
<ul>
<li class="item-0"><a href="link1.html">第一个</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-0"><a href="link5.html">a属性</a>
</ul>
</div>
'''
html=etree.HTML(text) #初始化生成一个XPath解析对象
result=etree.tostring(html,encoding='utf-8') #解析对象输出代码
print(type(html))
print(type(result))
print(result.decode('utf-8'))
クロールされたURLアドレスに従って、dタグのテキストコンテンツはxpath分析メソッドを使用して取得されます。
url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=183896111'
headers={
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0"
}
response=requests.get(url,headers=headers)
html=etree.HTML(response.content)
d_list=html.xpath("//d//text()")
-
BeautifulSoup
lxmlと同様に、BeautifulSoupもxml形式のパーサーです。xpathのナレッジコンテンツを含まない方が比較的簡単です。Beautifulsoupは、解析中にWebページのコンテンツ全体をDOMツリーにロードします。メモリのオーバーヘッドと時間は比較的高くなります。大量のコンテンツにはお勧めしません。ただし、BeautifulSoupは、必要なタグを直接見つけることができるため、明確に構造化されたWebページコンテンツを必要としません。HTML構造が不明確な一部のWebページに適しています。
使用方法については、https://www.crummy.com/software/BeautifulSoup/を参照してください。
from bs4 import BeautifulSoup
html = """
<html><head><title>haha,The Dormouse's story</title></head>
<body>
<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
soup = BeautifulSoup(html,'lxml')
# print(soup.prettify()) # 格式化
print(soup.title)
print(soup.title.name)
print(soup.title.string)
print(soup.title.parent.name)
print(soup.p) # p标签
print(soup.p["class"])
print(soup.a)
print(soup.find_all('a'))
print(soup.find(id='link3'))
-
tqdm
tqdmはPythonのプログレスバーです。Pythonの長いループに進行状況のプロンプトメッセージを追加できます。ユーザーはイテレータtqdm(イテレータ)をカプセル化するだけで済みます。データのクロールをトラバースしてローカルプロセスに書き込んだ後、tqdmを使用してプログレスバーの表示を実行します。
# 方法1:
import time
from tqdm import tqdm
for i in tqdm(range(100)):
time.sleep(0.01)
#方法2:
import time
from tqdm import trange
for i in trange(100):
time.sleep(0.01)
プログレスバーの説明を設定できます。
pbar = tqdm(["a", "b", "c", "d"])
for char in pbar:
# 设置描述
pbar.set_description("Processing %s" % char)
time.sleep(1)
-
ffmpy3
ffmpy3はffmpyのブランチであり、単純なFFmpegコマンドラインラッパーです。ffmpyは、コマンドラインからFFmpegを実行し、同期実行にPythonのサブプロセスモジュールを使用するためのPythonicインターフェイスを実装します。
import ffmpy3
ff = ffmpy3.FFmpeg(
inputs={'input.mp4': None},
outputs={'output.avi': None}
)
ff.run()
-
matplotlib
matplotlibは、Pythonで最も有名な描画ライブラリであり、インタラクティブな描画に非常に適したmatlabと同様のコマンドAPIのセットを提供します。また、描画コントロールとしても簡単に使用できます。Seabornもmatplotlibカプセル化に基づいていますが、matplotlibはより低レベルであり、より豊富な機能を提供します。https://matplotlib.org/を参照してください。
matplotlib.pyplotは、コマンドスタイルの関数のコレクションです。各pyplot関数は、グラフの作成、グラフ内の描画領域の作成、描画領域への線の追加など、画像にいくつかの変更を加えます。matplotlib.pyplotでは、関数呼び出しによってさまざまな状態が保存されるため、現在の画像や描画領域などをいつでも追跡できます。描画関数は、現在の軸に直接作用します(matplotlibの固有名詞、グラフの一部であり、数学の座標系ではありません)。
import matplotlib.pyplot as plt
plt.plot([2,4,7,18])
plt.ylabel('some numbers')
plt.show()
%matplotlib inline
Figure:描画する前に、Figureオブジェクトが必要です。これは、描画を開始するための製図板として理解できます。
import matplotlib.pyplot as plt
fig = plt.figure()
%matplotlib inline
軸:軸はFigureオブジェクトの後に定義する必要があり、軸を追加する必要があります。図には3つの図があります。
fig = plt.figure()
ax1 = fig.add_subplot(131)
ax2 = fig.add_subplot(132)
ax3 = fig.add_subplot(133)
ax1.set(xlim=[0.5, 4.5], ylim=[-2, 8], title='An Example Axes',ylabel='Y-Axis', xlabel='X-Axis')
ax2.set(xlim=[0.5, 4.5], ylim=[-2, 8], title='An Example Axes',ylabel='Y-Axis', xlabel='X-Axis')
ax3.set(xlim=[0.5, 4.5], ylim=[-2, 8], title='An Example Axes',ylabel='Y-Axis', xlabel='X-Axis')
plt.show()
サブピクチャと軸の数を一度に定義することもできます。
fig, axes = plt.subplots(nrows=2, ncols=2)
axes[0,0].set(title='Upper Left')
axes[0,1].set(title='Upper Right')
axes[1,0].set(title='Lower Left')
axes[1,1].set(title='Lower Right')
matplotlibは、折れ線グラフ、散布図、ヒストグラム、分布グラフ、円グラフ、関係グラフなどを提供します。これらは、これに基づいて調べることができます。
-
海生まれ
パンダと組み合わせたseabornのデータ処理に関して、私の以前のブログ投稿に詳細な使用方法があります:Seabornデータ視覚化探索(ヒントデータセット)