0.はじめに
ここで、私たちは私たちの仕事で実際的な問題に遭遇しました。
- 淘宝網のウェブサイトのリンクに従って、ウェブページでSKUタイトルとメイン画像のリンク情報を取得する必要があります。
この機会を利用して、Webクロールに関連する基本的なスキルを学び、上記の問題を解決するようになりました。
さらに、Webページに写真、ビデオ、その他のファイルをダウンロードする方法も学びます。
ただし、ここでは、学習性のあるブログ投稿であり、内容は単なる趣味であり、作業に必要な機能を簡単に実現し、共有・コミュニケーションするためにのみ使用されます。みんなと一緒に。
ただし、この記事に基づいて詳細な学習を行い、関連する技術を使用して関連する法的問題を引き起こした読者がいる場合は、この記事を責任を負わずにご容赦ください。
1.Webページ情報の取得
まず、Webページの情報を取得する方法を見てみましょう。
1.Moファンチュートリアルメソッド
参照リンク1のMofanのビデオチュートリアルでは、彼はurllibライブラリのurllib.request.urlopen
メソッドを使用してWebコンテンツをクロールします。
具体的なコマンドは次のとおりです。
from urllib.request import urlopen
html = urlopen("https://detail.tmall.com/item.htm?spm=a230r.1.14.24.7acb2075Uiwtjj&id=601871231483&ns=1&abbucket=20").read()
しかし、実際の運用では、主に次のような多くのピットがあることがわかりました。
- 2つのクロールコマンドを実行した後に証明書の問題が発生し、2回目のWebコンテンツの取得に失敗し、次のエラーが発生しました。
URLError: <urlopen error [SSL: TLSV1_ALERT_INTERNAL_ERROR] tlsv1 alert internal error (_ssl.c:748)>
- HTMLコンテンツがデコードされると、Webページが順序に従って
utf-8
エンコードされない可能性があるhtml.decode("utf-8")
ため、コマンドに次のエラーが表示される場合があります。UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc0 in position 1742: invalid start byte
会社のデータグループの友人と相談したところ、前者はクローラーと判断されたWebページによってブロックされる可能性が最も高く、後者はWebページのコンテンツがutf-8
エンコードをサポートしていないためであることがわかりました。
Webコンテンツを取得するためのより良い方法は、データクロールにリクエストとヘッダー情報を使用することです。
2.ヘッダー情報の取得
通常のurlopen方式では、取得するのは通常のストリーム情報であり、http情報のコンテンツのエンコード方式がわからないため、上記のデコードではどの方式でデコードするかがわかりません。
これを行うには、URLを要求するときに、関連するWebサイトのヘッダー情報を事前に知っておく必要があります。これにより、後続の操作でWebページのコンテンツをスムーズにデコードおよび分析できます。ただし、より一般的なケースでは、実際にはヘッダー情報をリクエストプロセスに直接取り込むため、Webページ情報を読みながらWebページのコンテンツを分析できます。
したがって、Webページリクエストのヘッダー情報を取得する方法を検討する必要があります。
ヘッダー情報を取得する方法は、Webページのrequest curlコマンドを取得し、オンライン変換ツールを使用することで、requestコマンドを直接取得できます(たとえば、リンク6のWebサイトツールを参照してください)。
淘宝網のウェブサイトのリンクを開き、F12ショートカットキーを使用して開発者ツールバーを開きます。更新後に取得される最初のリクエストは、ウェブサイトの直接リクエストコマンドです。
リンクを右クリックしてそのカールアドレスをコピーすると、cmdコマンドラインで直接要求されたコマンドを取得し、上記のオンライン変換ツールを使用してPythonコードに変換できます。
変換後、対応するリクエストコードを取得できます。ヘッダー情報のみを取得し、headers
Cookieなどの不要な情報を削除して、次の例を示します。
headers = {
'authority': 'detail.tmall.com',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36',
'referer': 'https://s.taobao.com/',
'accept-language': 'zh-CN,zh;q=0.9,zh-TW;q=0.8',
}
3.リクエストを使用してWebコンテンツを取得します
最後に、Webページのコンテンツを取得する方法を見てみましょう。
Mofanの動画では、ウェブページの情報を取得した後、データストリームがあります。まずメソッドをread()
使用してコンテンツを取得し、次にdecode
メソッドを使用して読み取り可能なコード(中国語のコンテンツがある場合)に変換する必要があります。
それはに従ったものである場合の方法を使用urllib
してMofanチュートリアルurlopen
、そして我々はまた、手動で渡す必要があるread
とdecode
のpythonファイルを読み取る方法に少し似ているコンテンツを、読み取るための機能。
ただし、リクエストにヘッダー情報を追加する方法を採用した場合、実際には上記のプロセスがヘッダー情報に構成されているため、直接取得した結果が読み取れる結果になります。
実際、上記のcurl変換pythonツールは、リクエスト呼び出しリクエストを生成します。呼び出しコードを次のように指定します。
import requests
headers = {
'authority': 'detail.tmall.com',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36',
'referer': 'https://s.taobao.com/',
'accept-language': 'zh-CN,zh;q=0.9,zh-TW;q=0.8'
}
params = (
('id', '629648945951'),
)
response = requests.get('https://detail.tmall.com/item.htm', headers=headers, params=params)
または、より暴力的になり、paramsを介してパラメーターを渡さずに、WebページのURLリンクを直接渡すこともできます。
import requests
headers = {
'authority': 'detail.tmall.com',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36',
'referer': 'https://s.taobao.com/',
'accept-language': 'zh-CN,zh;q=0.9,zh-TW;q=0.8'
}
response = requests.get('https://detail.tmall.com/item.htm?spm=a230r.1.14.24.349e20750ClDZd&id=601871231483&ns=1&abbucket=20', headers=headers)
このようにして、Webページのコンテンツ情報を直接取得できます。
4.Webクロールの失敗の理由の調査
実際のテストでは、ヘッダー情報を使用しても、上記のリクエストの頻度が高すぎるために問題が発生することがわかりました。
以下では、それを簡単に分析して、この問題を何らかの方法で回避できるかどうかを確認します。
後でデータを処理している同僚に尋ねたところ、この問題は適切な解決策ではないことがわかりました。本質的な理由は、Webページのクロール防止メカニズムです。クローラー情報であることが判明する理由は、 Pythonとブラウザでの実際の発生。のリクエスト動作に一貫性がありません。
具体的には、ブラウザでは、ウェブページを開くたびに、実際には関連するウェブページのリクエストが多数トリガーされ、ブラウザのリクエストのCookie情報は、ブラウジング動作の発生に応じて変化し、リクエストのCookie情報は変化します。リクエストによって送信される多くの場合、修正されます。これにより、Webページは、リクエストがコードからのものか、ユーザーの実際のブラウザの動作からのものかを確認します。
もちろん、フォローアップは、これらのクライミング防止メカニズムを回避する戦略がないということではありませんが、全体として、ウェブサイトのデザイナーとの知恵と勇気と戦うプロセスです。これは単なる一般的な紹介ブログ投稿です。 、そんなに深く勉強する必要はありません。。。
2.Webページ情報分析
次に、Webページ情報の分析方法を見てみましょう。
BeautifulSoupツールを使用してWebコンテンツを分析します。
BeautifulSoupは、Webページ情報の高度な正規表現パッケージです。BeautifulSoupに組み込まれているメソッドを直接使用して、複雑な正規表現ルールを記述せずにWebページ情報を取得できます。
1.BeautifulSoupのインストール
まず、次のBeautifulSoupのインストールプロセスを簡単に説明します。これは実際にはpipをインストールするだけで済みます。唯一の注意点は、BeautifulSoupライブラリのpipパッケージの名前にbeautifulsoup4
違いがないことです。
インストールが完了したら、インポート方法にも注意する必要があります。BeautifulSoupのインポート方法は次のとおりです。
from bs4 import BeautifulSoup
2.BeautifulSoupの使用
それでは、BeautifulSoupの具体的な使用法を見てみましょう。
使い方を詳しく説明するために、まずウェブページの情報コンテンツの構造を見てみる必要があります。
一般的に、Webページの情報は次のようになります。
<meta name="keywords" content="花花公子男装夹克男春季新款休闲冲锋衣连帽宽松潮流短款男士外套"/>
情報を取得するためのBeautifulSoupの構文は次のとおりです。
soup = BeautifulSoup(html)
skutitle = soup.find("meta", {
"name": "keywords"})["content"]
その中で、メタはファイルツリーの情報フィールドであり、以下のパラメータはフィルタ条件であり、最後にコンテンツフィールドのコンテンツが取得されます。
同様に、Pythonコマンドをすばやく取得して、淘宝網製品の最初の画像を取得できます。
image = soup.find("img", {
"id": "J_ImgBooth"})["src"]
3.Webページからのファイルのダウンロード
最後に、Webページからファイルをダウンロードする方法、たとえば、上記で取得した画像を取得する方法を見てみましょう。
得られた画像のURLリンクを提供します。
url = "https://img.alicdn.com/imgextra/i4/1851041537/O1CN01qd5ZSB1NDzO4pNexv-1851041537.jpg_430x430q90.jpg"
この部分を実装するには、次の2つの方法があります。
- これを実現する1つの方法は、wgetライブラリを使用してファイルとしてダウンロードすることです。
- 2つ目は、データストリームとして読み取り、ファイルに書き込むことです。
以下では、それらを個別に調べます。
1. Webページ内のファイルをデータストリームとして読み取り、ファイルに書き込みます
コードサンプルは次のとおりです。
import requests
url = 'https://img.alicdn.com/imgextra/i4/1851041537/O1CN01qd5ZSB1NDzO4pNexv-1851041537.jpg_430x430q90.jpg'
with open("image.jpg", "wb") as fp:
r = requests.get(url)
fp.write(r.content)
このようにして、元のリンクから画像ファイルを取得できます。
2.wgetを使用してファイルを直接ダウンロードします
bashコマンドの下で、上記のネットワーク画像を取得したい場合は、次のコマンドを使用するだけで済みます。
wget https://img.alicdn.com/imgextra/i4/1851041537/O1CN01qd5ZSB1NDzO4pNexv-1851041537.jpg_430x430q90.jpg image.jpg
同様に、Pythonには、ファイルをすばやくダウンロードできるwgetライブラリもあります。
import wget
wget.download(url, "image.jpg")