• 爬取网易新闻排行榜


    #网络爬虫之最基本的爬虫:爬取[网易新闻排行榜](http://news.163.com/rank/)

    **一些说明:**

    * 使用urllib2或requests包来爬取页面。

    * 使用正则表达式分析一级页面,使用Xpath来分析二级页面。

    * 将得到的标题和链接,保存为本地文件。
    import os
    import sys
    import requests
    import re
    
    from lxml import etree
    
    
    def StringListSave(save_path, filename, slist):
        # 检测是否有这个文件目录,不存在的话,会自动创建
        if not os.path.exists(save_path):
            os.makedirs(save_path)
        path = save_path+"/"+filename+".txt"
        with open(path, "w+") as fp:
            for s in slist:
                # 做了utf8转码,转为终端可识别的码制
                fp.write("%s		%s
    " % (s[0].encode("utf8").decode('utf-8'), s[1].encode("utf8").decode('utf-8')))
    
    
    def Page_Info(myPage):
        '''Regex'''
        # 这里的re.findall 返回的是一个元组列表,内容是 (.*?) 中匹配到的内容
        # 析取每个链接的标题和链接
        mypage_Info = re.findall(r'<div class="titleBar" id=".*?"><h2>(.*?)'
                                 r'</h2><div class="more"><a href="(.*?)">.*?</a></div></div>', myPage, re.S)
        return mypage_Info
    
    def New_Page_Info(new_page):
        '''Regex(slowly) or Xpath(fast)'''
        # 将new_page的内容转为html格式的树
        dom = etree.HTML(new_page)
        # 析取 <tr <td <a中的文本
        new_items = dom.xpath('//tr/td/a/text()')
        # 析取 <tr <td <a中的链接, @href 是一个属性
        new_urls = dom.xpath('//tr/td/a/@href')
        assert(len(new_items) == len(new_urls))
        return zip(new_items, new_urls)
    
    def Spider(url):
        i = 0
        print("downloading ", url)
        myPage = requests.get(url).content.decode("gbk")
        myPageResults = Page_Info(myPage)
        save_path = "网易新闻抓取"
        filename = str(i)+"_"+"新闻排行榜"
        StringListSave(save_path, filename, myPageResults)
        i += 1
        for item, url in myPageResults:
            print("downloading ", url)
            new_page = requests.get(url).content.decode("gbk")
            newPageResults = New_Page_Info(new_page)
            filename = str(i)+"_"+item
            StringListSave(save_path, filename, newPageResults)
            i += 1
    
    
    if __name__ == '__main__':
        print("start")
        start_url = "http://news.163.com/rank/"
        Spider(start_url)
        print("end")

    解析一:检测是否有这个文件目录,不存在的话,会自动创建

    import os
    save_path = "网易新闻抓取"
    if not os.path.exists(save_path):
       os.makedirs(save_path)

    解析二:os.mkdir 与 os.makedirs 区别及用法:

    1)mkdir( path [,mode] )

          作用:创建一个目录,可以是相对或者绝对路径,mode的默认模式是0777。
          如果目录有多级,则创建最后一级。如果最后一级目录的上级目录有不存在的,则会抛出一个OSError。

    (2)makedirs( path [,mode] )

          作用: 创建递归的目录树,可以是相对或者绝对路径。
          如果子目录创建失败或者已经存在,会抛出一个OSError的异常,Windows上Error      183即为目录已经存在的异常错误。如果path只有一级,与mkdir一样。

         总结:os.mkdir()创建路径中的最后一级目录;os.makedirs()创建多层目录。

     

    解析三:文件操作,with open as追加文本内容实例:

    (1) 最常见的读写操作

    import re
    with open('/rr.txt', 'w') as f:
       f.write('hello world')

    如图所示:

     

    追加写入文件内容:

    import re
    with open('/rr.txt', 'a') as f:
        f.write('hello world
    ')
        # print(f.readline(1))

    如图所示:

     

    (2) 一些正则表达式的关键词

     

    w:以写方式打开,

    a:以追加模式打开 (从 EOF 开始, 必要时创建新文件)

    r+:以读写模式打开

    w+:以读写模式打开 (参见 w )

    a+:以读写模式打开 (参见 a )

    rb:以二进制读模式打开

    wb:以二进制写模式打开 (参见 w )

    ab:以二进制追加模式打开 (参见 a )

    rb+:以二进制读写模式打开 (参见 r+ )

    wb+:以二进制读写模式打开 (参见 w+ )

    ab+:以二进制读写模式打开 (参见 a+ )fp.read([size])                    

     

    解析四:python格式化输出

    %s		%s
    

    解: %s:字符串; :换行; : 横向制表符

     

     

    1、  打印字符串

     

    2、打印整数

    3、打印浮点数

    4、打印浮点数(指定保留小数点位数)

    5、指定占位符宽度

    6、指定占位符宽度,指定对其方式

     

  • 相关阅读:
    OGG for sqlserver engryption && insert/delete
    MySQL中SQL_CALC_FOUND_ROWS的用法
    VMWARE 虚拟机新增硬盘,格式化分区,并挂载
    Mycat实战之数据迁移(oracle -- mysql)
    MYCAT实战之分片迁移
    mycat实战之性能测试
    Mycat实战之主键数据库自增方式
    对象的创建与克隆
    c#调用c++的dll,错误篇
    java 模拟消息的发送功能
  • 原文地址:https://www.cnblogs.com/qy1234/p/9461637.html
Copyright © 2020-2023  润新知