python如何对google搜索的结果进行抓取分析。

xtubieshawo 2011-10-15 09:45:57
这里面要牵扯到解码编码问题,比如这道题“从google搜索网页,获取每条新闻题目/URL/内容描述/时间”怎么写?
...全文
792 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
yby4769250 2011-10-15
  • 打赏
  • 举报
回复
前不久,写了一个抓取google音乐的脚本,观察搜索页面返回的HTML结构后,全用正则表达式提取信息

#! /usr/bin/env python
#coding=utf-8

'''
Created on 2011-8-19

@author: yaoboyuan
'''

from urllib import request,parse
import re,sys

def extractSongRawData(text):
'抓取每一首歌的原始数据'
text = re.sub('\n+','',text)
songList = re.findall('\<tbody.*?\</tbody>',text)
nums = len(songList)
print('Find ' + str(nums) + ' songs')
return songList

def translate(text):
'去掉text中的无用字符,转换unicode码'
text = re.sub('\<b>','',text)
text = re.sub('\</b>','',text)

#find the 成 and translate into chinese
s = re.findall('&#([0-9]+);',text)
if len(s)<=0:
return text
else:
text = ''
for i in range(len(s)):
value = int(s[i],10) #from str'123' to 10 base's int 124
text += chr(value) #from value to char

return text

def extractSongName(song):
'提取歌曲名字'
td = re.findall('(?:\<td class\="Title).*(?:\</td>)',song)
name = re.findall('.+?\<a.+?>(.*?)\</a>',td[0])

songName = translate(name[0])
return songName

def extractAuthorName(song):
'提取作者名字'
td = re.findall('(?:\<td class\="Artist).*(?:\</td>)',song)
name = re.findall('.+?\<a.+?>(.*?)\</a>',td[0])
authorName = name[0]

authorName = translate(authorName)
return authorName

def extrackAlbumName(song):
'提取专辑名字'
td = re.findall('(?:\<td class\="Album).*(?:\</td>)',song)
name = re.findall('.+?\<a.+?>(.*?)\</a>',td[0])

albumName = translate(name[0])
return albumName

def extractID(song):
'提取歌曲id'
td = re.findall('''\<tbody id\="([a-zA-Z0-9]+)"''',song)
if len(td)>0:
return td[0]
else:
return song

def extractLink(song):
'提取歌曲下载链接'
td = re.findall('''\<td class\="Icon.*?(?=title\="下载").*?onclick\="(.*?)>''',song)
if len(td) == 0:
return 'NULL'
s = str(td[0])
rawLink = re.findall('http.*?(?=\?)',s)
if len(rawLink) == 0:
return s

link = rawLink[0]
link = re.sub('%3D','=',link)
id = extractID(song)
return link + '?id=' + id

def extractPageNums(text):
'提取返回结果的页数,最多要10页'
pageList = re.findall('page_link',text)
return len(pageList)

def extractSongInfo(song):
'提取歌曲信息,返回歌曲列表'
songList = []
for i in range(len(song)):
songName = extractSongName(song[i])
authorName = extractAuthorName(song[i])
albumName = extrackAlbumName(song[i])
link = extractLink(song[i])

songItem = [songName,authorName,albumName,link]
songList.append(songItem)

return songList

def main():
while True:
url = 'http://www.google.cn/music/search?q='
key = input('请输入歌曲名字或关键字:')

key = parse.quote(key) #统一编码成utf-8
url += key

mf = request.urlopen(url)
c = mf.readall()
c = str(c,encoding = 'utf-8')

num = extractPageNums(c)
print(str(num+1) + ' pages found')

song = extractSongRawData(c)
songList = extractSongInfo(song)

#if the result great than 2 pages, then request all pages
if num>0:
for i in range(num):
start = (i+1)*20
next_page = '&cat=song&start=%d'%(start)
#next_page = parse.quote(next_page) #统一编码成utf-8
url += next_page

mf = request.urlopen(url)
c = mf.readall()
c = str(c,encoding = 'utf-8')

song = extractSongRawData(c)
songList += extractSongInfo(song) #find all results
for i in range(len(songList)): #print the result
index = ''
if i<9:
index = '0' + str(i+1)
else:
index = str(i + 1)

print(index + ' ' + str(songList[i]))



if __name__ == '__main__':
main()
ponder008 2011-10-15
  • 打赏
  • 举报
回复
这用脚本要用3.x才能运行
[Quote=引用 1 楼 yby4769250 的回复:]

前不久,写了一个抓取google音乐的脚本,观察搜索页面返回的HTML结构后,全用正则表达式提取信息
Python code

#! /usr/bin/env python
#coding=utf-8

'''
Created on 2011-8-19

@author: yaoboyuan
'''

from urllib import request,parse
import re,sy……
[/Quote]

37,722

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