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