本地数据的获取
文件的打开
open(filename,mode='r',buffering=-1,...)
mode为可选参数,默认值为r;buffering为可选参数,默认值为-1(0代表不缓冲,1或大于1的值表示缓冲一行或指定缓冲区大小);还有一个很常用的参数,encoding=...
open()函数-mode
注:w和w+都需要清空原文件内容,a和a+都只能追加,也就是在文件尾部添加内容
文件相关函数
返回值
open()函数返回一个文件对象,文件对象可迭代,有关闭和读写文件相关的函数/方法
写文件
写文件时建议采用方法2,利用with语句,因为第二种方法包括异常的处理,而且简洁
1.f=open('xxx','w')
f.write('hello xxxx')
f.close()
2.with open('xx',w) as f: #with语句会自动关闭文件,所以不需要写close语句
f.write('hello xxx')
读文件
f.read(size)从文件中至多读出size字节数据,返回一个字符串
f.read() 读文件直到文件结束,返回一个字符串
对一个文件读的时候,是按着文件指针读的,如果之前已经利用f.read把文件读到文件末尾了,那么再次执行read讲没有输出。文件指针的位子可以用f.tell()查看
其他读写函数
f.readlines() #读多行 读出返回是一个列表,结果有换行符。
f.readline() #读一行
f.writelines() #写多行数据 要注意没有writeline函数
下面函数是在文件每一行头部加入一个数字
>>> with open('/Users/Meng/Desktop/firstpro.txt','r') as f:
content=f.readlines()
for i in range(0,len(content)):
content[i]=str(i+1)+''+content[i]
>>> with open('/Users/Meng/Desktop/firstpro.txt','w') as f:
f.writelines(content)
一定注意文件指针。这里需要用到seek函数
f.seek(offset,whence=0)
在文件中移动文件指针,从whence(0表示文件头部,1表示当前位置,2表示文件尾部)偏移offset个字节,whence参数可选,默认值为0
注意下面这个问题
网络数据获取
网络数据获取也称为网络数据爬取,包括两个阶段:抓取网页,解析网页内容
抓取:urllib内建模块 -urllib.request;Requests第三方库;Scrapy框架
抓取过程其实就是客户机发给服务器一个请求(request),然后服务器在返回一个响应(response),接下来就去解析这个响应。
解析:BeautifulSoup库;re模块
除此之外,可以由第三方API 替我们抓取和解析。
Requests库
Requests 库是更简单、方便和人性化的python http第三方库
Requests 官网:https://www.python-requests.org/
基本方法 requests.get() 请求获取指定url位置的资源,对应http协议的get方法
抓取前,需要注意查看有没有爬虫协议:在网页后面加上robots.txt,存在就ok啦!
Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,
BeautifulSoup库
BeautifulSoup是一个可以从html或XML文件中提取数据的python库 处理标签
官方网站:https://www.crummy.com/software/BeautifulSoup/bs4/doc/
>>>from bs4 import BeautifulSoup
>>>markup='<p class="title"><b>The Little Prince</b></p>'#自己建立一个markup
>>>soup=BeautifulSoup(markup,'lxml')#采用lxml解析
>>>soup.b
<b>The Little Prince</b>
>>>soup.p
<p class="title"><b>The Little Prince</b></p>
>>>type(soup.b)
bs4.element.Tag
>>>tag=soup.p
>>>tag.name
'p'
>>>tag.attrs
{'class': ['title']}
>>>tag['class']
['title']
>>>tag.string
'The Little Prince'
>>>type(tag.string)
bs4.element.NavigableString#NavigableString这种以后学习会常见
>>>soup.find_all('b')#如果只找第一个数据就只用find就可,如果全部找到用find_all
[<b>The Little Prince</b>]
import requests
from bs4 import BeautifulSoup
r=requests.get('https://movie.douban.com/subject/1295038/comments?status=P')
soup=BeautifulSoup(r.text,'lxml')
pattern=soup.find_all('p','')#找出评论,标签为p,属性为
for item in pattern:
print(item.string)
re正则表达式模块进行各类正则表达式处理 处理复杂的,细节处理
参考网站:https://docs.python.org/3.5/library/re.html
<span class="user-stars allstar(.*?)rating''> 需要寻找的是一个字符串里面的一个细节
引用自coursera南京大学:
例如要在一篇文档中寻找字符串he,则可以使用正则表达式he,它可以匹配出字符串he,如果忽略大小写的话还可以匹配出He、HE这样的字符串,这是最简单的正则表达式。但这种方式除了匹配出单独的he外还会匹配例如“hello”中的he。如果只想找出字符串he,可以使用元字符“\b”,它匹配单词的开始或结尾,即单词边界,因此可用“\bhe\b”匹配字符串he。再例如正则表达式“\d{1,3}”可以匹配包含1到3个数字字符的字符串如“11”和“222”。另外还可以利用括号(exp)指定子表达式exp(也称为分组),这样不仅可以重复单个字符也可以重复多个字符构成的子表达式。 正则表达式中有很多元字符,常用的元字符如下表所示:
特别的,当正则表达式中包含重复的限定符如“*”时,通常会匹配尽可能多的字符,例如对于正则表达式“a.*b”,它会匹配以a开头以b结尾的最长字符串,如果用它来搜索aabbab时,它会匹配整个字符串aabbab,这种方式称为贪婪匹配。如果想匹配尽可能少的字符,即进行懒惰匹配,则只要在“.*”后加上“?”构成“.*?”,例如用懒惰匹配来搜索aabbab时,会匹配aab和ab。
正则表达式常常比较复杂,所以可利用正则表达式在线测试/调试工具帮助正则表达式的书写。下图所示为著名的实现此功能的网站(https://regex101.com/),可设置忽略大小写(insensitive选项)等选项。
练习:
获取一个网页上评论的内容以及计算总分
import requests
from bs4 import BeautifulSoup
import re
sum=0
r=requests.get('https://book.douban.com/subject/1041007/comments/')
soup=BeautifulSoup(r.text,'lxml')
pattern=soup.find_all('p','comment-content')
for item in pattern:
print(item.string)
pattern_s=re.compile('<span class="user-stars allstar(.*?) rating">')
p=re.findall(pattern_s,r.text)
for star in p:
sum+=int(star)
print(sum)
感觉这个部分好复杂跟网络有关的我总是学不好。。。哭。。。。继续加油!