如题: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
原文地址:http://blog.csdn.net/u010454729/article/details/40543815