1、request库入门
**requests.get(url,params=None,kwargs)
url:拟获取页面的url链接
params:url中的额外参数,字典或字节流格式,可选
**kwargs:12个控制访问参数
构造一个向服务器请求资源的Request对象
返回一个包含服务器资源的Response对象(包含爬虫返回的全部内容)
爬取网页爬虫的通用代码框架
由于网络连接有风险,所以request语句不一定成立,因此异常处理很重要。
raise_for_status()判断返回的response状态是否为200,如果是表示返回的内容正确
通用代码框架:
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))
http协议与request库的主要方法:
Http协议:是一个基于“请求与响应”模式的、无状态的应用层协议,采用URL作为定位网络资源的情况。
URL格式:http://host[:port][path]
host:合法的iinternet主机域名或ip地址
port:端口号,缺省端口为80
path:请求资源在主机或ip地址的服务器上包含的的内部路径
patch可以节省网络带宽
由于网络安全,很难向服务器发起post、put、delete请求,尝使用get,head
说明向url post一个字典时自动编码为form(表单)
说明向url post一个字符串时自动编码为data,put方法类似
requests库主要方法解析
options向服务器获取一些与客户端打交道的参数,不与获取资源直接相关
2、网络爬虫的盗亦有道
网络爬虫引发的问题:骚扰问题、法律风险、隐私泄露
无robots协议默认可以爬所有信息,类人行为可不参考robots协议
3、request库爬取实例
实例一:京东商品页面的爬取
import requests
url = "https://item.jd.com/100002432068.html"
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[:1000])
except:
print("爬取失败")
实例二:亚马逊商品页面的爬取
访问出现了错误
亚马逊告诉我们出现了错误而错误似乎是由api造成的,有些网站通过判断访问请求的http头来判断访问是否是由爬虫引起的
从user-agent可以看出这样的访问告知了亚马逊服务器是由爬虫程序访问的,因此遭到了拒绝
设法更改头部信息
实例三:百度360搜索关键字提交
params参数可用于向url中增加参数
通过安全验证之后成功爬取
爬取百度的信息
import requests
url = "https://www.baidu.com/s"
try:
kv = {"wd": "python"}
r = requests.get(url, params=kv)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text)
except:
print("爬取失败")
爬取360的信息
import requests
url = "https://www.so.com/s"
try:
kv = {"wd": "python"}
r = requests.get(url, params=kv)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text)
except:
print("爬取失败")
实例四:网络图片的爬取和存储
content是以二进制形式返回信息
import requests
import os
url = "http://a2.att.hudong.com/36/48/19300001357258133412489354717.jpg"
root = "D://1//"
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("爬取失败")
os.path.exists()就是判断括号里的文件是否存在的意思,括号内的可以是文件路径。
'wb’以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
实例四:IP地址归属地的动态查询
www.ip138.com可以查询
import requests
url = "http://m.ip138.com/ip.asp?ip="
try:
r = requests.get(url + '202.204.80.112')
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[-500:])
except:
print("爬取失败")