在社交媒体管理网站上查看原始网址

时间:2017-06-20 16:36:57

标签: python regex hyperlink web-scraping

我正在进行网络抓取,作为学术项目的一部分,所有链接都必须遵循实际内容。令人讨厌的是,“社交媒体管理”网站存在一些重要的错误情况,用户发布链接以检测是谁点击了这些网站。

例如,考虑this link on linkis.com,它链接到http:// + bit.ly + / 1P1xh9J(由于SO发布限制而分开的链接),后者又链接到http://conservatives4palin.com。由于linkis.com处的原始链接不会自动重定向,因此会出现此问题。相反,用户必须单击右上角的十字形才能转到原始URL。

此外,似乎有不同的变化(参见例如linkis.com link 2,其中十字架位于网站的左下角)。这是我发现的唯一两种变体,但可能还有更多。请注意,我使用的网络抓取工具与this one非常相似。随着时间的推移,实际链接的功能不需要稳定/运行,因为这是一次性的学术项目。

如何自动转到原始网址?最好的方法是设计一个找到相关链接的正则表达式吗?

5 个答案:

答案 0 :(得分:2)

在许多情况下,你必须使用浏览器自动化来抓取使用javascript生成内容的网页,抓取get请求返回的html不会产生你想要的结果,你有两个选择:

  • 尝试了解所有其他javascript请求以获取您想要的内容,这可能非常耗时。
  • 使用浏览器自动化功能,您可以打开真正的浏览器并自动完成任务,您可以使用 Selenium

我多年来一直在开发机器人和刮刀,除非你要求的网页不依赖于javascript,否则你应该使用像selenium这样的东西。

以下是一些让您开始使用selenium的代码:

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()

答案 1 :(得分:1)

根据您提供的两个网站,我认为您可以尝试使用以下代码来获取原始网址,因为它们都隐藏在javascript的一部分中(我使用的主要刮刀代码来自您发布的问题) :



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




答案 2 :(得分:1)

网站遵循的通用架构是将网站显示为iframe。两个案例都会运行示例代码。

为了获得最终的网址,您可以执行以下操作:

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)

答案 3 :(得分: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)

和s现在将是原始位链接的字符串!

答案 4 :(得分:-1)

尝试以下代码:

import requests

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

打印所需的输出:

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