【Python】python如何获取百度搜索结果的真实URL

想通过爬虫获取百度搜索结果的原始链接。通过Firefox的HttpFox插件,发现在搜索结果的URL是加密过的,例如:
http://www.baidu.com/link?url=w0Kz2y9t3Ne9YtTTkZ1M_ToY43HWy3tia4djxC8u9CC
点击链接之后,会向该链接发送GET,从服务器得到的回复中包含真实URL:
http://www.python.org
【Python】python如何获取百度搜索结果的真实URL

想通过python爬虫模拟这个过程:
1.获取关键字,构造百度搜索URL(借助Firefox自带的百度搜索,构建简化的搜索链接)

  1. 通过pyquery获取页面中所有的搜索结果URL:
    [(site.attr('href'), site.text().encode('utf-8')) for site in self.page('div.result.c-container h3.t a').items()]
    //不知道这个items()方法在这里用的对不对

  2. 向加密后的URL发起GET请求,试图获得HttpFox中获取到的content

  3. 提取真实URL,进行显示

目前可以获取到页面加密后的URL(但是针对相同的一个网址每次获取的加密后URL都不同,可以理解),但是第3步获取到的页面,不是httpfox中的那个页面,而是很复杂的页面(应该是跳转之后到页面)。
尝试了requests.get()中设定参数allow_redirects=False,但是获取的回复也不是httpfox的那个content。

想请各位大拿指点一二。。。。
代码如下:

#!/usr/bin/python

#coding=utf-8

import re

import requests

from pyquery import PyQuery as Pq

class BaiduSearchSpider(object):

def __init__(self, searchText):

self.url = "http://www.baidu.com/baidu?wd=%s&tn=monline_4_dg" % searchText

self.headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/600.5.17 (KHTML, like Gecko) Version/8.0.5 Safari/600.5.17"}

self._page = None

@property

def page(self):

if not self._page:

r = requests.get(self.url, headers=self.headers)

r.encoding = 'utf-8'

self._page = Pq(r.text)

return self._page

@property

def baiduURLs(self):

return [(site.attr('href'), site.text().encode('utf-8')) for site in self.page('div.result.c-container h3.t a').items()]

@property

def originalURLs(self):

tmpURLs = self.baiduURLs

print tmpURLs

originalURLs = []

for tmpurl in tmpURLs:

tmpPage = requests.get(tmpurl[0])

#tmpPage.encoding = 'utf-8' #这样不好使,print的时候python报错

tmptext = tmpPage.text.encode('utf-8')

urlMatch = re.search(r'URL=\'(.*?)\'', tmptext, re.S)

if not urlMatch == None:

print urlMatch.group(1), " ", tmpurl[1]

originalURLs.append(tmpurl)

else:

print "---------------"

print "No Original URL found!!"

print tmpurl[0]

print tmpurl[1]

return originalURLs

searchText = raw_input("搜索内容是:")

print searchText

bdsearch = BaiduSearchSpider(searchText)

originalurls = bdsearch.originalURLs

print '=======Original URLs========'

print originalurls

print '============================'

回答

自己解决。
通过pyquery的history属性,发现baidu这些连接大多进行了redirect(http 302),但是有一部分链接是直接获得了http200回复。对于从百度爬取的加密的url,进行requests.get()时不允许跳转(allow_redirects=False)。然后针对这两类服务器回复分别处理:
http 302跳转:从headers中的'location'可以获得原始url;
http 200回复:从content中通过正则表达式获取原始url
对上述代码中的def originalURLs(self)函数进行修改:

    for tmpurl in tmpURLs:

tmpPage = requests.get(tmpurl[0], allow_redirects=False)

if tmpPage.status_code == 200:

urlMatch = re.search(r'URL=\'(.*?)\'', tmpPage.text.encode('utf-8'), re.S)

originalURLs.append((urlMatch.group(1), tmpurl[1]))

elif tmpPage.status_code == 302:

originalURLs.append((tmpPage.headers.get('location'), tmpurl[1]))

else:

print 'No URL found!!'

抓了几页,发现绝大部分url是通过302跳转的。不知道为什么httpfox上会看到好多是200OK状态的。

求问博主最后是否解决了问题,最近想爬取链接,不知道如何才能爬取到真实URL

import urllib2
response = urllib2.urlopen(target_url)
realurl = response.geturl()
print(realurl)

以上是 【Python】python如何获取百度搜索结果的真实URL 的全部内容, 来源链接: utcz.com/a/78534.html

回到顶部