我正在做一个学术项目的网页抓取,这是很重要的,所有的链接都遵循到实际的内容。令人恼火的是,“社交媒体管理”网站存在一些重要的错误案例,即用户发布链接以检测谁点击了它们。在
例如,考虑this link on linkis.com,它链接到http://+一点点+/1P1xh9J(由于SO发布限制而分开的链接),它反过来链接到http://conservatives4palin.com。由于linkis.com处的原始链接没有自动向前重定向,因此出现了此问题。相反,用户必须单击右上角的叉号以转到原始URL。在
此外,似乎还有不同的变体(参见例如linkis.com link 2,其中十字架位于网站左下角)。这是我发现的仅有的两种变体,但可能还有更多。注意,我使用的是一个与this one非常相似的刮板。通过实际链接的功能不需要随着时间的推移而稳定/运行,因为这是一个一次性的学术项目。在
如何自动转到原始URL?最好的方法是设计一个能找到相关链接的正则表达式吗?在
在许多情况下,您将不得不使用浏览器自动化来刮取使用javascript生成其内容的网页,刮取get请求返回的html将不会产生您想要的结果,您可以在这里选择两个选项:
我已经开发了很多年的bot和scraper,除非你请求的网页不太依赖javascript,否则你应该使用selenium之类的东西。在
下面是一些让您开始使用selenium的代码:
网站遵循的常见架构是将网站显示为iframe。这两种情况下都运行示例代码。在
为了获得最终的URL,您可以执行以下操作:
根据您给出的两个网站,我想您可以尝试以下代码来获取它们的原始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
;