爬虫入门
2021-10-04 12:03:19 34 举报
AI智能生成
爬虫入门,不断更新
作者其他创作
大纲/内容
HTTP协议
HTTP协议
客户端(浏览器)与服务器之间进行数据通信的一种协议
按照协议规定方式发起请求和返回响应结果,任何人都可以基于HTTP协议实现自己的Web客户端(浏览器、爬虫)和Web服务器(Nginx、Apache等)
规定客户端按照什么格式给服务器发送请求,同时也约定了服务端返回的响应结果是什么格式。
HTTP请求
请求行
每个请求必需要具备请求行
请求方法
GET方法,用于从服务器获取资源
POST
PUT
DELETE
请求URL,请求 URL 是指资源所在服务器的路径地址
HTTP协议版本
请求首部
用于给服务器提供一些额外的信息
User-Agent 用来表明客户端的身份
HTTP/1.1 规定了47种首部字段类型
为了区分请求首部的结尾和请求体的开始,用一个空行来表示,遇到空行时,就表示这是首部的结尾,请求体的开始
请求体
客户端提交给服务器的真正内容
用户登录时的需要用的用户名和密码
文件上传的数据
注册用户信息时提交的表单信息
HTTP响应
服务端接收请求并处理后,返回响应内容给客户端
响应内容也必须遵循固定的格式浏览器才能正确解析
HTTP 响应也由3部分组成,分别是:响应行、响应首部、响应体,与 HTTP 的请求格式是相对应的
响应行
由服务端支持的 HTTP 协议版本号
状态码
状态码是响应行中很重要的一个字段
通过状态码,客户端可以知道服务器是否正常处理的请求
200:客户端的请求处理成功
404:请求的资源在服务器找不到
500:服务器处理请求的时候出现了异常
对状态码的简短原因描述
响应首部
响应首部和请求首部类似,用于对响应内容的补充
告知客户端响应体的数据类型是什么
响应内容返回的时间是什么时候
响应体是否压缩
响应体最后一次修改的时间
响应体
响应体(body)是服务器返回的真正内容
一个HTML页面
一张图片
一段视频等
HTTP库requests
requests库 实现了 HTTP 协议中绝大部分功能
发送请求
import requests
rs= requests.get("https://soofish.net")
响应内容
状态码
response.satus_code
原因短语
response.reason
响应首部
for name,value in response.headers.items():
print(“%s,%s”%(name,value))
响应内容
response.content
支持HTTP规范中的所有方法
GET
POST
r=requests.post('http://httpbin.org/post',data = {'key':'value'})
PUT
r=requests.put('http://httpbin.org/post',data = {'key':'value'})
DELLTE
r = requests.delete('http://httpbin.org/delete')
HEAD
r = requests.head('http://httpbin.org/get')
OPTIONS
r = requests.options('http://httpbin.org/get')
查询参数
URL带的参数称为URL的查询参数,http://fav.foofish.net/?p=4&s=20
用“?”附加在URL连接后面
多个参数之间用“&”隔开
请求头部Headers
指定User-Agent
r = requests.get(url, headers={'user-agent': 'Mozilla/5.0'})
请求体
作为表单数据传输给服务器
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("http://httpbin.org/post", data=payload)
作为json格式的字符串格式传输给服务器
import json
url = 'http://httpbin.org/post'
payload = {'some': 'data'}
r = requests.post(url, json=payload)
响应内容
content
content是byte类型,适合将内容保存到文件系统或者传输到网络中
r = requests.get("https://pic1.zhimg.com/v2-2e92ebadb4a967829dcd7d05908ccab0_b.jpg")
with open("test.jpg", "wb") as f:
f.write(r.content)
text
text是str类型
r = requests.get("https://foofish.net/understand-http.html")
re.compile('xxx').findall(r.text)
json()方法
返回一个经过json.loads()处理后的对象
r = requests.get('https://www.v2ex.com/api/topics/hot.json')
r.json()
代理设置
为了避免被服务器屏蔽,使用代理是明智的选择
想爬取墙外的数据,同样设置代理可以解决问题
proxies = {
'http': 'socks5://127.0.0.1:1080',
'https': 'socks5://127.0.0.1:1080',
}
'http': 'socks5://127.0.0.1:1080',
'https': 'socks5://127.0.0.1:1080',
}
requests.get('https://foofish.net', proxies=proxies, timeout=5)
超时设置
requests 发送请求时,默认请求下线程一直阻塞,直到有响应返回才处理后面的逻辑
如果遇到服务器没有响应的情况时,它将导致整个应用程序一直处于阻塞状态而没法处理其他请求。
r = requests.get("http://www.google.coma", timeout=5)
Session
为了维持客户端与服务器之间的通信状态,使用Cookie技术使之保持双方的通信状态
浏览器首次通过用户名密码登录之后,服务器给客户端发送一个随机的Cookie,下次浏览器请求其它页面时,就把刚才的 cookie 随着请求一起发送给服务器,这样服务器就知道该用户已经是登录用户。
构建一个Session会话
import requests
session= requests.Session()
session.post(login_url, data={username, password})
r = session.get(home_url)
session.close()
用requests库构建知乎API
模拟知乎登录
登录原理
浏览器第一次发起HTTP请求时,没有携带任何Cookie信息
服务器响应HTTP请求,同时还有一个Cookie信息,一起返回给浏览器
浏览器第二次请求就把服务器返回的Cookie信息一起发给服务器
服务器收到HTTP请求,发现请求头中有Cookie字段,便知道之前的登录过
思路分析
浏览器向服务器发送一个HTTP请求
请求URL
URL:https://www.zhihu.com/api/v4/messages
请求方法:POST
请求头Header
Cookies登录信息
authorization字段
请求体Body
Subtopic
BeautifulSoup
子主题
子主题
0 条评论
下一页
为你推荐
查看更多