自动爬取HTML页面,自动网络请求提交
pip install requests
>>> import requests
>>> r = requests.get("http://ww.baidu.com")
>>> r.status_code #响应状态码
200
>>> r.encoding = 'utf-8'
>>> r.text
'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> .....
requests.get(url,params=None,**kwargs)
url:拟获取页面的url链接
params:url中的额外参数,字典或字节流格式,可选
**kwargs:12个控制访问的参数
Response对象包含服务器返回的所有信息,也包含请求的Request信息
Reaponse对象的属性 | 说明 |
---|---|
r.status_code |
HTTP请求的返回状态,200表示连接成功,404表示失败 |
r.text |
HTTP响应内容的字符串形式,即url对应的页面内容 |
r.encoding |
从HTTP header中猜测的响应内容编码方式 |
r.apparent_encoding |
从内容中分析出的响应内容编码方式(备选编码方式) |
r.content |
HTTP响应内容的二进制形式 |
>>> import requests
>>> r = requests.get("http://www.baidu.com")
>>> r.status_code
200
>>> type(r)
<class 'requests.models.Response'>
>>> r.headers
{'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Mon, 05 Sep 2022 05:27:43 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:27:36 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
异常 | 说明 |
---|---|
requests.ConnectionError |
网络连接错误异常,如DNS查询失败、拒绝连接等 |
requests.HTTPError |
HTTP错误异常 |
requests.URLRequired |
URL缺失异常 |
requests.TooManyRedirects |
超过最大重定向次数,产生重定向异常 |
requests.ConnectTimeout |
连接远程服务器超时异常 |
requests.Timeout |
请求URL超时,产生超时异常 |
r.raise_for_status() |
如果不是200(正确),产生异常 requests.HTTPError |
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协议——Hypertext Transfer Protocol,超文本传输协议
HTTP是一个基于“请求与响应”模式的、无状态的应用层协议
URL——通过HTTP协议存取资源的internet路径,一个URL对应一个数据资源
URL格式—— http://host[:port][path]
方法 | 说明 |
---|---|
requests.request() |
构造一个请求,支撑以下各方法 |
requests.get() |
获取HTML网页的主要方法,对应HTTP的GET |
requests.head() |
获取HTML网页头信息的方法,对应HTTP的GET |
requests.post() |
向HTML网页提交POST请求的方法,对应HTTP的POST |
requests.put() |
向HTML网页提交PUT请求的方法,对应HTTP的PUT |
requests.patch() |
向HTML网页提交局部修改请求,对应HTTP的PATH |
requests.delete() |
向HTML网页提交删除请求,对应HTTP的DELETE |
requests.request(method, url, **kwargs)
method: 请求方式,对于get/put/post/patch/head/delete
url: 拟获取页面的url链接
**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证书路径
Robots Exclusion Standard 网络爬虫排除标准
作用:网站告知网络爬虫有些页面可以抓取,哪些不行
形式:在网站根目录下的robots.txt文件
遵守方式:
>>> import requests
>>> r = requests.get("https://item.jd.com/10037107525048.html")
>>> r.status_code
200
>>> r.encoding
'utf-8'
>>> r.text[:1000]
'\n\n\n \n \n NOC LOC电动升降桌 NOC LOC智能联动电动站立办公电脑桌子 智能办公升降桌 标准款【图片 价格 品牌 报价】-京东 \n \n \n \n \n \n \n \n \n \n import requests
url = "https://item.jd.com/100012014948.html"
try:
kv = {'user-agent':'Mozilla/5.0'}
r = rquests.get(url, headers = kv)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[:1000])
except:
print("爬取失败")
>>> import requests
>>> url = "http://product.dangdang.com/25225942.html"
>>> kv = {'user-agent':'Mozilla/5.0'}
>>> r = requests.get(url, headers = kv)
>>> r.status_code
200
>>> r.request.headers
{'user-agent': 'Mozilla/5.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
>>> r.text[:1000]
' \r\n \r\n \r\n\r\n\r\n\r\n\r\n上网登录页 \r\n\r\n\r\n