由于实验的要求,需要统计一系列的字符串通过百度搜索得到的关键词个数,于是使用python写了一个相关的脚本。

在写这个脚本的过程中遇到了很多的问题,下面会一一道来。

ps:我并没有系统地学习过python,只是很久之前用过它,感觉用起来还比较方便,于是这回又把它拾起来使用了。当然这也是考虑到手上有python机器学习的实战书籍,所以估计一段时间后还会再用的缘故。

思路:首先使用python的库函数把网页的内容爬下来,然后使用正则表达式去匹配想要的字符串,最后进行字符串处理就能得到想要的东西了。

具体方法(以百度搜索为例):

(1)读取存放关键词的文本

fid = open(filename,'r')
all_text = fid.readlines()

(2)根据读取到的内容依次来搜索

socket.setdefaulttimeout(4)#设置4s延时
for eachtext in all_text:
eachtext = eachtext.strip('\n')#去掉关键词最后的换行符
output = open(r'data.txt','w+')#创建一个中间文本,用来存储读取到的数据,这里其实可以不需要这么做,但是我为了调试的方便,这里还是加上了
flag = 1 #设置标志
while(flag): #有时候网速不好,然后程序卡住,上面设置了4s延时时间,然后在这里设定标志位进行循环读取(如果发生了延时错误)
try: res=urllib2.urlopen(("http://www.baidu.com/s?"+urllib.urlencode({'wd': eachtext})+"&pn={0}&cl=3&rn=100"))
html=res.read()
flag = 0
except socket.error:
errno, errstr = sys.exc_info()[:2]
if errno == socket.timeout:
print "There was a timeout"
else:
print "There was some other socket error"
content = unicode(html, 'utf-8','ignore')
output.write(html)
output.seek(0) #把指针移到文件头部

(3)使用正则表达式匹配内容

for line in output.readlines():
#通过两次正则表达式的匹配得到最终的结果
m = re.search(r'相关结果约.*个',line)
if m:
text = m.group()
re_text=text.replace(',',"")
m = re.search(r'[0-9]{1,15}',re_text)
if m:
fout.write(m.group()+'\n') #把匹配的内容写入文件
print eachtext+':'+m.group() #打印一些调试信息
break #匹配到直接跳出循环即可

遇到的问题:

(1)中文显示的问题,更细致一点,就是编码的问题了,相信每个学习Python的人都会遇到这个问题!不过这种问题一般不是很难解决,百度上有很多别人的经验。

  >>在我的程序中,我使用的全局编码都是utf-8编码,这样在shell中运行时没有问题的,但是如果在控制台中运行,中文显示便是乱码了,原因是中文系统默认编码是gbk。

  --我解决的办法是在要显示中文的地方先解码然后再编码,eg: print substr.decode('utf-8').encode('gbk')

(2)为了在不装python的机器上也能运行我这个脚本,我使用py2exe对程序进行了打包,但是发现程序的图标无法显示出来,打包代码如下:

