インターネット上の Python チュートリアルのほとんどはバージョン 2.X です。python3.X と比較すると、多くのライブラリの使用方法が大きく異なります。私は Python3 をインストールしました
。春節(なんて暇なんだ)、冗談を兼ねて簡単なプログラムを書き、プログラムを書く過程を記録してみました。私が初めてクローラーに出会ったのは、このような投稿を見たときでした。オムレットで女の子の写真をクロールするという面白い投稿でした。それで私は猫と虎の写真を自分で撮りました。
テクノロジーは未来にインスピレーションを与えます。プログラマーとして、どうしてそのようなことができるでしょうか?
0x02
腕まくりをして始める前に、まず理論的な知識を広めていきましょう。
簡単に言えば、Web ページ上の特定の場所にコンテンツをプルダウンする必要があります。どのようにプルダウンするか? まず、Web ページを分析して、必要なコンテンツを確認する必要があります。たとえば、今回は陽気な Web サイトのジョークをクロールしました。陽気な Web サイトのジョークのページを開くと、これらのコンテンツを取得することが目的です。読んでから落ち着いてください。こんなふうに笑っていたらコードは書けません。 Chrome では、「要素の検査」を開き、HTML タグをレベルごとに展開するか、小さなマウスをクリックして必要な要素を見つけます。
最後に、
の内容が必要なジョークであることがわかります。2 番目のジョークを見ると、同じことが当てはまります。したがって、この Web ページ内のすべての
を見つけて、その中のコンテンツを抽出すれば完了です。
0x03
さて、目的はわかったので、腕まくりをして始めましょう。ここでは python3 を使用します。python2 と python3 の選択については、実現できる機能は自由ですが、いくつかの違いがあります。ただし、依然として python3 を使用することをお勧めします。
必要なコンテンツをプルダウンしたいのですが、まずこの Web ページをプルダウンする必要があります。ここでは、urllib というライブラリを使用して Web 全体を取得する必要があります。ページ。まず、urllibをインポートします
コードは次のとおりです:import urllib.requestをリクエストとしてインポートします
次に、リクエストを使用してWebページを取得できます
コードは次のとおりです: def getHTML(url):
return request.urlopen(url).read()
人生は短い、私は Python を使用します、1 行のコード、Web ページをダウンロードします、あなたは言いました、あるPython を使用しない理由はありません。
コードは次のとおりです:soup = BeautifulSoup(getHTML("http://www.pengfu.com/xiaohua_1.html"))
BeautifulSoupを使用してWebページを解析する必要なのは 1 文だけですが、コードを実行すると、パーサーを指定するように求める警告が表示されます。そうしないと、他のプラットフォームまたはシステムでエラーが報告される可能性があります。
コードは次のとおりです:/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/bs4/__init__.py:181: UserWarning : パーサーが明示的に指定されていないため、このシステムで利用可能な最適な HTML パーサー (「lxml」) を使用しています。これは通常は問題ありませんが、このコードを別のシステムまたは別の仮想環境で実行する場合は問題ありません。 、別のパーサーが使用され、動作が異なる可能性があります。
この警告を引き起こしたコードは、joker.py ファイルの 64 行目にあります。この警告を取り除くには、次のようにコードを変更します。
BeautifulSoup([your markup])
これに:
BeautifulSoup([your markup], "lxml")
markup_type=markup_type))
パーサーの種類とさまざまなパーサー間の違いについては、公式ドキュメントで詳しく説明されています。現在でも、解析には lxml を使用する方が信頼性が高くなります。
変更後コードは次のとおりです:soup = BeautifulSoup(getHTML("http://www.pengfu.com/xiaohua_1.html", 'lxml'))
このようにすると、上記の警告は表示されなくなります。
コードをコピーします コードは次のとおりです:
p_array =Soup.find_all('p', {'class':"content-img clearfix pt10relative"})
find_all関数を使用して、すべてのクラス = content-img clearfix pt10 相対 p タグを検索し、配列を走査します
コードをコピーします コードは次のとおりです:
p_array の x : content = x.string
このように、宛先 p の内容を取得します。この時点で、私たちは目標を達成し、冗談の範囲まで登りました。
ただし、同じようにクロールするとこのようなエラーが報告されます
コードをコピーしますコードは次のとおりです:
raise RemoteDisconnected("リモートエンドが接続を閉じました" http.client.RemoteDisconnected: Remote応答なしで接続を終了します
リモートエンドが応答していないと表示されます。リンクを閉じましたが、ネットワークを確認したところ問題はありませんでした。これは何が原因ですか?
パケットをキャプチャするために Charles をオンにしましたが、応答がありません。ああ、これは奇妙です。どうして、適切な Web サイトに Python ではアクセスできないのでしょうか? Charles を調べたところ、UA は urllib / を使用して開始されたリクエストに対してデフォルトで Python-urllib を使用していることがわかりました。 3.5 Chrome で UA にアクセスすると、User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS) になります。サーバーは、UA に基づいて Python クローラーを拒否するかどうかを判断します。偽装して試してみましょう。コードをコピーします。コードは次のとおりです。 -Agent:Mozilla/5.0 (Macintosh; Intel Mac OS .urlopen(req).read()
このようにして、Python を chrome に偽装して Yibai の Web ページを取得することで、スムーズにデータを取得することができます。
この時点で、Python を使用して Yibai と Pingdu.com をクロールするという冗談は終わりました。必要なのは、対応する Web ページを分析して興味のある要素を見つけ、Python の強力な機能を使用して目的を達成することだけです。 XXOOの写真でも、含蓄のあるジョークでも、ワンクリックでできます。詳しくは説明しませんが、女の子の写真をクリックして探します。
# -*- coding: utf-8 -*-
import sys
import urllib.request as request
from bs4 import BeautifulSoup
def getHTML(url):
headers = {'User-Agent': 'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}
req = request.Request(url, headers=headers)
return request.urlopen(req).read()
def get_pengfu_results(url):
soup = BeautifulSoup(getHTML(url), 'lxml')
return soup.find_all('p', {'class':"content-img clearfix pt10 relative"})
def get_pengfu_joke():
for x in range(1, 2):
url = 'http://www.pengfu.com/xiaohua_%d.html' % x
for x in get_pengfu_results(url):
content = x.string
try:
string = content.lstrip()
print(string + '\n\n')
except:
continue
return
def get_qiubai_results(url):
soup = BeautifulSoup(getHTML(url), 'lxml')
contents = soup.find_all('p', {'class':'content'})
restlus = []
for x in contents:
str = x.find('span').getText('\n','<br/>')
restlus.append(str)
return restlus
def get_qiubai_joke():
for x in range(1, 2):
url = 'http://www.qiushibaike.com/8hr/page/%d/?s=4952526' % x
for x in get_qiubai_results(url):
print(x + '\n\n')
return
if __name__ == '__main__':
get_pengfu_joke()
get_qiubai_joke()
Python3 による陽気な Web ページ クローラーの制作と関連記事の詳細については、PHP 中国語 Web サイトに注目してください。