当⽤户在地址输⼊了⽹址 发送⽹络请求的过程是什么
发送⽹络请求(需要带⼀定的数据给服务器不带数据也可以)
请求头⾥⾯requestheader
返回数据:response
(1)Accept:⽂本的格式
(2)Accept-Encoding:编码格式
(3)Connection:⻓链接 短链接
(4)Cookie:验证⽤的
(5)Host:域名
(6)Referer:标志从哪个⻚⾯跳转过来的
(7)User-Agent:浏览器和⽤户的信息
1.使⽤搜索引擎:百度 ⾕歌 360 雅⻁ 搜狗
优势:开放性 速度快
劣势:⽬标不明确
返回内容:基本上%90是⽤户不需要的
不清楚⽤户的需求在哪⾥
1.⽬标明确
2.对⽤户的需求⾮常精准
3.返回的内容很固定
增量式:翻⻚:从第⼀⻚请求到最后⼀⻚
Deep 深度爬⾍:静态数据:html css
动态数据:js代码,加密的js
robots:是否允许其他爬⾍(通⽤爬⾍)爬取某些内容
聚焦爬⾍不遵守robots
爬⾍和反扒做⽃争:资源对等 胜利的永远是爬⾍
找到新的⽬标(url)回到第⼀步(⾃动化),url之间会有规律
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
python2(原⽣提供的):urlib2
#url_open_01
#保存百度首页
import urllib.request
def load_data():
url="http://www.baidu.com"
#get请求
#http请求
#response:http相应的对象
response =urllib.request.urlopen(url)
print(response)
#读取内容
data=response.read()
#print(data)
#将获取的内容转换为utf-8
str_data=data.decode('utf-8')
print(str_data)
#数据持久化
with open("baidu.html","w",encoding="utf-8") as f:
f.write(str_data)
load_data()
#将字符串转化为二进制
str_name="baidu"
byte_name=str_name.encode()
print(byte_name)
#python爬取类型常为str或byte
#如果爬取回来的是字节类型,但写入的时候需要字符串
#使用decode("utf-8") 反之用encode("utf-8")
#get传参,param
#保存必应图片搜索
import urllib.request
import urllib.parse
import string
def get_method_params():
url="http://cn.bing.com/images/search?q="
#拼接字符串
question="狮子"
final_url="%s%s"%(url,question)
#final_url =url +question
#print(final_url)
'''请求的网址里包含汉字,ascii中没有汉字
将包含汉字的网址进行转译
'''
encode_new_url=urllib.parse.quote(final_url,safe=string.printable)
#print(encode_new_url)
## http://cn.bing.com/images/search?q=%E7%8B%AE%E5%AD%90
response= urllib.request.urlopen(encode_new_url)
#print(response)
#UnicodeEncodeError: 'ascii' codec can't encode characters in position 21-22: ordinal not in range(128)
#python:解释型语言,只支持ascii 0-127 也就是不支持中文,需要前面将网址转码
print(response)
data=response.read().decode()
print(data)
#保存到本地
with open("02_encode.html","w",encoding="utf-8") as f:
f.write(data)
get_method_params()