About Python----学习笔记(七)数据的获取

本地数据的获取

文件的打开

open(filename,mode='r',buffering=-1,...)

mode为可选参数,默认值为r;buffering为可选参数,默认值为-1(0代表不缓冲,1或大于1的值表示缓冲一行或指定缓冲区大小);还有一个很常用的参数,encoding=...

open()函数-mode

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)

感觉这个部分好复杂跟网络有关的我总是学不好。。。哭。。。。继续加油!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值