zoukankan      html  css  js  c++  java
  • python——简单爬虫

    因为要学习python,所以看到一些网站有很多文章。

    如:http://python.jobbole.com/all-posts/

    目标:

    将某个网站脚本编程-》python模块这个分类下所有的文章标题和网址提取(就相当于一个目录索引了)

    在目录中找东西总好过一页页点击网页上的下一页吧。

    为什么用python来实现呢,因为实在太简单易用了。在不考虑效率的情况下是大大方便了我等小白

    我感觉我用爬虫得几个原因:

    自从百度的site、intitle、inurl等这类搜索命令失效之后搜索关键内容的灵活度降低了,找不到想要的内容

    技术博客里面有很多文章分类,可是一个分类下的文章遗憾的就是没有目录,难道要一页一页地打开网页查找么

    不过不试不知道,一个简单的爬虫也牵扯了挺多东西的,总结一下

    1、正则表达式,为了一行代码,把正则表达式的东西又加深学习了一遍了,无分组捕获、命名捕获、零宽断言、贪婪模式等等以前没有听过的东东。具体自己去了解吧!

    2、urllib的使用,简单的使用也会有问题,看错误如下

       IOError: ('http protocol error', 0, 'got a bad status line', None)  

         http://blog.csdn.net/yueguanghaidao/article/details/11994229 中有解释是因为http://www.website.com/需要在域名后加"/",不然会报"IOError: ('http protocol error', 0, 'got a bad status line', None)”。我第一次抓取的网页有这个错误,加了“/”访问网页直接返回404。我换成urllib2就有错误“httplib.BadStatusLine”

        后来发现IOERROR是因为那个坑爹的网页本来就有问题,前一刻访问好好的,程序没写完就变成了足彩网站了。我可以理解为网站管理员休假了么。

    3、中文编码问题,成功抓取了可是显示了一片看不明白的东东。看了下encode(),decode()毫无头绪,我怎么知道用什么来解码啊

    >>> print fi
    ['python chardetxc4xa3xbfxe9xc5xd0xb6xcfxd7xd6xb7xfbxb1xe0xc2xeb'

        引用一段:出自http://www.linuxidc.com/Linux/2014-11/109853.htm

    decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb2312’),表示将gb2312编码的字符串str1转换成unicode编码,因此,如果str1本身不是gb2312编码,就会报错。 
    encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode(‘gb2312’),表示将unicode编码的字符串str2转换成gb2312编码,因此,需要str2本身的编码是unicode。
    总结一下, 
    u.encode(‘…’)基本上总是能成功的,只要你填写了正确的目标编码。这就像任何文件都可以压缩成zip文件,是一个道理。 
    s.decode(‘…’)经常会出错,因为s是什么“编码”取决于上下文,当你解码的时候需要确保s是用什编码。就像打开zip文件的时候,你要确保它确实是zip文件,而不仅仅是伪造了扩展名的zip文件。

    可以发现C4A3的编码是GBK,哈哈,别介意我作弊,然后成功解码。

    #coding=utf-8
    import urllib2
    import re
    import time
    pattern_site_title=re.compile(r'(?<=<a class="archive-title" target="_blank" href=")(.*)(?="stitle="(.*)">)')
    for page in range(1,10):
            url='http://python.jobbole.com/all-posts/page/%d/'%page
            try:
                url_open=urllib2.urlopen(url)
            except:
                exit()
                print "urlopen error!"
    
            result=pattern_site_title.findall(url_open.read())
            print "--------------------------------------------------------------"
            for i in range(0,len(result)):
                    print "%s    %s"%result[i]
            time.sleep(3)
            url_open.close()

    正则表达式是个值得研究的地方,怎样才能匹配到自己需要的内容。简单的几行程序,实现了需要的功能。有更多的需要还可以在这基础上扩展。噢~~python真是个好东西

     

  • 相关阅读:
    第一章——第二节 启动模式
    Android 展示键盘时候布局被修改的问题
    JAVA混型和潜在类型机制
    第一章——Activity的生命周期
    android 程序中禁止屏幕旋转和重启Activity
    项目知识—九
    项目知识——八
    项目知识——七
    Drawable复习—第六章
    项目知识(六)
  • 原文地址:https://www.cnblogs.com/otherside/p/4789241.html
Copyright © 2011-2022 走看看