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

时间:2022-12-08 08:04:26

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

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

解析百度返回过来的页面的源代码。通过查看源代码分析url特征:

1.返回的源代码里链接一大堆,但是却有个唯一的东西,对应着某page的10个链接。“ id="0"”、“ id="1"”、....“ id="9"”这些是唯一的(注意id前面有空格,0-9分别代表这10个页面)。

2.找到那些唯一的标识后,在源代码中其后的几行内必定有如下之类的:

<pre name="code" class="html"> href = "http://www.baidu.com/link?url=6RUpkBgbzwqS3Z2zDU8mbrP9JS1T54ExlU3L26jGpc6ma5xHAZC4AY9zqy8fpaXn"

target="_blank"

>艾尼路说的“<em>无限大地</em>
 

 href = "http://www.baidu.com/link?url=Duw3DYuorgKn4cdnxMsCmlNczUsUYgnsi3wakU6SA6BrQZEcA54vd-rO5Rfzj8GK"

target="_blank"

>3rd的最终BOSS圣痕最后还是被我<em>无限大地</em>


 

取出href到query之间的字符串,然后做些处理,取出来即可。

# 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
'''
解析url字符串函数myurldecode(),没有用上场,无碍。因为觉得转码后的url太难看了,解码回来后更好看些,但是没必要,最终还是会被转回去,无碍。以后需要解析的时候再参考这次写的函数。