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

pir*_*pir 6 python regex hyperlink web-scraping

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

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

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

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

Sho*_*rma 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)
Run Code Online (Sandbox Code Playgroud)