爬取网易新闻排行榜

 

#网络爬虫之最基本的爬虫:爬取[网易新闻排行榜](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\t\t%s\n" % (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\n')
    # 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\t\t%s\n

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

 

 

1、  打印字符串

 

2、打印整数

 

3、打印浮点数

 

 

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

 

 

5、指定占位符宽度

 

 

 

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

 

 

posted @ 2018-08-11 23:40  笑笑未来  阅读(764)  评论(1编辑  收藏  举报