Python编程爬虫篇之请求模块
文章目录
一、爬虫介绍
什么是爬虫
- 简单一句话就是代替人去模拟浏览器进行网页操作
为什么需要爬虫
- 为其它程序提供数据源,如搜索引擎(百度、google等)、数据分析、大数据等等
企业获取大数据的方式
- 公司自有的数据
- 第三方平台购买的数据(百度指数、数据堂)
- 爬虫爬取的数据
Python做爬虫的优势
- PHP:对多线程、异步支持不太好
- Java:代码量大,代码笨重
- C/C++:代码量大,难以编写
- Python:支持模块多、代码简洁、开发效率高(scrapy框架)
爬虫的分类
- 通用网络爬虫,如百度、谷歌等
- 聚焦网络爬虫:根据既定的目标有选择的抓取某一特定主题的内容
- 增量式网络爬虫:指对下载网页采取增量式的更新和只爬取新产生的或者已经发生变化的网页爬虫
- 深层网络爬虫:指大部分内容不能通过静态链接获取的、隐藏在搜索表单后的,只有用户提交一些关键词才能获得的web页面。如:用户登录注册才能访问的页面
二、爬虫的一些概念
GET和POST
- GET:查询参数都会在URL上显示出来
- POST:查询参数和需要提交的数据隐藏在FORM表单里面,不会在URL地址上显示出来
– 在Request方法中添加data参数 urllib.request.Request(url,data=data,headers=headers)
– data:表单数据以bytes类型提交,不能是str
URL组成部分
- URL:统一资源定位符
https://new.qq.com/omn/TWF20200/TWF2020032502924000.html - https:协议
- new.qq.com:主机名,可以将主机理解为一台名叫new.qq.com的机器。这台主机在qq.com域名下
- port端口号:80,在new.qq.com后面有个 :80,可以省略
- omn/TWF20200/TWF2020032502924000.html: 访问资源路径
- anchor: 锚点,前端用来做页面定位的
注意:在浏览器请求一个url时,浏览器会对这个url进行编码。(除英文、数字、部分符号外,其它字符会使用%+十六进制进行编码) - User-Agent:用户代理,记录了用户的浏览器、操作系统,为了让用户更好的获取html页面效果
- referer:表明当前这个请求从哪个url过来的,可用作反爬技术
状态码
- 200:请求成功
- 301:永久重定向
- 302:临时重定向
- 403:服务器接收到请求,但是没有反馈,没有响应(做了反爬处理,识别到请求来自于爬虫)
- 404:请求失败,服务器无法根据客户端的请求找到资源(网页)
- 500:服务器内部请求
抓包工具
- Elements:元素,分析数据和提取数据,有些数据是经过特殊处理的,所以不是都很准确,需要结合源码页面进行分析
- Console:控制台
- Sources:信息来源,整个网站加载的文件都在这里面
- Network:网络,可以通过这个选项查看所有发送的网络请求
三、爬虫请求模块
urllib模块说明
urllib.request模块
版本
- python2:urllib2、urllib
- python3:把urllib和urllib2合并
常用方法
- urllib.request.urlopen(“网址”或请求对象):向网站发起请求并获取响应
- response.read():获取的响应内容,是一个字节流
- response.read().decode(‘utf-8’):获取的响应内容,是一个字符串
- urllib.request.Request(‘网址’,headers=headers):携带请求头向网站发起请求,然后用urllib.request.urlopen(urllib.request.Request(‘网址’,headers=headers))获取响应,urlopen()不支持重构User-Agent
- response.getcode():返回HTTP的响应码
- response.geturl():返回实际数据的URL(防⽌重定向问题)
代码如下(示例):
import urllib.request
url = 'https://www.baidu.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'
}
# 创建请求对象
html= urllib.request.Request(url,headers=headers)
# 发送请求,获取响应对象
response = urllib.request.urlopen(html)
# 读取响应内容
# decode() 将bytes数据类型转为str
# encode() 将str数据类型转为bytes
res = response.read().decode()
# 查看状态码
sta_code = response.getcode() # 必须使用解码前的对象进行查看状态码
# 查看请求网址
req_url = response.geturl() # 返回实际数据的URL(防⽌重定向问题)
urllib.parse模块
将汉字进行十六进制编码
常用方法
- urlencode(字典)
- quote(字符串)
代码如下(示例):
import urllib.parse
k = {'wd':'海贼王'}
r = urllib.parse.urlencode(k)
requests模块
安装
pip install requests
常用方法
- requests.get(网址)
响应对象的方法
- response.content:返回字节流数据(⼆进制)
- response.text:,返回unicode格式的数据(str) ,是requests模块将response.content自行解码后得到的数据
- response.content.decode(‘utf-8’):⼿动进⾏解码
- response.url 返回url
- response.encode() = ‘编码’
requests设置代理
- 使用requests添加代理只需要在请求方法中(get/post)传递proxies参数就可以了
- 代理网站
⻄刺免费代理IP:http://www.xicidaili.com/
快代理:http://www.kuaidaili.com/
代理云:http://www.dailiyun.com/
cookie
cookie :通过在客户端记录的信息确定⽤户身份
HTTP是⼀种⽆连接协议,客户端和服务器交互仅仅限于 请求/响应过程,结束后 断开,下⼀次请求时,服务器会认为是⼀个新的客户端,为了维护他们之间的连接, 让服务器知道这是前⼀个⽤户发起的请求,必须在⼀个地⽅保存客户端信息。
session
session :通过在服务端记录的信息确定⽤户身份 这⾥这个session就是⼀个指的是会话
处理不信任的SSL证书
什么是SSL证书? SSL证书是数字证书的⼀种,类似于驾驶证、护照和营业执照的电⼦副本。 因为配置在服务器上,也称为SSL服务器证书。SSL 证书就是遵守 SSL协 议,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能。
测试⽹站 https://inv-veri.chinatax.gov.cn/