Fate

python获取百度搜索结果的真实URL

Markdown

最近将以前的爬虫代码(针对杭州电子科技大学在线测评系统)拿出来进行测试,发现百度对所有的外链都进行了加密?以前一直没注意过这种问题,然后我尝试了很多方法。

首先,破解百度加密算法是不可能的,我自己尝试了先将外链取出来:

  • 首先我用如下代码将我需要的外链全部弄了出来

    1
    2
    3
    4
    html = str(D(url)) #此处为下载百度搜索界面
    soup = BeautifulSoup(html) #通过BeautifulSoup来做匹配
    list_soup = soup.find('div',{'id':'content_left'})
    links = [link.get('href') for link in list_soup.findAll('a',{'class':'c-showurl'})]
  • 然后我尝试了先对该链接发送一个request,然后获得response,通过response获得原url。我还沾沾自喜,然后发现效率奇慢.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def real_links(links):
    reallinks = []
    url = "http://www.baidu.com/link"
    regex = re.compile(url)
    links = [link for link in links if re.match(regex, link)]
    for link in links:
    try:
    bbase = BrowserBase() #此类乃我封装的一个获得response的类
    response = bbase.openurl(link)
    reallinks.append(response.geturl())
    except Exception as e:
    print str(e)
    return reallinks

解决办法还是在网上找,发现有人早已发现怎么解决这个问题,原来跳转网页的head里面包含了一条location里面就已经包含了原网址!

  • python代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    def get_real_links(links):
    real_links = []
    import requests
    for link in links:
    retry = 2
    while(retry>0):
    try:
    header = requests.head(link).headers
    real_links.append(header['location'])
    break
    except Exception as e:
    print str(e)
    retry-=1
    continue
    return real_links
  • 参考自 如何“破解”百度搜索结果中的加密地址

总结

  • 网上牛人多,遇到问题不要钻牛角尖,别人已经造好了轮子.
  • 独立思考没错,但是一定要谦逊.
  • 道高一尺,魔高一丈.
  • hdu爬虫

热评文章