我正在进行网络抓取,作为学术项目的一部分,所有链接都必须遵循实际内容。令人讨厌的是,“社交媒体管理”网站存在一些重要的错误情况,用户发布链接以检测是谁点击了这些网站。
例如,考虑this link on linkis.com,它链接到http:// + bit.ly + / 1P1xh9J(由于SO发布限制而分开的链接),后者又链接到http://conservatives4palin.com。由于linkis.com处的原始链接不会自动重定向,因此会出现此问题。相反,用户必须单击右上角的十字形才能转到原始URL。
此外,似乎有不同的变化(参见例如linkis.com link 2,其中十字架位于网站的左下角)。这是我发现的唯一两种变体,但可能还有更多。请注意,我使用的网络抓取工具与this one非常相似。随着时间的推移,实际链接的功能不需要稳定/运行,因为这是一次性的学术项目。
如何自动转到原始网址?最好的方法是设计一个找到相关链接的正则表达式吗?
答案 0 :(得分:2)
在许多情况下,你必须使用浏览器自动化来抓取使用javascript生成内容的网页,抓取get请求返回的html不会产生你想要的结果,你有两个选择:
我多年来一直在开发机器人和刮刀,除非你要求的网页不依赖于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