首页 > SEO知识 > ITSEO习题记录
2016
03-04

ITSEO习题记录

昆哥出了个习题,关于百度加密URL的解析,第一反应是用Python去将URL全部跑一遍,然后获取转码之后的地址。后来夜息表示用shell一句话即可解决,之前在shell、Python方面没什么经验,通过这个题目,发现自己在这方面还要多下功夫。

现将两种方法记录下来,以备不时之需;

首先题目给出了几百条百度加密URL,类似

http://www.baidu.com/link?url=qmz_n_yViU9q25HmUufweyOONBXwRtfgMSqXqdeozkmmdzc3FvSY8v6sMNEHbPuuNNOvSVXnhMgnKxpGBWo10a

这就是用户点击百度搜索结果之后跳转前的地址,地址通过302跳转之后得到的实际结果是

http://www.yihaojiaju.com/xuancai/35836.html

那么也就是说得到后面的结果即为标准答案。

先看Python的解决方案:

#coding:utf-8

import urllib2  #因为涉及到url操作,所以先导入urllib模块,

for url in open(‘url.txt’):      #for循环,枚举文件中的url进行循环处理

print urllib2.urlopen(url).geturl()   #urlopen()-打开URL,geturl()-获得重定向之后的地址 即把重定向之后的地址打印出来

该方法可以处理,不过用昆哥的话说比较慢,效率比较低。

这里有一个关键要素,这个地址是百度的地址,访问稳定,302地址,在302的地址头中,有跳转页的地址,所以直接获取URL的头部信息,并把跳转地址抓出来,而不需要跳转到最终页面。

用shell的解法:

curl -s “URL” | awk ‘{print “curl -sI \””$0″\”| grep Location”}’ | sh

静音模式下返回当前URL数据;awk抽取出location信息,并打印

Python应该也可以通过获取头部的location信息直接打印,但是刚测试了一下没办法打印出来,所以先mark一下,等后期再继续更新。


3/5 补充:

Python更新代码:

#coding:utf-8

import requests

urlfile=requests.get(“url.txt”).text

urllist=urlfile.split(‘\n’)

for url in urllist:

header = requests.head(url).headers

print header[‘location’]

同时收录Java版本和php版本如下:

Java版:

Connection.Response res = Jsoup.connect(“https://www.baidu.com/link?url=NsHkjUPGl_mZhzM-TUlu6ZfyO3os9ubGKhDv9XiMklKxONjEtFTVLyrKWiW50gJzRFL2hChm_hkarUGQkmwPS_”).timeout(60000).method(Connection.Method.GET).followRedirects(false).execute();
String str= res.header(“Location”);

php版:

<?php

foreach (file(‘url.txt’) as $url) {
stream_context_set_default(array(‘http’ => array(‘method’ => ‘HEAD’)));
$headers = get_headers(trim($url), 1);
echo $headers[‘Location’];
}

 

 


留下一个回复

你的email不会被公开。

Protected by WP Anti Spam