在cmd中输入以下命令安装:
pip install requests
最简单的一个获取网页的方法:
r = requests.get(url, params=None, **kwargs)
其中r是requests.get(url) 返回的包含爬虫返回的全部内容的 Response(区分大小写)对象,get()方法构造了一个向服务器请求资源的Request对象。
get()方法中的参数url为网页链接,params是url的额外参数,字典或字节流格式,**kwargs为其它12个可选参数
Response对象的属性:
使用get()方法获取网上资源时的基本流程:先用r.status_code检测状态,若为200,则可用其他方法获取信息,否则说明本次访问出现错误或异常。
获取百度首页的示例:
>>> import requests
>>> r = requests.get("http://www.baidu.com")
>>> r.text
'\r\n ç\x99¾åº¦ä¸\x80ä¸\x8bï¼\x8cä½\xa0å°±ç\x9f¥é\x81\x93 å\x85³äº\x8eç\x99¾åº¦ About Baidu
©2017 Baidu 使ç\x94¨ç\x99¾åº¦å\x89\x8då¿\x85读 æ\x84\x8fè§\x81å\x8f\x8dé¦\x88 京ICPè¯\x81030173å\x8f·
\r\n'
>>> r.encoding #发现有乱码,查询其编码方式
'ISO-8859-1'
>>> r.apparent_encoding
'utf-8'
>>> r.encoding = "utf-8" #更换编码方式
>>> r.text #乱码消失
'\r\n 百度一下,你就知道 \r\n'
r.encoding属性是从网页的header中的charset字段获取的,若不存在charset字段,则编码默认为ISO-8859-1(该编码不能解析中文)。
r.apparent_encoding是从内容部分分析可能出现的编码方式。
由于get()方法不一定能成功,因此爬取网页过程中的异常处理比较重要。
Requests库的异常:
ConnectTimeout指连接服务器出现的超时,而Timeout是指从连接到接收整个过程的超时。
通用代码框架:
import requests
def getGTMLText(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是一个基于“请求与相应”模式的、无状态的应用层协议。无状态指不同的连接不相关联,应用层协议指该协议工作在TCP协议之上。
采用URL作为定位网络资源的标识,
URL格式:http://host[:port][path]
requests.request(method, url, **kwargs)
**kwargs为其他的13个可选参数,其中method为请求方式,有以下七种(功能和get()等方法一致):
OPTIONS一般用于获取服务器和客服端打交道的一些参数,较少使用。
13个可选参数:
------------params参数
>>> kv = {"key1":"value1", "key2":"value2"}
>>> r = requests.request("GET", "http://python123.io/ws", params=kv)
>>> r.url
'https://python123.io/ws?key1=value1&key2=value2'
>>> print(r.url)
https://python123.io/ws?key1=value1&key2=value2
------------data参数
>>> kv = {"key1":"value1", "key2":"value2"}
>>> r = requests.request("POST", "http://python123.io/ws", data=kv)
>>> body = "主题内容"
>>> r = requests.request("POST", "http://python123.io/ws", data=body.encode('utf-8'))
------------json参数
>>> kv = {"key1":"value1"}
>>> r = requests.request("POST", "http://python123.io/ws", json=kv)
------------headers参数
>>> hd = {'user-agent':'Chrome/10'}
>>> r = requests.request("POST", "http://python123.io/ws", headers=hd)
#修改user-agent字段,模拟10代Chrome进行访问
------------files参数
>>> fs = {file:open('data.xls', 'rb')}
>>> r = requests.request('POST', 'http://python123.io/ws', files=fs)
------------proxies参数
>>> pxs = {'http':'http://user:[email protected]:1234','https':'https://10.10.10.1:4321'}
>>> r = request.request('GET', 'http://www.baidu.com', proxies=pxs)
#访问时使用的是pxs中的代理地址,可以隐藏爬取过程中源的地址,防止对爬虫逆追踪
由于安全问题,大部分的服务器不支持资源的上传,在爬虫的使用中,一般只会用到get()方法和head()方法(针对很大的url链接)
网络爬虫带来的骚扰:一般Web服务器为人类的访问提供服务,网络爬虫相当于机器访问服务器,受限于爬虫编写者的能力和目的,网络爬虫有时会给服务器带来巨大的负担。
网络爬虫的法律风险:服务器上的数据有产权归属,网络爬虫获取数据后牟利会带来法律风险。
网络爬虫对隐私的泄露:网络爬虫具有突破简单访问控制的能力,获得被保护数据从而泄露个人隐私。
Robots协议:网络爬虫排除标准,一般在网站根目录下的robots.txt文件
https://www.jd.com/robots.txt,以下是京东的协议(被我标注过):
# 注释,*代表所有,/代表根目录
User-agent: * #对所有的爬虫
Disallow: /?* #不允许访问以?开头的路径
Disallow: /pop/*.html
Disallow: /pinpai/*.html?*
User-agent: EtaoSpider #对于EtaoSpider
Disallow: / #不允许爬取任何资源,这两句指该爬虫被认为是恶意爬虫
User-agent: HuihuiSpider
Disallow: /
User-agent: GwdangSpider
Disallow: /
User-agent: WochachaSpider
Disallow: /
原则上,类人行为(访问频率低,如一小时一次,每次访问内容不大)可以不遵守该协议。
百度:
http://www.baidu.com/s?wd=keyword
360:
http://www.so.com/s?q=keyword
替换keyword即可提交关键字
查看请求给百度url的方法:r.request.url
>>> import requests
>>> kv = {'wd':'Python'}
>>> hd = {'user-agent':'Chrome/10'} #不设置代理会被百度导入验证界面
>>> r = requests.get('http://www.baidu.com/s', headers=hd, params=kv)
>>> len(r.text)
558604
>>> r.request.url #查看请求给百度的url
'http://www.baidu.com/s?wd=Python'
>>> r.encoding
'utf-8'
>>> r.text[:1000]
'\n\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\n\n\n\n\t\n\t\t\n\t\t\n\t\t\n\t\t\n \n \n \n \n\t\t\n\t\t\nPython_百度搜索 \n\n\t\t\n\n\t\t\n