この webpage の各画像にリンクされているすべてのリンクを取得しようとしています。
Seleniumスクリプトを下までスクロールさせれば、すべてのリンクを取得できます。私がスクレイプしたいそのようなリンクの1つは this one です。
ここでの私の目標は、リクエストを使用してこれらすべてのリンクを解析することです。私が解析したいリンクがそのようなB-uPwZsJtnB
ショートコードを使用して構築されていることに気づきました。
ただし、私は、そのWebページのページソースにあるスクリプトタグで利用できるさまざまなshortcode
を取得しようとしています。そのページには約600 shortcodes
があります。私が作成したスクリプトは、最初の70
などのshortcode
のみを解析でき、最終的には70の限定リンクを構築できます。
リクエストを使用して600リンクすべてを取得するにはどうすればよいですか?
私はこれまでに試しました:
import re
import json
import requests
base_link = 'https://www.instagram.com/p/{}/'
lead_url = 'https://www.instagram.com/explore/tags/baltimorepizza/'
with requests.Session() as s:
s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'
req = s.get(lead_url)
script_tag = re.findall(r"window\._sharedData[^{]+(.*?);",req.text)[0]
for item in json.loads(script_tag)['entry_data']['TagPage']:
tag_items = item['graphql']['hashtag']['Edge_hashtag_to_media']['edges']
for elem in tag_items:
profile_link = base_link.format(elem['node']['shortcode'])
print(profile_link)
requests
を使用して実行する場合は、XHR/Ajax Httpリクエストを照会してLazy loadを模倣することを検討してください。次の図を参照してください。
JSレイジーロードページをPython requests postでスクレイピングする)のように、instagram.comサーバーにクエリを実行します。
動的なCookieの値や、Instagramによって課される他のスクレイピング防止のために、そのタスクを完了できない場合があります。
GDPRのためにInstagramのパブリックデータを使用するには同意が必要なため、商用製品を構築している場合は、 Instagram Graph API を使用することをお勧めします。このAPIは作業を容易にしますが、ユーザートークンごとに7日間30の検索をクエリできるなどのAPIの制限の下で。
非商用ツールを構築している場合、2つのアプローチがあります。
Instagramのウェブページを直接削ります。上記の回答で述べたように、WebページはJavaScriptを使用して画像のURLを生成するため、Seleniumを使用してページの相互作用を自動化できます。このメソッドの短所は、インスタグラムとFacebookがスクレイピングメソッドを実行して、動的に生成されたクラスでHTML要素をラップするなどのデータのスクレイピングを防ぎ、xpathを頻繁に変更することです。コーディングと修正に多くの時間を費やす必要があるかもしれません。
Instagramデータをこするために構築されたサードパーティのライブラリを使用します。 githubには多くのオープンソースのサードパーティライブラリがあり、 instaloader が私のお気に入りです。 単一のコマンド を使用して、すべてのハッシュタグ検索結果をダウンロードできます。このライブラリは、画像をダウンロードするだけでなく、画像に関連する投稿の data json もダウンロードします。ライブラリのメンテナーがいるので、後でInstagramのWebページが変更されることを心配する必要はありません。あなたの場合はこの方法をお勧めします。
InstagramのWebページは、遅延読み込みを使用して画像を読み込みます。これは2つの方法で克服できます。
最初の方法はそれを行うためのより良い方法です。