免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4644 | 回复: 0
打印 上一主题 下一主题

python向百度发送搜索请求,并下载搜索内容 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-19 23:56 |只看该作者 |倒序浏览
本帖最后由 Tinylamb 于 2012-03-20 13:26 编辑

事情从这个帖子开始。
原来以为是一件很简单的事情,但随着增加新的要求,深入到细节,要解决问题、要查阅的资料也随之增多。
在这里记录思考的过程,与大家分享。
######

原贴中,感谢mozillazg指出了一个错误。修正后,程序可以发出搜索请求了,也尝试下载了一些内容(暂不保证是关键标题)。打开下载文本一看,
Fucking my life.全是乱码。问题来了,如何将BeautifulSoup抽取的内容保存为中文?
这里,了解到一些关于编码、解码的知识。解释的很清楚,这里不复述了。
这里有一点体会:
知识的结构就像是一棵树,知识树的顶端结点少,而且都是一些基本原理。越往知识树的底层次走,结点越多,相对的也是一些由基本原理引申出来的东西。
为什么我们会觉得要学习的东西很多,而且多半是浅尝辄止。感觉自己什么都学了,都仔细一想,好像又什么都没学着。产生这样的感觉,大概就是因为我们
总停留在处理细节的问题,而没有通过底层众多的细节向上总结出本质。知1知2,不知其3。
回到编码的问题,找个时间读一下Joel的这篇文章,对编码的知识就更清楚了。

#####

解决了编码问题,程序能保存中文了。打开保存的文本再一看,
Fucking my life ,全不是我想要的。这个就是BeautifulSoup的基本功了。将网页作为一个树结构,如何通过标签与属性定位想要的内容。
这里有几点是可以总结的:
1.化繁为简
如果有个事情要重复做多遍,不如先选取一遍来做好(细节的处理)。
不是每个人一开始就能想出一个完整的大程序。

2.Debug利用  Try ... Except...定位错误源。
在Except中,将抛出异常的地方保存下来,再分析为什么它会抛出异常。

3.资料的获取
这段时间觉得stackoverflow是个好地方,除了获取资料,也可以学会如何用英文提问。

#####
完整的程序如下,下一步会完善GUI
  1. def search(key):
  2.         import urllib2
  3.         import BeautifulSoup
  4.         #observe the pattern of search url
  5.         search_url='http://www.baidu.com/s?wd=key&rsv_bp=0&rsv_spt=3&rsv_n=2&inputT=6391'
  6.         # search your keyword
  7.         req=urllib2.urlopen(search_url.replace('key',key))
  8.         keyword=[]  #store result
  9.         print 'loading. . .'
  10.         for count in range(10):#search for 10 pages
  11.                 print 'load page:{}'.format(count+1)
  12.                 html=req.read()
  13.                 soup=BeautifulSoup.BeautifulSoup(html.decode('gb2312','ignore'))   #html.decode('gb2312','ignore') is needed
  14.                 result=[i.contents for i in soup('a',{'onmousedown':True,'target':'_blank'})]
  15.                 for r in result:
  16.                         k=[]
  17.                         for i in r:
  18.                                 if isinstance(i,BeautifulSoup.NavigableString):
  19.                                         k.append(i)
  20.                                 else:
  21.                                         item=[item.string if isinstance(item,BeautifulSoup.Tag) else item for item in i.contents if i.contents]  #List comprehension
  22.                                         k.append(''.join([i for i in item if i]))  #item may include NoneType . ''.join([...,None,...]):TypeError
  23.                         keyword.append(''.join(k))
  24.                 next_page='http://www.baidu.com/'+soup('a',{'href':True,'class':'n'})[0]['href'] # search for the next page 'http:www.baidu.com/' should be  'http://www.baidu.com/'
  25.                 req=urllib2.urlopen(next_page)
  26.         f=open(r'C:\Users\Tinylamb\Desktop\result.txt','w')
  27.         for k in keyword:
  28.                 data=k.encode('gb2312','ignore')
  29.                 f.write(data+'\n')
  30.         f.close()
  31.         print 'ok!'

  32. if __name__=='__main__':
  33.         key=raw_input('input key word:')
  34.         search(key)
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP