#网络爬虫之最基本的爬虫:爬取[网易新闻排行榜](http://news.163.com/rank/)
**一些说明:**
* 使用urllib2或requests包来爬取页面。
* 使用正则表达式分析一级页面,使用Xpath来分析二级页面。
* 将得到的标题和链接,保存为本地文件。
importosimportsysimportrequestsimportrefrom lxml importetreedefStringListSave(save_path, filename, slist):#检测是否有这个文件目录,不存在的话,会自动创建
if notos.path.exists(save_path):
os.makedirs(save_path)
path= save_path+"/"+filename+".txt"with open(path,"w+") as fp:for s inslist:#做了utf8转码,转为终端可识别的码制
fp.write("%s\t\t%s\n" % (s[0].encode("utf8").decode('utf-8'), s[1].encode("utf8").decode('utf-8')))defPage_Info(myPage):'''Regex'''
#这里的re.findall 返回的是一个元组列表,内容是 (.*?) 中匹配到的内容
#析取每个链接的标题和链接
mypage_Info = re.findall(r'
(.*?)'r'
#将new_page的内容转为html格式的树
dom =etree.HTML(new_page)#析取
new_items = dom.xpath('//tr/td/a/text()')#析取
new_urls = dom.xpath('//tr/td/a/@href')assert(len(new_items) ==len(new_urls))returnzip(new_items, new_urls)defSpider(url):
i=0print("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 inmyPageResults: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")
解析一:检测是否有这个文件目录,不存在的话,会自动创建
importos
save_path= "网易新闻抓取"
if notos.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) 最常见的读写操作
importre
with open('/rr.txt', 'w') as f:
f.write('hello world')
如图所示:
追加写入文件内容:
importre
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、指定占位符宽度,指定对其方式