码迷,mamicode.com
首页 > 编程语言 > 详细

python解析百度网页源代码:取搜索引擎返回的前page_num*10个链接的url

时间:2014-10-28 20:09:17      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:python   信息检索   搜索引擎   url   

如题:python解析百度网页源代码:取搜索引擎返回的前page_num*10个链接的url

最近因为做《信息检索》homework,需要在搜索引擎中搜索某个query,人工查找那些搜索引擎返回的链接,判断前30个是否相关,然后评价该搜索引擎的性能。蛋疼的一个个点进去链接,然后看网页搜索的内容是否和想要查询的query相关,从而进行下一步工作。于是想到解析网页,找到搜索引擎返回的链接的url,等做完了作业才做这个,无碍。目前分析了百度的源代码,进行了分析工作。对于其他搜索引擎的任务再分析

# coding:utf-8
'''
Created on 2014年10月27日
@author: shifeng
'''
import urllib2
import urllib
import string
import re
#------------------------------------------------------------------------------------------
# 将得到的url,进行解析,如http://v.baidu.com/v?s=8word=无限开关fr=ala11
def myurldecode(url):
    list_url_sub = url.split("&")
    s_after_decode = ""
    for i in range(len(list_url_sub)):  # 用&将各个字段隔开
        dict = {}
        # print list_url_sub[i],"+"
        if "=" in list_url_sub[i]:
            list = list_url_sub[i].split("=")
            key = list[0]
            value = list[1]
            # 编辑器问题,在这Eclipse+PyDev编辑器下,乱转,汗
            value_decode = urllib.unquote(value.encode("GB2312")).decode("GB2312")
            s_after_decode = s_after_decode + key + "=" + value_decode + "&"
        else:
            s_after_decode = s_after_decode + list_url_sub[i] + "&"
    s_after_decode = s_after_decode[:-1]
    # print s_after_decode
    return s_after_decode
#------------------------------------------------------------------------------------------
# 解析百度搜索引擎返回出来的10个网页链接,(其他的不可,但也应当有规律)
# 关键:“ id='i'”(i=1--10),这一部分是唯一的,
# 取“ id='i'”到输入的query“无限开关”之间的字符,
# 找到这唯一的部分之后,取其中“href”到“target”部分之间即为10个链接
def my_Get_link_url(str_url_inbaidu, list_url_query_baidu,query):
    m = urllib2.urlopen(str_url_inbaidu).read()
    m = m.decode("utf-8")
    m = m.replace("\n", " ")  # 坑爹,正则匹配到换行就结束了么?必须要把源代码里的换行符去掉才行
    for i in range(10):
        str_list = re.compile(' id=\"' + str(i + 1) + '\".*?' + query)  # 注意中文编码问题
        for j in str_list.finditer(m):
            # 截到了“ id="1"”到query“无限开关”之间的字符串,然后匹配到“href”到“target”之间的,再做些处理即可。
            str_id_to_query = j.group()
            url_1 = str_id_to_query[str_id_to_query.find("href"):str_id_to_query.find("target")].replace(" ", "")
            # 注意要去掉空格,有的取出来的是形如“href = "”,而不是“href="”
            # 去掉前面乱七八糟的:“href="”,然后去掉后面乱七八糟的:“" ”。
            url_2 = url_1[len("href=\""):]
            url = url_2[:url_2.find("\"")]
            list_url_query_baidu.append(url)
            #------------------------------------------------------
            # 对url进行解码处理
            #url_decode = ""
            #url_decode = url_decode.decode("utf-8")
            #url_decode = myurldecode(url)
            #------------------------------------------------------
            #print url
            # print url_decode#type(url_decode),
    return list_url_query_baidu
#-------------------------------------------------------------------------------------------------------
# print myurldecode(str_url_inbaidu)        #真特么蛋疼,转初始url却不行,GB2312换成utf-8才行。可换成了utf-8,那些链接url就不能转
query=u"无限大地"
page_num=50
str_url_inbaidu="http://www.baidu.com/s?wd="+query+"&pn="+str(page)+"0&oq="+query+"&tn=baiduhome_pg&ie=utf-8&usm=3&rsv_idx=1&f=8&rsv_bp=1"
list_url_query_baidu = []  # 将10个link都存在这里
list_all_url=[]
for page in range(page_num):
    str_url_inbaidu="http://www.baidu.com/s?wd="+query+"&pn="+str(page)+"0&oq="+query+"&tn=baiduhome_pg&ie=utf-8&usm=3&rsv_idx=1&f=8&rsv_bp=1"
    #print str_url_inbaidu
    #my_Get_link_url,以10,也即一页为单位返回一个列表10个url,有多少页,也即list_all_url的长度为page的大小
    #而其中每个元素为一列,其中一个元素为一个列表,也即一页10个url,长度为10
    list=my_Get_link_url(str_url_inbaidu,list_url_query_baidu,query)
    list_all_url.append(list)
#print len(list_all_url)
for i in range(len(list_all_url)):
    #print len(list_all_url[i])
    print "这是第",str(i+1),"页的10个页面:"
    for j in range(len(list_all_url[i])):
        print "这是第",str(i+1),"页的第",str(j+1),"个链接url:",list_all_url[i][j]
'''
# str_url_inbaidu="http://www.baidu.com/s?wd=%E6%97%A0%E9%99%90%E5%BC%80%E5%85%B3&rsv_spt=1&issp=1&f=8&rsv_bp=0&ie=utf-8&tn=baiduhome_pg&bs=%E6%97%A0%E9%99%90%E5%A4%A7%E5%9C%B0"
# my_Get_link_url(str_url_inbaidu,list_url_query_baidu,query)
# page=3
'''


python解析百度网页源代码:取搜索引擎返回的前page_num*10个链接的url

标签:python   信息检索   搜索引擎   url   

原文地址:http://blog.csdn.net/u010454729/article/details/40543815

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!