网络爬虫之规则
requests库安装
安装:pip install requests
遇到的问题:
当我在cmd中输入pip install requests
之后,却返回了:Requirement already satisfied
,然后我顺着后面的提示,在c盘中的anaconda3中的第三方库中找到了requests库
但是我用python自带的IDLE测试安装结果的时候,却失败了。
解决方法:
直接打开pycharm,新建.py文件,然后直接import requests
,软件会自动提示没有这个库,根据提示,点击安装就行了,因为这种情况正常安装好像无法安装上,没想到用这个办法却实现了(^▽^)。
requests库的七个主要方法
方法 | 说明 |
---|---|
requests.request() | 构造一个请求,支撑以下各方法的基础方法 |
requests.get() | 获取HTML网页的主要方法,对应于HTTP的GET |
requests.head() | 获取HTML网页头信息的方法,对应于HTTP的HEAD |
requests.post() | 向HTML网页提交POST请求的方法,对应于HTTP的POST |
requests.put() | 向HTML网页提交PUT请求的方法,对应于HTTP的PUT |
requests.patch() | 向HTML网页提交局部修改请求,对应于HTTP的PATCH |
requests.delete() | 向HTML页面提交删除请求,对应于HTTP的DELETE |
requests库的get()方法
.png)
.png)
.png)
response对象的属性
.png)
.png)
爬取网页的通用代码框架
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=input()
print(getHTMLText(url))
HTTP协议对资源的操作
方法 | 说明 |
---|---|
GET | 请求获取URL位置的资源 |
HEAD | 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息 |
POST | 请求向URL位置的资源后附加新的数据 |
PUT | 请求向URL位置存储一个资源,即改变该处资源的部分内容 |
PATCH | 请求局部更新URL位置的资源,即改变该处资源的部分内容 |
DELETE | 请求删除URL位置存储的资源 |
网络爬虫引发的问题
- 性能骚扰
- 法律风险
- 隐私泄露
网络爬虫的尺寸
.png)
网络爬虫的限制
.png)
Robots协议
作用:
网站告知网络爬虫哪些页面可以抓取,哪些不行
形式:
再往站根目录下的robots.txt文件
真实的网络robots协议:
http://www.baidu.com/robots.txt
http://news.sina.com.cn/robots.txt
http://www.qq.com/robots.txt
http://news.qq.com/robots.txt
http://www.moe.edu.cn/robots.txt (无robots协议)
使用:
- 网络爬虫:自动或人工识别robots.txt,再进行内容爬取
- 约束性:robots协议是建议但非约束性,网络爬虫可以不遵守,但存在法律风险
- 原则:类人类行为可不参考robots协议
实例一:京东商品页面的爬取
import requests
url="https://item.jd.com/2391981.html"
try:
r=requests.get(url)
r.raise_for_status()
r.encoding=r.apparent_encoding
print(r.text[:1000])
except:
print("爬取失败")
实例二:亚马逊商品页面的爬取
import requests
url="https://www.amazon.cn/gp/product/B01M8L5Z3Y"
try:
kv={'user-agent':'Mozilla/5.0'}
r=requests.get(url,headers=kv)
r.raise_for_status()
r.encoding=r.apparent_encoding
print(r.text)
except:
print("爬取失败")
实例三:百度360搜索关键词提交
360搜索:
import requests
keyword="Python"
try:
kv={'q':keyword}
r=requests.get("http://www.so.com/s",params=kv)
print(r.request.url)
r.raise_for_status()
print(len(r.text))
except:
print("爬取失败")
import requests
keyword="Python"
try:
kv={'wd':keyword}
r=requests.get("http://www.baidu.com/s",params=kv)
print(r.request.url)
r.raise_for_status()
print(len(r.text))
except:
print("爬取失败")
ps:经过两个的爬取结果分析,发现360的robots协议居然那么友好,诶,百度的robots协议就不行了啊,各种限制
网络图片的爬取和存储
import requests
import os
url="http://pic.netbian.com/uploads/allimg/190824/212516-15666531161ade.jpg"
root="F:/Picture/"
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)
with open(path,'wb') as f:
f.write(r.content)
f.close()
print("文件保存成功")
else:
print("文件已存在")
except:
print("爬取失败")
IP地址归属地的自动查询
import requests
url="http://m.ip138.com/ip.asp?ip="
try:
r=requests.get(url+'118.89.134.177')
r.raise_for_status()
r.encoding=r.apparent_encoding
print(r.text[-500:])
except:
print("爬取失败")
参考资料
https://www.icourse163.org/learn/BIT-1001870001?tid=1206951268#/learn/content