request库
对于轻量级用户,像我一样只是准备写一个搞笑用的程序,requests是很方便的存在。
安装通过pip就不说了
request的几个主要方法
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
这个基本上和http中报文的几种方法是一致的。
具体可以康康明解http的第三章。小钱钱够的同学可以支持一下正版。
get方法
我们主要使用的是get方法(因为只是爬别人)。
requests.get(url, params=None, **kwargs)中。url(统一资源定位符)指访问的资源的地址,就是你在浏览器上面那个栏栏里面输入的http://www.xxxxxx.com。kwargs用来控制访问的参数,也是用来控制你网络通信中的参数(可以理解为一个信封的上收信人和邮票这些)。
我们使用get方法
url="https://bing.com/"
res=requests.get(url)
我们去爬去的时候,通过url使用get方法,是获得一个request对象去访问网址资源(响应库名)。
而res是得到一个response对象,包含了几个属性
status_code HTTP请求的返回状态,200表示连接成功,404表示失败(详细见明解http第四章)
text HTTP响应内容的字符串形式,即url对应的页面内容
encoding 从HTTP header中猜测的响应内容编码方式
apparent_encoding 从内容中分析出的响应内容编码方式(备选编码方式)
content HTTP响应内容的二进制形式
通常如果我们发现res.txt的显示有些问题,我们会使用apparent_encoding去解码结果。
因为毕竟有可能有失败所以我们需要使用异常处理来打开。
url="https://bing.com/"
try:
res=requests.get(url)
res.raise_for_status()
res.encoding=res.apparent_encoding
print(res.text[:1000])
except:
print("spider failed")
几个小实例
基本的爬取
更改agent的方式
有些网站并不想让你爬所以会限制爬虫(因为你太老实了,危),像这样
就返回503了。
这个时候我们就可以动一下小手脚,我们把user-agent这个自报家门的东西换点(默认的参数自报是python爬虫),我们改成一个浏览器的名字‘Mozilla/5.0’,骗一骗它。
这样我们就绕开了这个小反爬。(仅供娱乐玩家使用,偶尔这么搞一搞)
访问资源的子部分
比如我们像用搜索引擎查一查某个东西。哪怎么搞呢?
我们去必应搜索了一波‘抗疫感想’,发现它长这个样子
那ok了,我们只需要把这串url里面的q=后面的换成我们想要的查就好。
还记得**args这个参数吗? 我们往里面加点料,开一个字典search={'q': 'xxx'},到时候它request的时候便会帮我们把参数p=xxx搞到url上去。
关于什么能爬什么不能爬
一般很多网站会把什么能爬什么不能爬写出来。搞一个robots协议公开给大家看。
我们只要在一个网站url后面加一个/robots.txt就能查看。User-agent: msnbot-media
Disallow: /
Allow: /th?
User-agent: Twitterbot
Disallow:
User-agent: *
Disallow: /account/
Disallow: /amp/
Allow: /api/maps/
取了一小部分,这里可以看到bing的/api/maps/是对所有爬虫都开放的(allow了),而对/account/这一部分是不允许别人爬的。而对于Twitterbot,不让爬。