python学习第六篇 文件操作 爬虫
文件操作
1、文件File定义
文件是用于数据存储的单位文件通常用来长期存储数据
文件中的数据是以字节为单位进行顺序存储的
2、文件的操作流程
1、打开文件
2、读/写文件
3、关闭文件
注:
任何的操作系统。一个应用程序同时打开文件的数量有最大数限制
3、文本文件的操作
1、文件的打开与关闭
open(file, mode=’rt')用于打开一个文件,返回此文件流对象,如果打开文件失败,则会触发OSError错误
2、文件的关闭方法
f. close()#关闭文件,释放系统资源
4、文件的读操作
1、F. read(size=-1)
说明:
从文件流中最多读取size个字符(文本文件)或字节(二进制文件) ,如果不给出参数,则默认读取文件中全部的内容返回。
2、F. readline()
说明:
读取一行数据,如果到达文件末尾则近回空行
3、F. readlines (max_ chars = -1)
说明:
返回每行字符串的列表,max_ chars为最大字符(或字节数)
练习:
自己写一个文件‘info. txt’内部存一些文件信息
如:
张三 20 100
李四 21 99
小王 22 98
写程序这些数据读出来,打印终端上
4、文件的写操作
1、F. write(text)
说明:
写一个字符串到文件流中,返回写入的字符数(文本文件)或字节数(二进制文件)
2、F.writelines(lines)说明:
将字符串的列表或字符串的列表中的内容写人文件
1 # f = open('./info.txt','w',encoding='utf-8') 2 # f.write("张三 20 100\n") 3 # f.write("张三 25 100\n") 4 # f.write("张三 22 100\n") 5 # f.close() 6 try: 7 i = 0 8 f = open('./info.txt','w', encoding='utf-8') 9 while i < 2: 10 k = input("写入数据\n") 11 f.write(k) 12 k="\n" 13 f.write(k) 14 i += 1 15 print('写入完成') 16 f.close() 17 f = open('./info.txt',encoding='utf-8') 18 s = f.readlines() 19 # print(s) 20 for line in s: 21 k = line.strip() 22 # print(k) 23 b,n,m= k.split() 24 # print(b,n,m) 25 # n = int(n) 26 # m = int(m) 27 print('姓名:', b, '年龄:', n, '成绩:', m) 28 # print(line) 29 f.close() 30 except OSError: 31 print('打开文件失败')
网络爬虫
1.网络爬虫(网络蜘蛛、网络机器人)
1、定义:抓取网络数据的程序
2、用python程序模仿人点击浏览器访问网站
3、目的:获取大量数据进行分析
2.企业获取数据的方式
1、公司自有的数据
2、第三方数据平台购买
3、爬虫爬取数据:市场上没有,或者价格太高
3.python做爬虫的优势
请求模块、解析模块丰富成熟,强大的Scrapy爬虫框架
请求网站后返回的是网站的全部代码,而解析模块可以对网页进行分析获取到我们想要的数据
php:对多线程、异步支持不太好
JAVA:代买笨重,代码量大
C/C++:虽然效率高,但是代码成型慢
4.爬虫分类
1.通用网络爬虫(搜索引擎引用,需要遵守robots协议)
比如:百度、谷歌等网站
robots协议:网站通过Robots协议告诉搜索引擎哪些页面可抓,哪些页面不可抓
说明:
每一个网站都是有robots协议, 有百度快照字样就是百度爬取的网站
2.搜索引擎如何获取一个新网站的URL?
1、网站主动向搜索引擎提供(百度站长平台)
2、DNS服务器(万网),快速收录新网站
3.聚焦网络爬虫
自己写的爬虫程序:面向主题爬虫、面向需求的爬虫
5.爬取数据步骤
1.确定需要爬取的URL地址
2.通过HTTP /HTTPS协议来获取相应的HTM页面
3.解析响应
1.所需数据,保存
2.页面中新的URL,继续第2步
6.WEB
1.URL:
scheme://host[:port]/path/... ... /[?query-string][#anchor]
协议 域名 端口 资源路径 查询参数 锚点
https://item.jd.com: 80/12451724.html
https://www.baidu.com/s?ie=utf-8&f=8
#多个查询参数之间要用&做分隔
锚点: 跳转到网页指定位置
2.请求头(Requst Headers):
#接收数据类型:
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
#是否支持压缩/解压缩
Accept-Encoding: gzip, deflate, br
#支持的语言
Accept-Language: zh-CN,zh;q=0.9
#缓冲控制
#max-age>0:直接从浏览器缓存中提取
#max-age<=0:向服务器发请求确认,该资源是否修改
Cache-Control: max-age=0
#服务器可能检查
Connection: keep-alive
#支持长连接
Cookie: BAIDUID=E1AFFE8C6467DCF0FC30CBA7BDD37F75:FG=1; BIDUPSID=E1AFFE8C6467DCF0FC30CBA7BDD37F75;... ....
#升级HTTPS
Host: www.baidu.com
Upgrade-Insecure-Requests: 1
#浏览器信息
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36
3.GET和POST
1、GET, 查询参数在URL上面显示出来
2、POST:Form表单提交,传输大文件,数据隐藏在Form表单中,不会在IRL地址上显示
4.爬虫请求模块(urllib. request)
常用方法
1.urllib.request.urlopen(‘URL地址’)
1.作用:向网站发送请求并获取相应对象
2.重构 User-Agent
1.不支持重构:User-Agent :urlopen()
2.支持重构 User-Agent:urllib。request.Request()
2.urllib.request.urlopen('URL',headers={})
使用流程
1.创建请求对象
2.发请求获取响应
3.获取响应内容
3.响应对象read()
1.read()
2.getcode():返回http响应码
200:成功
302:临时转义到新的URL
404:页面找不到
500:服务器异常
3.geturl()
1.返回实际数据的URL
6.编码模块(urllib.parse)(编码解析网站:http://tool.chinaz.com/Tools/URLEncode.aspx?qq-pf-to=pcqq.temporaryc2c)
1.urllib.parse.urlencode()
写程序
请输入你要搜索的内容 ... ...
保存到本地文件:... ... html
7.案例 百度贴吧数据爬取
1.要求
1.输入抓取的贴吧名称
2.起始页
3.终止页
4.保存到本地;第1页.html 第2页.html ... ...
2.步骤
1.找URL规律,拼接URL
第1页:http://
2.获取页面内容(发请求获取响应)
3.保存(本地、数据库)
更新一个爬虫小程序。。爬取搜索结果的页面
1 import urllib.request 2 import urllib.parse 3 4 baseurl='http://www.baidu.com/s?' 5 key=input('请输入你要搜索的内容') 6 #进行urlencode()编码转换 7 wd={'wd':key} 8 key=urllib.parse.urlencode(wd) 9 url=baseurl+key 10 # print(url) 11 headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'} 12 #创建请求对象 13 req=urllib.request.Request(url,headers=headers) 14 # print(req) 15 #获取响应对象 16 res=urllib.request.urlopen(req) 17 18 html=res.read().decode('utf-8') 19 #写入本地文件 20 with open('搜索.html','w',encoding='utf-8') as f: 21 f.write(html) 22 print("爬取成功")