本系列为自己学习爬虫的相关笔记,如有误,欢迎大家指正
引入
- 在python实现的网络爬虫中,用于网络请求发送的模块有两种,第一种为urllib模块,第二种为requests模块。urllib模块是一种比较古老的模块,在使用的过程中较为繁琐和不便。当requests模块出现后,就快速的代替了urllib模块,因此,在我们课程中,推荐大家使用requests模块。
- Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。
what is requests
requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求。功能强大,用法简洁高效。在爬虫领域中占据着半壁江山的地位。
为什么要使用requests模块
- 在使用urllib模块的时候,会有诸多不便之处,总结如下:
- 手动处理url编码
- 手动处理post请求参数
- 处理cookie和代理操作繁琐
- ……
- 使用requests模块:
- 自动处理url编码
- 自动处理post请求参数
- 简化cookie和代理操作
- ……
如何使用requests模块
- 环境安装
- pip install requests
- 使用流程/编码流程
- 指定url
- 基于requests模块发起请求
- 获取响应对象中的数据值
- 持久化存储
第一个爬虫程序
- 需求:爬取搜狗首页的页面数据
#导包
import requests
#step_1:指定url
url = 'https://www.sogou.com/'
#step_2:发起请求:使用get方法发起get请求,该方法会返回一个响应对象。参数url表示请求对应的url
response = requests.get(url=url)
#step_3:获取响应数据:通过调用响应对象的text属性,返回响应对象中存储的字符串形式的响应数据(页面源码数据)
page_text = response.text
#step_4:持久化存储
with open('./sogou.html','w',encoding='utf-8') as fp:
fp.write(page_text)
print('爬取数据完毕!!!')
-
(1)r.text是服务器响应的内容,会自动根据响应头部的字符编码进行解码。
-
(2)r.encoding是服务器内容使用的文本编码。
-
(3)r.status_code用于检测响应的状态码,如果返回200,就表示请求成功了;如果返回的是4xx,就表示客户端错误;返回5xx则表示服务器错误响应。我们可以用r.status_code来检测请求是否正确响应。
-
(4)r.content是字节方式的响应体,会自动解码gzip和deflate编码的响应数据。(5)r.json()是Requests中内置的JSON解码器。
基于requests模块经典案例实战
通过5个基于requests模块的爬虫项目对该模块进行学习和巩固
-
基于requests模块的get请求
-
需求:爬取搜狗指定词条对应的搜索结果页面(简易网页采集器)
-
反爬机制
-
User-Agent:请求载体的身份标识,使用浏览器发起的请求,请求载体的身份标识为浏览器,使用爬虫程序发起的请求,请求载体为爬虫程序。
-
UA检测:相关的门户网站通过检测请求该网站的载体身份来辨别该请求是否为爬虫程序,如果是,则网站数据请求失败。因为正常用户对网站发起的请求的载体一定是基于某一款浏览器,如果网站检测到某一请求载体身份标识不是基于浏览器的,则让其请求失败。因此,UA检测是我们整个课程中遇到的第二种反爬机制,第一种是robots协议。
-
UA伪装:通过修改/伪装爬虫请求的User-Agent来破解UA检测这种反爬机制,具体实现见下属代码:
# -*- encoding = utf-8 -*- #UA :User-Agent:请求载体的身份标识 #UA伪装:门户网站的服务器会检测对应请求的载体身份标识,如果检测到请求的载体为某一款浏览器,说明该请求是一个正常的请求, # 但是,如果检测到请求的载体身份标识不是基于某一款浏览器的,则表示该请求不是正常的请求 import requests if __name__ =='__main__': url = 'http://www.sogou.com/web' # 指定搜索关键字 kw = input('请输入需要查询的关键字:') headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.91 Safari/537.36' } # 处理url携带的参数:封装到字典中 param = { 'query':kw } #对指定的url发起的请求是携带参数的,并且请求过程中处理了请求 不加headers则有可能会标识为非法请求,无法获得请求数据 #response = requests.get(url=url,params=param) response = requests.get(url=url,params=param,headers=headers) # 获取响应数据 page_text = response.text; # 持久化存储 fileName = kw+'.html' with open(fileName,'w',encoding='utf-8') as fp: fp.write(page_text) print(kw+'保存成功')
-
-
-
基于requests模块的post请求
-
需求:破解百度翻译
# -*- encoding=utf-8 -*- import requests import json if __name__ =='__main__': #指定url post_url = 'https://fanyi.baidu.com/sug' kw = input('请输入要翻译的文字:') # 请求参数处理 data = { 'kw'
-