初识爬虫
1.http:(1)当⽤用户在地址输⼊入了了⽹网址 发送⽹网络请求的过程是什什么
(2)http的请求⽅方式
get请求
(1)⽐比较便便捷
缺点:不不安全:明⽂文
参数的⻓长度有限制
post请求
(1)⽐比较安全
(2)数据整体没有限制
(3)上传⽂文件
put(不不完全的)
delete(删除⼀一些信息)
head(请求头)
发送⽹网络请求(需要带⼀一定的数据给服务器器不不带数据也可以)
请求头⾥里里⾯面requestheader
返回数据:response
(1)Accept:⽂文本的格式
(2)Accept-Encoding:编码格式
(3)Connection:⻓长链接 短链接
(4)Cookie:验证⽤用的
(5)Host:域名
(6)Referer:标志从哪个⻚页⾯面跳转过来的
(7)User-Agent:浏览器器和⽤用户的信息
2.爬⾍虫⼊入⻔门:使⽤用代码模拟⽤用户 批量量的发送⽹网络请求 批量量的获取数据
(1)爬⾍虫的价值:
1.买卖数据(⾼高端的领域价格特别贵)
2.数据分析:出分析报告
3.流量量
4.指数阿⾥里里指数,百度指数
(3)合法性:灰⾊色产业
政府没有法律律规定爬⾍虫是违法的,也没有法律律规定爬⾍虫是合法的
公司概念:公司让你爬数据库(窃取商业机密)责任在公司
(4)爬⾍虫可以爬取所有东⻄西?(不不是)爬⾍虫只能爬取⽤用户能访问到的数据
爱奇艺的视频(vip⾮非vip)
1.普通⽤用户 只能看⾮非vip 爬取⾮非vip的的视频
2.vip 爬取vip的视频
3.普通⽤用户想要爬取vip视频(⿊黑客)
爬⾍虫的分类:(1)通⽤用爬⾍虫
1.使⽤用搜索引擎:百度 ⾕谷歌 360 雅⻁虎 搜狗
优势:开放性 速度快
劣势:⽬目标不不明确
返回内容:基本上%90是⽤用户不不需要的
不不清楚⽤用户的需求在哪⾥里里
(2)聚焦爬⾍虫(学习)
1.⽬目标明确
2.对⽤用户的需求⾮非常精准
3.返回的内容很固定
增量量式:翻⻚页:从第⼀一⻚页请求到最后⼀一⻚页
Deep 深度爬⾍虫:静态数据:html css
动态数据:js代码,加密的js
robots:是否允许其他爬⾍虫(通⽤用爬⾍虫)爬取某些内容
聚焦爬⾍虫不不遵守robots
爬⾍虫和反扒做⽃斗争:资源对等 胜利利的永远是爬⾍虫
爬⾍虫的⼯工作原理理:
1.缺⼈人你抓取⽬目标的url是哪⼀一个(找)
2.使⽤用python代码发送请求获取数据(java Go)
3.解析获取到的数据(精确数据)
(1)找到新的⽬目标(url)回到第⼀一步(⾃自动化)
4.数据持久化
python3(原⽣生提供的模块):urlib.rquest:
(1)urlopen :
1.返回response对象
2.response.read()
3.bytes.decode("utf-8")
(2)get:传参
1.汉字报错 :解释器器ascii没有汉字,url汉字转码
(3)post
(4)handle处理理器器的⾃自定义
(5)urlError
python(原⽣生提供的):urlib2
接下来将的知识点:
5.request(第三⽅方)
6.数据解析:xpath bs4
7.数据存储
import urllib.request def load_data(): url = "http://www.baidu.com/" #get的请求 #http请求 #response:http相应的对象 response = urllib.request.urlopen(url) print(response) #读取内容 bytes类型 data = response.read() print(data) #将文件获取的内容转换成字符串 str_data = data.decode("utf-8") print(str_data) #将数据写入文件 with open("baidu.html","w",encoding="utf-8")as f: f.write(data) #将字符串类型转换成bytes str_name = "baidu" bytes_name =str_name.encode("utf-8") print(bytes_name) #python爬取的类型:str bytes #如果爬取回来的是bytes类型:但是你写入的时候需要字符串 decode("utf-8") #如果爬取过来的是str类型:但你要写入的是bytes类型 encode(""utf-8") load_data()
import urllib.request import urllib.parse import string def get_method_params(): url = "http://www.baidu.com/s?wd=" #拼接字符串(汉字) #python可以接受的数据 #https://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3 name = "美女" final_url = url+name print(final_url) #代码发送了请求 #网址里面包含了汉字;ascii是没有汉字的;url转译 #将包含汉字的网址进行转译 encode_new_url = urllib.parse.quote(final_url,safe=string.printable) print(encode_new_url) # 使用代码发送网络请求 response = urllib.request.urlopen(encode_new_url) print(response) #读取内容 data = response.read().decode() print(data) #保存到本地 with open("02-encode.html","w",encoding="utf-8")as f: f.write(data) #UnicodeEncodeError: 'ascii' codec can't encode # characters in position 10-11: ordinal not in range(128) #python:是解释性语言;解析器只支持 ascii 0 - 127 #不支持中文 get_method_params()