from distutils.core import setup
import py2exe
import sys
includes = ["encodings", "encodings.*"]
sys.argv.append("py2exe")
options = {"py2exe": { "bundle_files": 1 }
}
setup(options = options,
description = 'search',
zipfile=None,
console = [{"script":'baidu_search.py', 'icon_resources':[(1, 'logo.ico')]

  网上说有把序号1换成0就能显示(然而并没有什么卵用),以及一些相关的办法我都尝试了,最终得到一个可行的办法:http://blog.csdn.net/xugangjava/article/details/8049224

(3)为了扩大搜索的范围,例如使用百度新闻搜索、人民网检索、搜狗搜索,我又进行了一些尝试。

  百度新闻搜索:

#搜索的方式
res=urllib2.urlopen(("http://news.baidu.com/ns?"+'cl=2&rn=20&tn=news&'+urllib.urlencode({'word':eachtext})))

  人民网检索:

  发现使用的是js,查看源码也没有什么作用,又不会模拟浏览器的行为(预计学习起来要花费不少的时间,然而暂时没有必要),作为爬虫的菜鸟,只能放弃改为手动抓取了。

  搜狗搜索:

  这个是会检测爬虫的,我被多次封ip,可以使用代理ip的方式来对付一下,只不过网上的代理ip资源很少。另外浏览器访问并没有被封,所以个人觉得其中一定有一些技巧,但是只能之后又时间再来研究了。

总结:爬虫这方面的资料还是有挺多的,一些诸如Scrapy的框架应用得很广泛。上面我只是简单地应用了,避免了繁杂的手动搜索。 、

参考资料:

  http://cuiqingcai.com/1052.html

     http://www.cnblogs.com/fnng/p/3576154.html

使用python抓取百度搜索、百度新闻搜索的关键词个数的更多相关文章

  1. Python爬虫之小试牛刀——使用Python抓取百度街景图像

    之前用.Net做过一些自动化爬虫程序,听大牛们说使用python来写爬虫更便捷,按捺不住抽空试了一把,使用Python抓取百度街景影像. 这两天,武汉迎来了一个德国总理默克尔这位大人物,又刷了一把武汉 ...

  2. 关于python抓取google搜索结果的若干问题

    关于python抓取google搜索结果的若干问题     前一段时间一直在研究如何用python抓取搜索引擎结果,在实现的过程中遇到了很多的问题,我把我遇到的问题都记录下来,希望以后遇到同样问题的童 ...

  3. Python 爬取陈都灵百度图片

    Python 爬取陈都灵百度图片 标签(空格分隔): 随笔 今天意外发现了自己以前写的一篇爬虫脚本,爬取的是我的女神陈都灵,尝试运行了一下发现居然还能用.故把脚本贴出来分享一下. import req ...

  4. 使用Python抓取猫眼近10万条评论并分析

    <一出好戏>讲述人性,使用Python抓取猫眼近10万条评论并分析,一起揭秘“这出好戏”到底如何? 黄渤首次导演的电影<一出好戏>自8月10日在全国上映,至今已有10天,其主演 ...

  5. 用python抓取智联招聘信息并存入excel

    用python抓取智联招聘信息并存入excel tags:python 智联招聘导出excel 引言:前一阵子是人们俗称的金三银四,跳槽的小朋友很多,我觉得每个人都应该给自己做一下规划,根据自己的进步 ...

  6. Python 抓取网页并提取信息(程序详解)

    最近因项目需要用到python处理网页,因此学习相关知识.下面程序使用python抓取网页并提取信息,具体内容如下: #---------------------------------------- ...

  7. 使用 Python 抓取欧洲足球联赛数据

    Web Scraping在大数据时代,一切都要用数据来说话,大数据处理的过程一般需要经过以下的几个步骤    数据的采集和获取    数据的清洗,抽取,变形和装载    数据的分析,探索和预测    ...

  8. python抓取性感尤物美女图

    由于是只用标准库,装了python3运行本代码就能下载到多多的美女图... 写出代码前面部分的时候,我意识到自己的函数设计错了,强忍继续把代码写完. 测试发现速度一般,200K左右的下载速度,也没有很 ...

  9. python抓取网页例子

    python抓取网页例子 最近在学习python,刚刚完成了一个网页抓取的例子,通过python抓取全世界所有的学校以及学院的数据,并存为xml文件.数据源是人人网. 因为刚学习python,写的代码 ...

  10. Python抓取页面中超链接(URL)的三中方法比较(HTMLParser、pyquery、正则表达式) <转>

    Python抓取页面中超链接(URL)的3中方法比较(HTMLParser.pyquery.正则表达式) HTMLParser版: #!/usr/bin/python # -*- coding: UT ...

随机推荐

  1. 基本组件的使用——UITabBarController

    和UINavigationController的作用差不多,UITabBarController也可以在多个UIViewController中切换 这个控件的使用相对简单,只需要为该控件的viewCo ...

  2. Android----消息弹出框

    关于Android的知识,自从工作了就没有什么时间去总结学习过的知识,我个人比较喜欢学习后总结,今天就写一下关于android中消息弹出框的几种方式的简单示例,按照自己的思路写了一段,希望对和我一样在 ...

  3. ABP模块化

    基于Abp模块化.插件化的设计,开发人员可以将自定义的功能以模块的形式集成到项目中. 模块的加载 模块: 插件: 模块及插件的加载路线: 1. 扩展的HttpApplication对象(在Abp.We ...

  4. DOM基础知识

    DOM BOMDOM 文档对象模型 document.BOM 浏览器界面上所有内容 broder object.没有括号属性.()方法 DOM写法 document.作用 做特效 找到 摘出元素 增删 ...

  5. IDEA快捷键

    [常规] Ctrl+Shift + Enter,语句完成 "!",否定完成,输入表达式时按 "!"键 Ctrl+E,最近的文件 Ctrl+Shift+E,最近更 ...

  6. java学习笔记之数组

  7. Web Application Penetration Testing Local File Inclusion (LFI) Testing Techniques

    Web Application Penetration Testing Local File Inclusion (LFI) Testing Techniques Jan 04, 2017, Vers ...

  8. 如何生成每秒百万级别的 HTTP 请求?

    第一篇:<如何生成每秒百万级别的 HTTP 请求?> 第二篇:<为最佳性能调优 Nginx> 第三篇:<用 LVS 搭建一个负载均衡集群> 本文是构建能够每秒处理 ...

  9. 如何在mac本上安装android sdk 避免被墙

    众所周知的原因,google的很多网站在国内无法访问,苦逼了一堆天朝程序员,下是在mac本上折腾android 开发环境的过程: 一.先下载android sdk for mac 给二个靠谱的网址: ...

  10. CSS之列表标签

    1 无序列表 无序列表,用来表示一个列表的语义,并且每个项目和每个项目之间,是不分先后的. ul就是英语unordered list,"无序列表"的意思. li 就是英语list ...