2017-06-20 81 views
6

Robię skrobanie przez Internet w ramach projektu akademickiego, w którym ważne jest, aby wszystkie linki były śledzone do rzeczywistej treści. Irytujące jest to, że istnieją pewne ważne przypadki błędów w witrynach "zarządzania mediami społecznościowymi", w których użytkownicy umieszczają swoje linki w celu wykrycia, kto je klika.Przejdź do oryginalnego adresu URL na stronach zarządzania mediami społecznościowymi

Na przykład rozważ adres this link on linkis.com, który prowadzi do http: // + bit.ly +/1P1xh9J (oddzielony link z powodu ograniczeń związanych z publikowaniem SO), który z kolei łączy się z http://conservatives4palin.com. Problem pojawia się, ponieważ oryginalny link pod numerem linkis.com nie powoduje automatycznie przekierowania do przodu. Zamiast tego użytkownik musi kliknąć krzyżyk w prawym górnym rogu, aby przejść do pierwotnego adresu URL.

Ponadto wydaje się, że istnieją różne odmiany (patrz np. linkis.com link 2, gdzie krzyż znajduje się w lewym dolnym rogu strony). Są to jedyne dwie odmiany, które znalazłem, ale może być ich więcej. Zauważ, że używam skrobaczki internetowej podobnej do this one. Funkcjonalność przejścia do rzeczywistego łącza nie musi być stabilna/funkcjonująca w czasie, ponieważ jest to jednorazowy projekt akademicki.

Jak automatycznie przejść do pierwotnego adresu URL? Czy najlepszym rozwiązaniem byłoby zaprojektowanie regexu, który znajdzie odpowiedni link?

+0

Nie ma czasu na napisanie odpowiedzi ale patrząc na „unshorten URL Pythona” może dać ci wskazówki – Josay

Odpowiedz

1

Wspólna architektura że strona następujący sposób jest to, że pokazuje stronę jako iframe. Przykładowy kod działa dla obu przypadków.

W celu uzyskania ostatecznej URL można zrobić coś takiego:

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

wydaje się bardziej solidny. Czy próbowałeś tego? Jeśli to działa konsekwentnie, z chęcią dam ci nagrodę. – pir

+0

Próbowałem go na kilku losowych linkach. Możesz go podłączyć za pomocą kodu, który napisałeś. Sprawdź, czy to działa. –

+0

Czy wiesz, że w przypadku witryn używających tego samego kodu dla innych typów skierowań? Na przykład, nie chciałbym łapać osadzonych filmów itp. Muszę tylko złapać czasy, w których cała strona jest osadzona z innego miejsca. – pir

0

powiedzieć, że jesteś w stanie chwycić atrybutu href/wartość:

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

następnie trzeba wykonać następujące czynności:

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

i s teraz będzie ciągiem oryginalnego bitu -połącz link!

-1

spróbować następujący kod:

import requests 

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

wypisuje pożądany wynik:

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

Zdaniem obu stronach, że podane, myślę, że można spróbować następujący kod aby otrzymać oryginał adres URL dla wszystkich ukrytych w części javascript (główny kod zgarniacza, którego używam, pochodzi z pytania, które publikujesz):

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

Twój kod nie działa, brakuje instrukcji importu, a nawet po ich dodaniu, nadal nie działa – SEDaradji

+0

Dodaję instrukcje importu. Wydaje się, że praca w moim środowisku. Co miałeś na myśli, że nie działa? Czy jest jakiś błąd kodu lub po prostu nie można go uzyskać? – edenPan

+0

Działa teraz – SEDaradji

2

W wielu przypadkach będzie trzeba użyć automatyzacji przeglądarki zeskrobać stron internetowych, które generują ich zawartości przy użyciu javascript, skrobanie html zwrócony przez żądanie GET nie przyniesie pożądanego rezultatu, masz dwie Opcje tutaj:

  • Postaraj się ominąć wszystkie dodatkowe żądania javascript, aby uzyskać pożądane treści, co może być bardzo czasochłonne.
  • Użyj automatyzacji przeglądarki, która pozwala otworzyć prawdziwą przeglądarkę i automatyzować jej zadania, możesz użyć do tego celu Selenium.

Od lat rozwijam boty i skrobaczki, a jeśli strona, o którą prosisz, nie polega w dużym stopniu na javascript, powinieneś użyć czegoś takiego jak selen.

Oto kod, aby zacząć z selenem:

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

Dzięki! Czy możesz wyjaśnić, dlaczego "zgarnianie html zwrócony przez żądanie get nie przyniesie pożądanego rezultatu"? – pir

+0

W większości przypadków kompletny kod HTML nie jest ładowany po zażądaniu strony, zamiast tego dodatkowe żądania XHR lub javascript są wykonywane przez przeglądarkę po pierwszym załadowaniu w celu wyświetlenia pełnej strony, można to zobaczyć za pomocą dowolnej przeglądarki w narzędziach programistycznych -> sieci , (w chrome możesz nacisnąć klawisz f12), pierwsza odpowiedź po otwarciu strony jest tym, co zwykle uzyskujesz, gdy korzystasz z pliku request.get, i możesz obserwować, ile kolejnych żądań jest wykonywanych po tym ... – SEDaradji

+0

OK., dziękuję. Dlaczego prośby nie mogą zostać pobrane po ostatnim żądaniu? W jaki sposób serwery mogą odróżnić go od Selenium? – pir