爬虫
1.什么是爬虫
-
通俗解释 : 通过Python(爬虫代码), 下载互联网上的数据到本地, 并且提取出我们需要的信息的过程就是就是爬虫
-
网络爬虫(又被称为网页蜘蛛,网络机器人,或者经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。二十年前是一种黑客行为
- 分类
- 普通爬虫、多线程爬虫、异布爬虫
- 企业/对大型网站:Scrapy框架、Celery分布式
- 还可以学习到:计算机网络、面向对象
- Web与HTTP协议介绍
超文本传输协议(Hypertext Transfer Protocol,简称HTTP)是应用层协议。
HTTP是一种请求/响应式的协议,即一个客户端与服务器建立连接后,向服务器发送一个请求;
服务器接到请求后,给予相应的响应信息。 - 爬虫模拟这个过程
- 发送HTTP请求
GET | 获取资源GET /comments?postld=1 HTTP/1.1 |
---|---|
POST | POST /创建资源posts HTTP1.1 |
PUT | PUT /更新资源posts HTTP/1.1 |
DELETE | 删除资源DELETE /posts/1 HTTP/1.1 |
- 接受HTTP响应
100 - 199 | 一般信息100 Continue |
---|---|
200 - 299 | 成功响应201 Created |
300 - 399 | 重定向301 Moved Permanently |
400 - 499 | 客户端错误404 Not Found |
500 - 599 | 服务端错误500 Internal Derver Error |
- 爬虫的流程步骤
- 确定需求:需要什么
- 寻找需求:在哪找,什么网站
- 发送请求:网页摆放,链接地址
- 解析数据:提取关键节点数据
- 存储数据:存入数据库/写入文件
- 环境
系统:Linux/MacOs/windows
版本:Python3.4以上
IDE:Anaconda/Pycharm/Sublime/vscode(看个人喜好)…
2. 请求方式:GET&POST(最常用)
-
GET是默认的HTTP请求方式,用于直接输入网址的方式去访问网页
-
POST方法主要是向Web服务器提交表单数据,通常表单提交时采用POST方法
-
GET请求把参数包含在URL中,POST通常通过请求体传递参数
-
GET相对POST不安全,参数直接暴露在URL上,用来传递敏感信息
3. requests使用代理IP
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}
这是其中一种,后面案例也会讲到,上面这个是指我是用Win系统Chrome浏览器的用户,想看其他浏览器或者其他系统也可以百度搜User-Agent
- 如果不做这一步,浏览器看到的我们是
{'User-Agent': 'python-requests/2.22.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
就是很明显的一个爬虫,很多有robots协议的网站就会访问不到
4. requests处理cookie信息
什么是cookie?
是什么?有什么作用?
http请求是无状态的请求协议,
不会记住用户的状态和信息,
也不清楚你在这之前访问过什么?
因为网站需要记录用户是否登录时,就需要在用户登录后创建一些信息
并且要把这些信息记录在当前用户的浏览器中,记录的内容就是cookie
用户使用当前的这个浏览器继续访问这个服务器时,会主动携带这个网站设置的cookie信息
cookie会在浏览器中记录信息,并且在访问时携带这个信息
1,浏览器更换或删除cookie后,信息丢失
2,cookie在浏览器中记录的信息是不安全的,因为不能记录敏感信息
session
session是在服务器端进行数据的记录,
并且在给每个用户会生成一个sessionID,
并且把这个sessionID设置在用户的浏览器中,也就是设置为cookie
网络请求Requests
requests库
- 安装
python -V(显示版本)
python3 -V(安装)
pip install requests(安装。win系统直接pip,多个python版本用pip3)
pip3 show requests(查看安装情况)
查看库信息
- Python第三方库:https://pypi.org/ (官方文档
实操
1.百度爬虫
python发请求,显示网页源代码
- 浏览器打开百度
www.baidu.com
- 右键点击检查,或键盘点击F12
- 点击Network,刷新
下面的www.baidu.com是发送的请求- 右侧是解析库结果
- Headers里面有General,
Response Headers是请求头信息
Request Headers是响应头信息- Host请求的主题地址
- 用户代理,不同机器不同浏览器都是不一样的,可以搜索User-Agent看看
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
import requests
# 定义请求的url
url = 'https://www.baidu.com'
# 发起get请求
res = requests.get(url=url)
# 获取相应结果
print(res) # <Response [200]>
print(res.content) # b'...' 二进制的文本流
print(res.content.decode('utf-8')) # 把二进制的文本流按照utf8的字符集转换为普通字符串
print(res.text) # 获取响应的内容
print(res.status_code) # 请求状态码 200
print(res.url) # 请求的url地址
print(res.request.headers)# 请求的头信息
print(res.headers) #响应头信息
2.有道翻译爬虫
- 先看POST请求
ajax不刷新就可以得到内容
- F12-点击Network刷新-输入"你好"
- XHR-AJAX请求项
- 输入"你好 世界",Preview中找到你好世界
- headers-同时出现Response/Request Headers
URL地址,请求格式是POST,Response里有响应内容是json格式- From Data-i是发送的内容,返回的内容格式doctype:json
import requests
# 定义请求的url
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
# 定义请求的参数
data = {
'i':'你好',
'doctype':'json'
}
# 发起请求 post
res = requests.post(url,data=data)
# 查看请求结果,
code = res.status_code
print(code)
if code == 200:
# 解析数据
# print(res.content)
# print(res.json()) # 如果返回的是json数据,可以直接解析
resdata = res.json()
if resdata['errorCode'] == 0:
# 请求成功
print(resdata['translateResult'][0][0]['tgt'])
成功了之后,开始封装
import requests
# 封装翻译的函数
def fanyi(kw):
# 定义请求的url
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
# 定义请求的参数
data = {"i": kw, "doctype": "json"}
# 发起请求 post
res = requests.post(url, data=data)
# 查看请求结果,
code = res.status_code
if code == 200:
# 解析数据
# print(res.content)
# print(res.json()) # 如果返回的是json数据,可以直接解析
resdata = res.json()
if resdata["errorCode"] == 0:
# 请求成功