爬虫程序开发环境
1 安装Requests库
1. 管理员权限打开命令行
执行 pip install requests
2. pycharm下载
2 HTTP与Requests
2.1 了解HTTP协议
1. HTTP,Hypertext Transfer Protocol,超文本传输协议
2. HTTPrequ是一个基于“请求与响应”模式的,无状态的应用层协议
3. URL格式 http://host[:port][path]
host: 合法的internet主机域名或IP地址
port: 端口号,缺省端口号为 80
path: 请求资源的路径
如:
http://www.bit.edu,cn
http://220.182.111.188
URL是通过HTTP协议存取资源的internet路径,一个URL对应一个数据资源
4. HTTP协议对资源的操作
GET 请求获取URL的资源
HEAD 请求获取url位置资源的响应消息报告,即获取该资源的头部信息
POST 请求向URL位置的资源后附加新的定向
PUT 请求向URL位置储存一个资源,覆盖原URL位置的资源
PATCH 请求局部更新URL位置的资源,即改变该处资源的部分内容
DELETE 请求删除URL位置储存的资源
options
2.2 Requests的主要方法
1. requests.request() 构造一个请求,是支撑以下各方法的基础方法,以下方法基于此方法封装
2. requests.get() 获取HTML网页的主要方法,对应于HTTP的GET
3. requests.head() 获取HTML网页头信息的方法,对应于HTTP的HEAD
4. requests.post() 向HTML网页提交POST请求的方法,对应于HTTP的POST
5. requests.put() 向HTML网页提交PUT请求的方法,对应于HTTP的PUT
6. requests.patch() 向HTML网页提交局部修改请求,对应于HTTP的PATCH
7. requests.delete() 向HTML网页提交删除请求,对应于HTTP的DELETE
2.3 Requests的主要方法使用
1. request(method,url,**kwargs)
method: 请求方式,对应get/put/post/head/patch/delete/options等
url: 拟获取页面的url链接
**kwargs: 控制访问的参数,共13个
1.1 **kwargs:控制访问参数,均为可选项
(1*)params :字典或字节序列,作为参数增加到url中
如:
payload = {'key1':'valuse1','key2':'value2'}
r = requests.post('GET',url,data = payload)
print(r.url)
(2*)data: 字典,字节序列或文件对象,作为Request的内容
如:
payload = {'key1':'valuse1','key2':'value2'}
r = requests.post('POST',url,data = payload)
body = '主题内容'
r = requests.post('POST',url,data = body)
--向url提交普通数据时自动放入form同级位
(3*)json: json格式的数据,作为Request的内容
如:
payload = {'key1':'valuse1','key2':'value2'}
r = requests.post('POST',url,json = payload)
(4*)headers: 字典,HTTP定制头
如:
hd = {'user-agent':'chrome/10'}
r = requests.request('POST',url,headers=hd)
(5)cookies: 字典或CookieJar,Request中的cookie
(6)auth: 元组,支持HTTP认证功能
(7)files: 字典类型,传输文件
如:
fs = {'file':open('data.xls','rd')}
r = requests.request('POST',url,files=fs)
(8)timeout: 设定超时时间,单位秒
如:
r = requests.request('GET',url,timeout=30)
(9)proxies: 字典类型,设定访问代理服务器,可以增加登陆认证
如:
pxs = {'http':'http://user:pass@10.10.10.1.1234'
'https':'https://10.10.10.1.4321'}
r = requests.request('GET',url,proxies=pxs)
(10)allow_redirects: True/false,默认为True,重定向开关(表示是否允许对url进行重定向)
(11)stream: True/'False,默认为True,获取内容立即下载开关(表示是否对获取的内容立即下载)
(12)verify: True/False,默认为true,认证 SSL证书开关()
(13)cert: 本地SSL证书路径
2. head(url,**kwargs)方法
**kwargs(同1.1)
r = requests.head(url)
r.headers
#打印 {'Date': 'Fri, 16 Sep 2022 08:12:14 GMT', 'Content-Type': 'text/html;charset=UTF-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Vary': 'Accept-Encoding', 'X5-Punish-Cache': 'miss', 'Cache-Control': 'no-store', 'Access-Control-Allow-Credentials': 'true', 'Set-Cookie': 'x5secdata=xb386181bd8f562f516314096dc617c13d1663315934a-717315356a471530493abaad2aaa__bx__p4psearch.1688.com%3A443%2Fp4p114%2Fp4psearch%2Foffer2.htm; Max-Age=20; Expires=Fri, 16-Sep-2022 08:12:34 GMT; Domain=1688.com; Path=/', 'bxpunish': '1', 'Server': 'Tengine/Aserver', 'EagleEye-TraceId': '2147b46e16633159345622664ebc78', 'Strict-Transport-Security': 'max-age=31536000', 'Timing-Allow-Origin': '*', 'Content-Encoding': 'gzip'}
r.text
#打印 ''<- 没错就是空的,不是我没写
#优点,节省网络带宽
3. post(url,data=None,json=None,**kwargs)方法
data(同1.1的data访问控制参数)
json(同1.1json访问控制参数)
**kwargs(同1.1,data,json除外)
payload = {'key1':'valuse1','key2':'value2'}
r = requests.post(url,data = payload)
print(r.text)
#打印{
...
"form":{
'key1':'valuse1',
'key2':'value2'
},
}
# 向url提交键值对时自动放入form下
r = requests.post(url,data = 'abc')
#打印{
...
"data":'abc',
"form":{
},
}
# 向url提交普通数据时自动放入form同级位置
4. put(url,data=None,**kwargs)方法
data(同1.1data访问控制参数)
**kwargs(同1.1,data除外)
与post()方法类似,会替换相应位置的原有数据
5. get(url,params=None,**kwargs)方法
params(同1.1的params访问控制参数)
**kwargs(同1.1,params除外)
6. delete(url,**kwargs)
**kwargs(同1.1)
3. Requests的get方法
使用 r = requests.get(url,params=None,**kwargs)
url:拟获取页面的url链接
params:url中的额外参数,字典或字节流格式(可选)
**kwargs:12个控制访问的参数(可选)
4. Response对象的属性
r.status_code HTTP请求的返回状态,200表示连接成功,404表示失败
r.text HTTP响应内容的字符串形式,即,url对应的页面内容
r.encoding 从HTTP header中‘猜测’的响应内容编码方式
r.apparent_encoding 从内容中分析出的响应内容编码方式(备选编码方式)
r.content HTTP响应内容的二进制形式
r.headers HTTP响应页面的头部信息
5. Requests使用的基本流程
1. 使用r.status_code 检查访问状态
2. 如果r.status_code=200 则使用 r.text,r.encoding,r.apparent_encoding,r.content解析
3. 如果r.status_code=404 本次访问出错
6. Requests库的异常
1. requests.ConnectionError 网络连接错误异常,如DNS查询失败/服务器的防火墙拒绝连接
2. requests.HTTPError HTTP错误异常
3. requests.URLRequired URL缺失异常
4. requests.TooManyRedirects 超出最大重定向次数,产生重定向异常
5. requests.ConnectTimeout 连接远程服务器超时异常(从连接远程服务器时开始的时间)
6. requests.Timeout 请求URL超时时,产生超时异常(全过程的总时间)
7. 爬取网页的通用代码框架
import requests
def getHTMLText(url):
try:
r = requests.get(url,timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
except:
return "请求错误"
if __name__=="__main__";
url="http://www.baidu.com"
print(getHTMLText(url))
8. 网络爬虫的限制
1.来源审查: 判断User-Agent进行限制
·检查来访HTTP协议头的User-Agent域,只响应浏览器或友好爬虫的访问
·属于技术限制
2.发布公告: Robots协议
·告知所有爬虫网站的爬取策略,要求爬虫遵守
·是否遵守有爬虫自身来决定
·属于道德限制
3. Robots协议
全称 Robots Exclusion Standard 网络爬虫排除标准
作用 网站告知所有爬虫那些页面可以抓取,那些不行
形式 在网站根目录下的robots.txt
例如:
user-agent:* * 表示所有的爬虫
Disallow:/?* 表示不能访问以?开头的路径
Disallow:/pop/*.html 表示不能访问符合/pop/*.html的页面
Disallow:/pinpai/*.html?* 表示不能访问符合/pinpai/*.html?*的页面
user-agent:HuihuiSpider 表示HuihuiSpider爬虫
Disallow:/ 表示不允许爬取网站的任何资源
user-agent:GwdangSpider
Disallow:/
user-agent:WochachSpider
Disallow:/