zoukankan      html  css  js  c++  java
  • 使用python抓取百度搜索、百度新闻搜索的关键词个数

    由于实验的要求,需要统计一系列的字符串通过百度搜索得到的关键词个数,于是使用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('
    ')#去掉关键词最后的换行符
        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()+'
    ') #把匹配的内容写入文件
                    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

  • 相关阅读:
    java集合
    [编写高质量代码:改善java程序的151个建议]建议57 推荐在复杂字符串操作中使用正则表达式
    [编写高质量代码:改善java程序的151个建议]建议53 注意方法中传递的参数要求
    判断某一时间范围的方法
    c#读写xml文件
    冒泡排序
    C#使用正则表达式检测数字 char 和韩文
    三角形面积公式
    unity 绘制三角形
    中缀转后缀表达式
  • 原文地址:https://www.cnblogs.com/nice-forever/p/4824041.html
Copyright © 2011-2022 走看看