使用python抓取百度搜索、百度新闻搜索的关键词个数

时间:2023-02-16 13:21:18

由于实验的要求,需要统计一系列的字符串通过百度搜索得到的关键词个数,于是使用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 抓取网页并提取信息&lpar;程序详解&rpar;

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

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

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

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

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

  9. python抓取网页例子

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

  10. Python抓取页面中超链接&lpar;URL&rpar;的三中方法比较&lpar;HTMLParser、pyquery、正则表达式&rpar; &lt&semi;转&gt&semi;

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

随机推荐

  1. 给IDEA设置单独的JDK

    一.系统参数设置: 1.64位IDEA:增加IDEA_JDK_64系统变量 2.32位IDEA:增加IDEA_JKD系统变量 如图: 二.参考说明 https://intellij-support.j ...

  2. 使用JVMTI创建调试和监控代理

    Java 虚拟机工具接口(JVMTI)提供了一个编程接口,允许你(程序员)创建software agent 来监视和控制你的Java应用. JVMTI 代替了原来的Java Virtual Machi ...

  3. 深入学习 memset 函数

    最近,和同学讨论了一下memset函数,趁着周五空闲做一总结. memset函数最常用的功能就是初始化数组了(主要是置零),如 #include <iostream> #include & ...

  4. 51nod算法马拉松12

    A 第K大区间 不妨考虑二分答案x,则问题转化成计算有多少个区间满足众数出现的次数>=x. 那么这个问题我们使用滑动窗口,枚举右端点,则左端点肯定单调递增,然后维护一个简单的数组就能资瓷添加元素 ...

  5. 如何创建自己的docker image并上传到DockerHub上

    这里,记录一下比较常用的docker操作细节,对于初次使用者,可能有很大的帮助. docker作为云计算Paas层面的东西,风靡全世界了,主要是因为它小巧,好用,功能强大.今天主要介绍一下如何依据自己 ...

  6. jquer &OpenCurlyDoubleQuote;&dollar;” 扩展&lpar;笔记&rpar;

    /** * Created by shanruo on 16-03-10. */ (function ( $ ){ $.extend ({ /* * 根据参数名获取参数 @name String 参数 ...

  7. hdu 5269 ZYB loves Xor I&lpar;字典树&rpar;

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5269 思路分析:当lowbit(AxorB)=2p 时,表示A与B的二进制表示的0-p-1位相等,第p ...

  8. nvcc编译器选项及配置

    nvcc命令选项: 选项命令有长名和短名,通常我们使用是用短名,长名主要用于描述. 1.指定编译阶段 主要指定编译的阶段以及要编译的输入文件. -cuda  -cubin  -fatbin  -ptx ...

  9. C&num; 各种常用集合类型的线程安全版本

    在C#里面我们常用各种集合,数组,List,Dictionary,Stack等,然而这些集合都是非线程安全的,当多线程同时读写这些集合的时候,有可能造成里面的数据混乱,为此微软从Net4.0开始专门提 ...

  10. 调用CMD命令的一个&period;NET工具类(MyWindowsCmd)

    功能大概描述一下如果直接StandardOutput.ReadToEnd()这种方法,有很多限制 这类方式必须把命令全部执行一次写入并标记为exit,而且返回内容的获取会一直等待,如果在主线程里使用会 ...