赞
踩
写在前面
【python爬虫基础入门】系列是对python爬虫的一个入门练习实践,旨在用最浅显易懂的语言,总结最明了,最适合自己的方法,本人一直坚信,总结才会使人提高
使用python爬虫是建立在HTTP协议之上的,何为HTTP协议呢?
用比较容易理解的话来说,HTTP协议是一种超文本传输协议,是一个基于“请求与响应”模式的、无状态的应用层协议
此外HTTP协议将使用URL作为定位网路资源的标识,其URL格式如http://host[:port][path]
HTTP url
实例
HTTP中的ur
l通过HTTP协议存取资源的Internet路径,一个url
对应的是一个数据资源。类似于在自己电脑上各个目录下的文件 ,只不过这里的资源是放在网上的服务器中
HTTP协议对资源的操作如下,requests库的各种方法是依托于HTTP的各种资源操作。
方法 | 说明 |
---|---|
GET | 请求获取URL位置的资源 |
HEAD | 请求获取URL位置资源的头部信息 |
POST | 请求向URL位置的资源后面追加新的数据 |
PUT | 请求向URL位置的资源储存一个新的资源,将覆盖原有的资源 |
PATCH | 请求局部更新URL位置的资源,即改变该处资源的一部分(更新部分内容,更节省带宽) |
DELETE | 请求删除URL位置存储的资源 |
综上来看,HTTP协议是网络传输协议的基本,也是python中requests库的爬取操作的基本,更好的理解HTTP协议可以更清楚的理解requests爬虫
python中的requests库用于对特定的网页进行访问抓抓取操作,是python功能强大的一个库,常常应用于特定静态网页的数据抓取。使用pip
工具在命令行中输入安装request库
pip install requests
requests库中包含有七个主要的方法,其中requests.request()
为主方法,其他的六种方法如get,head
方法等等等均是对requests.request()
的封装使用。在使用的过程中,可以更具特定的需要方便选择主方法或者封装的方法,七种方法如下
方法 | 说明 |
---|---|
ruquests.request() | 构造一个请求,支撑一下各种方法的基础方法 |
ruquests.get() | 获取html网页的主要方法,对应于http的get(最常用) |
ruquests.head() | 获取html网页头信息的方法,对应于http的head(最常用) |
ruquests.post() | 向html网页提交post请求的方法,对应于http的post |
ruquests.put() | 向html网页提交put请求的方法,对应于http的put |
ruquests.patch() | 向html网页提交局部的修改请求,对应于http的patch |
ruquests.delete() | 想html网页提交删除请求,对应于http的delete |
这里以主方法request方法为例子如下
ruquests.request(method,url,**kwargs)
这里包含有三个参数method,url,**kwargs
其中,**kwargs
包含params,data,json,headers,cookies,auth,files,timeout,proxies,allow_redirects,stream,verify,cert
13个参数,参数使用说明如下
params:字典或者字节序列,作为参数增加到url中(常用与请求服务器特定资源)
kv = {'hey1':'value1', 'key2':'value2'}
r = requests.request('GET','http://python123.io/ws', params=kv)
print('r.url')
>>>http://python123.io/ws?key1=value1&key2=value2 # ? 号后面才是要跟上的内容
data:字典、字节序列或者文件对象,作为Request的内容(常作为向服务器提交资源使用)
kv = {'hey1':'value1', 'key2':'value2'}
r = requests.request('POST','http://python123.io/ws', data=kv)
# 或者直接使用字段
body='主题内容'
r = requests.request('POST','http://python123.io/ws', data=body)
json:JSON格式的数据,作为Request的内容(常用于向服务器提交)
r = requests.request('POST','http://python123.io/ws', json=kv)
headers:字典,HTTP定制头(常用于模拟游览器)
hd = {'user-aget':'Chrome/10'}
r = requests.request('POST','http://python123.io/ws', hheader=hd)
cookies:字典或者CookieJar,Requests中的cookie,在不同用户游览器的特定页面中有特定的值
auth:元祖,支持HTTP认证功能
files:字典类型,传输文件(常用于向服务器传输文件使用)
fs = {'file' : open('data.xls','rb')}
r = requests.request('POST','http://python123.io/ws', files=fs)
timeout:设定超时单位,秒为单位(常用于服务器请求)
r = requests.request('GET','http://python123.io/ws', timeout=10)
proxies:字典类型,设定访问代理服务器,可以增加登陆认证(常用于隐藏原ip地址)
pxs = {'http': 'http://user:pass@10/.10.10.1:1234'
'https': 'https://10.10.10.1:4321'}
r = requests.request('GET','http://python123.io/ws', proxies=pxs)
request方法是最基本的方法,其他的类似于get方法等都是基于Request方法之上的一种封装形式
在网页请求中,常常使用get,head,post
三种方法
import requests
r = requests.get(url) # 获取网页网址
print(r.status_code) # 请求状态码
r.encoding = 'utf-8' # 设置编码
r.text # 将打印输出
这样的r
作为Response
返回的对象,包含从服务器返回的所有相关资源
requests.get方法的完整使用
requests.get(url,params=None,**kwargs)
url
: 指定页面的链接params
: url中的额外参数,字典或者字节流格式,为可选择项**kwargs
:12个控制访问的参数Response对象的属性表如下
属性 | 说明 |
---|---|
r.status_code | http请求的返回状态码,200表示连接成功,404或者其他字符表示连接失败 |
r.text | 打印http响应内容的字符串形式,即为url对应的页面内容 |
r.encoding | 从http的header中猜测的响应内容的编码方式 |
r.apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式) |
r.content | http响应内容的二进制形式 |
需要注意的是
r.encoding
:使用的http协议中charset
的默认编码格式,通常为ISO-8859-1
r.apparent_encoding
:将会根据网页内容分析出可读的编码方式,通常为UTF-8
Response对象属性的基本流程
r.status_code
来检查返回的Response
对象的返回状态码
r.text
,r.encoding
,r.apparent_encoding
,r.content
来解析返回的内容)用head方法来获取url中的头部信息,应用如下
r = requests.head(url,**kwargs) # 获取头部信息
r.headers # 输出头部信息
post方法可以对请求向URL位置的资源后面追加新的数据,应用如下
r = requests.post(url,**kwargs) # 模版
# 如下
payload = {'key1':'valu1', 'key2':'value2'} # 创建一个字典
# 向URL POST一个字典,自动编码为一个form表单
r = requests.post('http://httpbin.org/post',data = payload) # 提交修改
print(r.text) # 打印追加后的内容
如果不提交一个字典,只是传入一个数据,如data,这样将会自动传入一个数据量,如下
r = requests.post('http://httpbin.org/post',data = 'ABC') # 提交修改
print(r.text) # 打印追加后的内容
常用的requests
的异常处理如下
异常 | 说明 |
---|---|
ruquests.ConnectionError | 网络连接错误异常,如DNS查询失败、拒绝连接等 |
ruquests.HTTPError | HTTP错误异常 |
ruquests.URLRequired | URL缺失异常 |
ruquests.TooManyRedirects | 超过最大重定向次数,产生重定向异常 |
ruquests.ConnectTimeout | 连接远程服务器超时异常(仅仅为与远程服务器连接过长) |
ruquests.Timeout | 请求URL超时,产生超时异常(获得内容的整个过程) |
requests
库中对于异常处理的方法调用
异常方法 | 说明 |
---|---|
r.raise_for_status() | 此方法将检测返回状态码是否是200,如果不是200,则产生ruquests.HTTPError异常 |
在爬取网页的时候需要我们搭建好一套流程,如同一套框架,清晰的框架可以使得在爬取数据的过程中,更容易检测错误。爬取原声静态网页框架可参照如下
import requests def getHTMLText(url): try: r = requests.get(url,timeout = 30) r.raise_for_status() # 检测返回状态码,反之则报错 r.encoding = r.apparent_encoding return r.text # 返回获取网页的内容 except: return '产生异常' # 主函数 if __name__ == "__main__": url = 'http://www.baidu.com' print(getHTMLText(url))
将游览器网址url
设置为https://itm.jd.com/2967929.html
使用Request库获取商品页面信息,具体代码如下
import requests
url = 'https://item.jd.com/2967929.html'
kv = {'user-agent': 'Mozilla/5.0'} # 加入游览器头部信息,隐藏头
try:
r = requests.get(url,header=kv)
r.raise_for_status()
r.encoding = r.appraent_encoding
printf(r.txt[:1000]) # 限定显示前1000个字符
expect:
print('爬取出错')
http://www,baidu.com/s?wd=keyword
http://www.so.com/s?q=keyword
代码如下
import requests ''' 使用requests库使用百度进行关键字搜索 ''' keyword = "Python" # 要搜索的关键字 try: kv = {'wd':keyword} url = 'http://www.baidu.com/s' r = requests.request('Get',url,params=kv) # r = requests.get(url,params=kv) # 也可用使用这样的做法 print(r.request.url) r.raise_for_status() print(len(r.text)) except: print('something wrong!')
使用requests库在特定的网页中进行网络图片的爬取,具体代码如下
# -*- coding: utf-8 -*- # @Time : 2020/4/14 22:08 # @Author: 哦嚯嚯哦 # @File : Demo3.py # @tool : PyCharm import requests import os ''' 使用requests库在特定的网址获取图片,并保存在本地文件夹 ''' kv = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36', 'Referer': 'https://www.baidu.com/' # 请求防盗链,用于请求网站的反爬 } url = 'https://i.loli.net/2020/05/16/nwGVPKSbtToYOac.jpg' # 图片网址 root = 'F://User_Desktop/py_test/' # 保存路径 path = root + url.split('/')[-1] # 使用图片的最后几个字节作为文件名存储 try: if not os.path.exists(root): os.mkdir(root) if not os.path.exists(path): r = requests.get(url, headers=kv) with open(path,'wb') as f: # 以二进制方式写入 f.write(r.content) r.close() print('文件保存成功') else: print('文件已经存在') except: print('something wrong!')
将上述代码改进加入循环爬取可以实现批量定向爬取网站图片,效果的话,可以自己尝试下,这里就不予展示了。
根据使用网络爬虫的功能的不同,尺寸的不同,将网络爬虫分为三个类
该协议作为网络爬虫的一种标准,内嵌于网站中,存在于网站根目录下的robots.txt文件中,告知网络爬虫哪些页面可以抓取,哪些不允许被抓取
Robots协议的基本语法
# *通配符代表素有,/表示根目录
User-Agent: *
Disallow: /
Robots协议的网站举例
https://www.baidu.com/robots.txt
https://www.csdn.net/robots.txt
Robots协议的使用方法,在编写网络爬虫的时候,应当做到以下几点
虽然规则已经定在哪里,但是使用爬虫的时候还是要将规则牢记于心,违法犯罪的事情千万不能做。
有句话说的好,“爬虫学的好,监狱蹲到老”(当然这只是开玩笑的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。