web-dev-qa-db-ja.com

リクエストを使用してWebページからすべてのリンクを取得できません

この 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)
7
robots.txt

requestsを使用して実行する場合は、XHR/Ajax Httpリクエストを照会してLazy loadを模倣することを検討してください。次の図を参照してください。

enter image description here

JSレイジーロードページをPython requests postでスクレイピングする)のように、instagram.comサーバーにクエリを実行します。

免責事項

動的なCookieの値や、Instagramによって課される他のスクレイピング防止のために、そのタスクを完了できない場合があります。

2
Igor Savinkin

GDPRのためにInstagramのパブリックデータを使用するには同意が必要なため、商用製品を構築している場合は、 Instagram Graph API を使用することをお勧めします。このAPIは作業を容易にしますが、ユーザートークンごとに7日間30の検索をクエリできるなどのAPIの制限の下で。

非商用ツールを構築している場合、2つのアプローチがあります。

  1. Instagramのウェブページを直接削ります。上記の回答で述べたように、WebページはJavaScriptを使用して画像のURLを生成するため、Seleniumを使用してページの相互作用を自動化できます。このメソッドの短所は、インスタグラムとFacebookがスクレイピングメソッドを実行して、動的に生成されたクラスでHTML要素をラップするなどのデータのスクレイピングを防ぎ、xpathを頻繁に変更することです。コーディングと修正に多くの時間を費やす必要があるかもしれません。

  2. Instagramデータをこするために構築されたサードパーティのライブラリを使用します。 githubには多くのオープンソースのサードパーティライブラリがあり、 instaloader が私のお気に入りです。 単一のコマンド を使用して、すべてのハッシュタグ検索結果をダウンロードできます。このライブラリは、画像をダウンロードするだけでなく、画像に関連する投稿の data json もダウンロードします。ライブラリのメンテナーがいるので、後でInstagramのWebページが変更されることを心配する必要はありません。あなたの場合はこの方法をお勧めします。

0
Sajith Herath

InstagramのWebページは、遅延読み込みを使用して画像を読み込みます。これは2つの方法で克服できます。

  1. コメントに記載されている Instagram API を使用します
  2. Selenium などのツールを使用して、ページのすべての画像を scrolling で下部にロードし、リンクをフェッチします。

最初の方法はそれを行うためのより良い方法です。

0
BBloggsbott