2017-06-20 14 views
6

私は、アカデミックプロジェクトの一環としてウェブスクレイピングを行っています。そこでは、すべてのリンクが実際のコンテンツに従うことが重要です。耳障りなことに、「ソーシャルメディア管理」サイトにはいくつかの重要なエラーケースがあり、ユーザーはリンクを投稿してクリックを検出します。ソーシャルメディア管理ウェブサイトのオリジナルのURLに移動します

たとえば、http://conservatives4palin.comにリンクしているhttp:// + bit.ly +/1P1xh9J(SOの投稿の制限によりリンクが分かれている)にリンクするthis link on linkis.comを考えてみてください。 linkis.comの元のリンクは自動的に転送されないため、問題が発生します。代わりに、ユーザーは元のURLに移動するには右上隅の十字をクリックする必要があります。

さらに、さまざまなバリエーションがあるようです(たとえば、linkis.com link 2、ここで十字はウェブサイトの左下にあります)。これらは私が見つけた唯一の2つのバリエーションですが、それ以上のものもあります。私はthis oneとよく似たウェブスクレーパーを使用しています。これは1回限りの学術プロジェクトであるため、実際のリンクに進む機能は時間の経過と共に安定している必要はありません。

自動的に元のURLに移動しますか?最良のアプローチは関連リンクを見つける正規表現を設計することでしょうか?

+0

「unshorten URLパイソン」を探している答えが、を記述する時間がないが、あなたのコードは動作しません – Josay

答えて

1

共通のアーキテクチャは、IFRAMEとしてウェブサイトを示すことです。サンプルコードは、両方のケースで実行されます。あなたはこのような何か行うことができ、最終的なURLを取得するために

import requests                                               
from bs4 import BeautifulSoup                                           

urls = ["http://linkis.com/conservatives4palin.com/uGXam", "http://linkis.com/paper.li/gsoberon/jozY2"]                         
response_data = []                                              

for url in urls:                                              
    response = requests.get(url)                                          
    soup = BeautifulSoup(response.text, 'html.parser')                                     
    short_url = soup.find("iframe", {"id": "source_site"})['src']                                  
    response_data.append(requests.get(short_url).url)                                     

print(response_data) 
+0

より強固に見える。あなたはこれを試しましたか?一貫して動作するならば、私は恩恵を喜んで与えるでしょう。 – pir

+0

私はいくつかのランダムなリンクで試してみました。あなたが書いたコードでプラグインすることができます。それが動作するかどうかを確認します。 –

+0

サイトが他の種類の紹介に同じコードを使用しているかどうか知っていますか?たとえば、私は埋め込まれたビデオなどをキャッチしたくないでしょう。私は、ページ全体がどこか他の場所から埋め込まれている時間を捉えるだけです。 – pir

0

あなたはhref属性/値をつかむことができるしていると言う:

s = 'href="/url/go/?url=http%3A%2F%2Fbit.ly%2F1P1xh9J"' 

その後、あなたは次のことを実行する必要があります。

import urllib.parse 
s=s.partition('http') 
s=s[1]+urllib.parse.unquote(s[2][0:-1]) 
s=urllib.parse.unquote(s) 

との今元のビットの文字列になります-lyリンク!それは所望の出力印刷し

import requests 

url = 'http://'+'bit.ly'+'/1P1xh9J' 
realsite = requests.get(url) 
print(realsite.url) 

-1

は、次のコードを試してみてください、あなたが与えられた2つのウェブサイトによると

http://conservatives4palin.com/2015/11/robert-tracinski-the-climate-change-inquisition-begins.html?utm_source=twitterfeed&utm_medium=twitter 
1

を、私はあなたが、元を取得するには、次のコードを試してみてくださいかもしれないと思いますそれらのすべてがjavascriptの一部に隠されているURL(私が使用している主なスクレーパーコードは投稿した質問からです):

try: 
 
    from HTMLParser import HTMLParser 
 
except ImportError: 
 
    from html.parser import HTMLParser 
 

 
import requests, re 
 
from contextlib import closing 
 

 
CHUNKSIZE = 1024 
 
reurl = re.compile("\"longUrl\":\"(.*?)\"") 
 
buffer = "" 
 
htmlp = HTMLParser() 
 
with closing(requests.get("http://linkis.com/conservatives4palin.com/uGXam", stream=True)) as res: 
 
    for chunk in res.iter_content(chunk_size=CHUNKSIZE, decode_unicode=True): 
 
     buffer = "".join([buffer, chunk]) 
 
     match = reurl.search(buffer) 
 
     if match: 
 
      print(htmlp.unescape(match.group(1)).replace('\\','')) 
 
      break
多くの場合、

+0

あなたがヒントを与えるかもしれませんインポートステートメントが足りなくても、それを追加してもまだ動作していません – SEDaradji

+0

インポートステートメントを追加しました。私の環境で動作しているようですが、作業していないということを意味しましたか?コードエラーが発生していますか? – edenPan

+0

今働いています – SEDaradji

2

、あなたは、GET要求によって返されたHTMLをこする、JavaScriptを使用してコンテンツを生成するWebページをこすりするために、ブラウザの自動化を使用する必要がありますあなたが望む結果を得られません、次の2つを持っていますここのオプション:

  • 追加のjavascriptリクエストの周りにあなたが望むコンテンツを得るために時間を浪費してください。
  • ブラウザの自動化を使用すると、実際のブラウザを開いてタスクを自動化することができます。Seleniumを使用できます。

私は数年前からボットとスクレーパーを開発してきました。要求しているウェブページがJavaScriptに大きく依存しない限り、セレンのようなものを使うべきです。ここで

あなたはセレンを始めるためにいくつかのコードは次のとおりです。ウェブサイトは、以下の

from selenium import webdriver 

#Create a chrome browser instance, other drivers are also available 
driver = webdriver.Chrome()  

#Request a page 
driver.get('http://linkis.com/conservatives4palin.com/uGXam') 

#Select elements on the page and trigger events 
#Selenium supports also xpath and css selectors 
#Clicks the tag with the given id 
driver.find_elements_by_id('some_id').click() 
+0

ありがとう!なぜ、「getリクエストで返されたhtmlをスクラップしても、結果が得られない」という理由を広げることができますか? – pir

+0

ほとんどの場合、ページをリクエストすると完全なHTMLが読み込まれず、最初の読み込み後にブラウザが追加のXHRまたはjavascriptリクエストを行い、フルページを表示します。 (クロムではf12キーを押すことができます)、ウェブページを開いた後の最初のレスポンスは、requests.getを使用したときに一般的に得られるもので、それ以降に何個のリクエストが行われるかを見ることができます... – SEDaradji

+0

リクエストが最後のリクエストを取得するだけの理由は何ですか?どのようにサーバーはセレンとは別にそれを伝えることができますか? – pir

関連する問題