爬虫基本原理

一、爬虫基础简介必备知识

三种爬虫方式

​ 通用爬虫: 抓取系统重要组成部分,获取的是整张页面数据
​ 聚焦爬虫: 建立在通用爬虫之上,抓取页面指定的局部内容
​ 增量式爬虫: 检测网站数据更新的情况,只抓取更新出来的数据

**robots.txt协议: 君子协议,规定网站哪些数据可不可爬
**http协议: 服务器和客户端进行数据交互的一种形式。

https协议: 安全的超文本传输协议(证书秘钥加密))

请求头:

  • User-Agent: 请求载体的身份标识

  • Connection: 请求完毕后,是否断开连接或者保存连接

响应头:

  • content-Type: 服务器响应回客户端的数据类型

加密方式:

  • 对称秘钥加密
  • 非对称秘钥加密
  • 证书秘钥加密

二、爬虫的基本流程(四步曲)

发送请求 ---> 获取响应内容 ---> 解析内容 ---> 保存数据

1.发送请求: 向目标站点发送一个Request, Request包含了请求头,请求体等参数

2.获取响应内容: 服务器响应回来的Response,包含了html,json,图片等数据

3.解析内容: 解析Response数据。(正则,第三方库。。。)

4.保存数据: Mysql ,本地文件file,MongoDB,Redis。。。

三、Request

1.请求方式:
GET,POST,HEAD,PUT,DELETE,OPTHONS。。。
GET请求携带的参数拼接在url,POST请求携带的参数放在请求体内,存放在form data

2.请求url:
url全称统一资源定位符 https://www.baidu.com/s?wd=靓仔
中文·靓仔·会被解码

3.请求头:
User-agent:告诉它这是浏览器发过来的请求(请求头中如果没有user-agent客户端配置,服务端可能将你当做一个非法用户)务必加上
host:
cookies:cookie用来保存登录信息
Referer:上一次的跳转路径
一般做爬虫都会加上请求头

4.请求体:
如果是get方式,请求体没有内容
如果是post方式,请求体是format data
ps:
1、登录窗口,文件上传等,信息都会被附加到请求体内
2、登录,输入错误的用户名密码,然后提交,就可以看到post,正确登录后页面通常会跳转,无法捕捉到post

请求例子一:

import requests
from urllib.parse import urlencode
# 请求方式
kwords = input('请输入关键字:>>>').strip()
res = urlencode({'wd': kwords})  # 使用urlencode可以解析中文
url = "https://www.baidu.com/s?" + res
# 请求头
baidu_headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 chrome-extension",
}
# 发送请求
response = requests.get(url, headers=baidu_headers)
print(response.status_code)  # 响应状态码
print(response.text)   # 返回的html

# 保存数据
with open('search.html', 'w', encoding='utf-8') as f:
    f.write(response.text)
    print('保存成功')

实例二:

import requests
# 请求方式
kwords = input('请输入关键字:>>>').strip()
  # 使用urlencode可以解析中文
url = "https://www.baidu.com/s?"
params = {'wd': kwords}
# 请求头
baidu_headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36 chrome-extension",
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
}
# 发送请求
response = requests.get(url,
                        params=params,
                        headers=baidu_headers,
                        )
print(response.status_code)  # 响应状态码
# print(response.text)   # 返回的html

# 保存数据
with open('search1.html', 'w', encoding='utf-8') as f:
    f.write(response.text)
    print('保存成功')
posted @ 2019-12-30 20:56  tomjoy  阅读(233)  评论(0编辑  收藏  举报