转到社交媒体管理网站上的原始URL

2024-04-19 16:54:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个学术项目的网页抓取,这是很重要的,所有的链接都遵循到实际的内容。令人恼火的是,“社交媒体管理”网站存在一些重要的错误案例,即用户发布链接以检测谁点击了它们。在

例如,考虑this link on linkis.com,它链接到http://+一点点+/1P1xh9J(由于SO发布限制而分开的链接),它反过来链接到http://conservatives4palin.com。由于linkis.com处的原始链接没有自动向前重定向,因此出现了此问题。相反,用户必须单击右上角的叉号以转到原始URL。在

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

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


Tags: 项目用户comhttpurl网页内容网站
3条回答

在许多情况下,您将不得不使用浏览器自动化来刮取使用javascript生成其内容的网页,刮取get请求返回的html将不会产生您想要的结果,您可以在这里选择两个选项:

  • 尝试绕过所有额外的javascript请求来获得您想要的内容,这可能非常耗时。在
  • 使用浏览器自动化(browser automation),它允许您打开一个真正的浏览器并自动化其任务,您可以使用Selenium来实现这一点。在

我已经开发了很多年的bot和scraper,除非你请求的网页不太依赖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()

网站遵循的常见架构是将网站显示为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)

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

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

和13;
和13;

相关问题 更多 >