欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

爬取网易新闻排行榜

程序员文章站 2023-11-27 16:15:04
解析一:检测是否有这个文件目录,不存在的话,会自动创建 解析二:os.mkdir 与 os.makedirs 区别及用法: (1)mkdir( path [,mode] ) 作用:创建一个目录,可以是相对或者绝对路径,mode的默认模式是0777。 如果目录有多级,则创建最后一级。如果最后一级目录的 ......

 

#网络爬虫之最基本的爬虫:爬取[网易新闻排行榜](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、指定占位符宽度,指定对其方式