网络爬虫规则
我用的操作系统ubuntu + pycharm + anaconda
在网上搜教程即可安装好,利用conda下载 requests 库,在pycharm 中配置anaconda 作为编译器环境即可
#requests库7个主要方法:
a、requests.request() 构造一个请求,支撑以下各方法的基础方法
b、requests.get() 获取HTML网页的主要方法,对应于HTTP的GET
c、requests.head() 获取HTML网页头信息的方法,对应于HTTP的HEAD
d、requests.post() 向HTML网页提交POST请求的方法,对应于HTTP的POST
e、requests.put() 向HTML网页提交PUT请求的方法,对应于HTTP的PUT
f、requests.patch() 向HTML网页提交局部修改请求,对应于HTTP的PATCH
g、requests.delete() 向HTML页面提交删除请求,对应于HTTP的DELETE
r = requests.get(url)
r是返回一个包含服务器资源的Response对象,右边是构造一个向服务器请求资源的Request对象
requests.get(url,params=None,**kwargs) 完整格式
params:url中的额外参数,字典或者字节流格式可选
**kwargs:12个控制访问参数可选
打开源码可知,get方法是调用requests方法封装的,实际上7个方法中,其余6个都是由request方法封装
Response对象常用5个属性
r.status_code HTTP请求的返回状态,200表示连接成功,404表示失败
r.text HTTP响应内容的字符串形式,即,url对应的页面内容
r.encoding 从HTTP header中猜测的响应内容编码方式,如果header中不存在charset,则认为编码为ISO-8859-1
r.apparent_encoding 从内容中分析出的响应内容编码方式(备选编码方式)
r.content HTTP响应内容的二进制形式
requests库异常
requests.ConnectionError 网络连接错误异常,如DNS查询失败、拒绝连接等
requests.HTTPError HTTP错误异常
requests.URLRequired URL缺失异常
requests.TooManyRedirects 超过最大重定向次数,产生重定向异常
requests.ConnectTimeout 连接远程服务器超时异常
requests.Timeout 请求URL超时,产生超时异常
爬取网页的通用代码框架
import requests
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
# 如果状态不是200,引发httperror异常
r.encoding = r.apparent_encoding
return r.text
except:
return "产生异常"
if __name__=="__main__":
url = "http://www.baidu.com"
print(getHTMLText(url))
http协议对资源的6中操作:
GET 请求获取URL位置的资源
HEAD 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息
POST 请求向URL位置的资源后附加新的数据
PUT 请求向URL位置存储一个资源,覆盖原URL位置的资源
PATCH 请求局部更新URL位置的资源,即改变该处资源的部分内容
DELETE 请求删除URL位置存储的资源
通过URL和命令管理资源,操作独立无状态,网络通道及服务器成为了黑盒子
理解PATCH和PUT的区别:
假设URL位置有一组数据UserInfo,包括UserID、UserName等20个字段
需求:用户修改了UserName,其他不变
. 采用PATCH,仅向URL提交UserName的局部更新请求
. 采用PUT,必须将所有20个字段一并提交到URL,未提交字段被删除
PATCH的最主要好处:节省网络带宽
http协议与requests库功能是一致的
requests.request()
requests.request(method, url, **kwargs)
method : 请求方式,对应get/put/post等7种
∙ url : 拟获取页面的url链接
∙ **kwargs: 控制访问的参数,共13个
method : 请求方式
r = requests.request(‘GET’, url, **kwargs)
r = requests.request(‘HEAD’, url, **kwargs)
r = requests.request(‘POST’, url, **kwargs)
r = requests.request(‘PUT’, url, **kwargs)
r = requests.request(‘PATCH’, url, **kwargs)
r = requests.request(‘delete’, url, **kwargs)
r = requests.request(‘OPTIONS’, url, **kwargs)
**kwargs: 控制访问的参数,均为可选项
params : 字典或字节序列,作为参数增加到url中
data : 字典、字节序列或文件对象,作为Request的内容
json : JSON格式的数据,作为Request的内容
headers : 字典,HTTP定制头
cookies : 字典或CookieJar,Request中的cookie
auth : 元组,支持HTTP认证功能
files : 字典类型,传输文件
timeout : 设定超时时间,秒为单位
proxies : 字典类型,设定访问代理服务器,可以增加登录认证
allow_redirects : True/False,默认为True,重定向开关
stream : True/False,默认为True,获取内容立即下载开关
verify : True/False,默认为True,认证SSL证书开关
cert : 本地SSL证书路径
2. robots.txt 网络爬虫排除标准
小规模,数据量小,爬取速度不敏感,Requests库 , 90%以上 , 爬取网页 玩转网页
中规模,数据规模较大,爬取速度敏感,Scrapy库 ,爬取网站 爬取系列网站
大规模,搜索引擎爬取,速度关键 ,定制开发,爬取全网
限制网络爬虫:1.来源审查 2.robots协议
3.实例:京东商品链接
import requests
url = 'https://item.jd.com/100004404944.html'
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
#如果状态不是200,引发httperror异常
r.encoding = r.apparent_encoding
print(r.text[:1000])
except:
print("产生异常")
亚马逊商品(修改头部)
import requests
r = requests.get('https://www.amazon.cn/dp/B07TYR42LV')
print(r.status_code) # 网络没错,浏览器判断不同。
print(r.encoding)
print(r.request.headers) # 头部信息
kv = {'user-agent':'Chrome/5.0'}
url = 'https://www.amazon.cn/dp/B07TYR42LV'
r = requests.get(url, headers = kv)
print(r.status_code)
print(r.request.headers)
page = r.text
print(page)
http://www.baidu.com/s?wd=keyword
http://www.so.com/s?q=keyword
import requests
arg='wd'
keyword='Python'
try:
kv={arg:keyword}
r = requests.get('http://www.baidu.com/s',params = kv)
r.raise_for_status()
print(r.status_code)
print(r.request.url)
print(len(r.text))
except:
print("spider failed")
格式:http://www.exp.com/pic.jpg
国家地理:http://www.ngchina.com.cn/
import requests
import os
url = "http://image.ngchina.com.cn/2019/1026/20191026093445665.jpg"
root = "E://kaifa//pics//"
path = root + url.split('/')[-1]
try:
# 当前根目录是否存在
if not os.path.exists(root):
os.mkdir(root)
print(path)
# 当前文件是否存在
if not os.path.exists(path):
r = requests.get(url)
r.raise_for_status()
print(r.status_code)
with open(path,'wb') as f:
f.write(r.content)
f.close()
else:
print("file exists!")
except:
print("spider failed")
import requests
url = "http://m.ip138.com/ip.asp?ip="
try:
r = requests.get(url + '202.204.80.112')
r.raise_for_status()
print(r.status_code)
r.encoding = r.apparent_encoding
print(r.text[-500:])
except:
print("spider failed")