[关闭]
@1kbfree 2018-09-09T20:02:34.000000Z 字数 2290 阅读 1436

Python Requests库

python


HTTP协议(超文本传输协议)

URL是这样组成的:
image_1c8vr2to71q141oc41182dqka8u4o.png-780.9kB
URL是什么:
image_1c8vr3os1m5s1g5kp1f6pm146355.png-585.8kB
比如www.baidu.com就是一个URL~~

Python Requests是什么

python requests库就是一个网络请求包,也就是爬虫~

爬虫有什么用

爬虫的误区

其实爬虫单单只能完成你能做的事情,就好像你无法访问国外的网站,你写的爬虫照样不能访问,爬虫只是单单的帮助你完成你要干的事情,就好像是有一个机器人在无时无刻的帮你操作,直到任务完成

爬虫分类

image_1c8vrmnp6121u124i1l57jpbui6p.png-1473.4kB

爬虫的危害

爬虫的限制

image_1c8vrqvqco091nvl16gu1s7e2oo9.png-1259.8kB

请求方式

image_1c8s7fl38ned12fj1khn1ig21m8u1g.png-281kB


Requests库代码讲解

image_1c8vr1hccd0dg4t1fu7adm1p7m4b.png-573.2kB

简单获取网站的内容

  1. import requests
  2. r = requests.get( #get是请求方式,不明白的看下面
  3. "http://httpbin.org/ip"
  4. )
  5. print(r.text) #r.text就是获取r请求的那个网站的内容看下面截图
  6. '''
  7. 返回结果
  8. {
  9. "origin": "120.239.1.149"
  10. }
  11. '''

image_1c8s6ndo8dm91c9s1pa7pdi17cf9.png-18.3kB

传递URL参数(GET请求)

首先,我们先了解一下,什么是URL参数呢,我们以我们的论坛为例子。

image_1c8sgusakbvm70k15ea1844102r13.png-106.1kB
------华丽的分割线------
image_1c8sgoa7k1i0mgef5vu1l9u1odam.png-102.1kB
我们可以看到2801、2803可能就是文章的ID,这个ID也可以称为参数吧,如果没看懂我们拿百度再来举一个例子(其实论坛是拿来宣传一波的)

百度
image_1c8sh76pngi4e561jcev861mse1t.png-350.8kB

淘宝
image_1c8sh9agn178r1uam64q1sm4dba2a.png-50.5kB

所以我们可以用Requests来写一个百度的搜索引擎,当然淘宝,京东之类也可以,案例待会讲

我们来看看Requests是如何来给百度传参的:

image_1c8si2nar39u1bnd1urp16ka1bn834.png-102kB

然后我们把这个URL放到浏览器来访问以下,看是否有返回有关诚殷网络的内容:
image_1c8si67a8ngn1hi4ac8fnstl3h.png-228.3kB

这是代码各位可以试一试

  1. # 给百度传参
  2. import requests
  3. baidu_url = "https://www.baidu.com/s"
  4. payload = {'wd': '诚殷网络'} #这就是我说所的键(key)和值(values),我们想有一个键是wd的值是诚殷网络,
  5. # 如果在网站上是这样子展示的www.xxx.xxx?wd=诚殷网络
  6. baidu = requests.get(baidu_url,payload,verify=False) #verify=False俺只知道这样子就可以访问HTTPS的网站了
  7. print("url:",baidu.url)

我们来看看Requests是如何来给淘宝传参的:

其实思路都是一样的,只是key值value值不同
在上面淘宝那张截图我们看到了淘宝的搜索key是q,直接上代码:
image_1c8sihljc15cd47q5nv181t1l7m4e.png-75.2kB

我们将URL复制到浏览器中访问一下:
image_1c8sij6gi55g2kpqbf1aks5095l.png-218.5kB

这是POST传参:
image_1c8vr8nm0jc4174amoc1m561mme5i.png-281.5kB

打印出网站的编码(比如UTF-8、GBK):
image_1c8ugg2cq1q3v1prtb0qjms5la9.png-29.5kB
修改网站编码:
image_1c8uglcam14ou176v12ia6b21mh716.png-31.3kB
and
image_1c8vfu2dm11l1se100d1mnu1c2t9.png-82.6kB

image_1c8vh23361nim14ou1rjs1k1f13uem.png-73.1kB

如果 JSON 解码失败, r.json() 就会抛出一个异常。例如,响应内容是 401 (Unauthorized),尝试访问 r.json() 将会抛出 ValueError: No JSON object could be decoded 异常。

需要注意的是,成功调用 r.json() 并**不**意味着响应的成功。有的服务器会在失败的响应中包含一个 JSON 对象(比如 HTTP 500 的错误细节)。这种 JSON 会被解码返回。要检查请求是否成功,请使用 r.raise_for_status() 或者检查 r.status_code 是否和你的期望相同。

用Reuqests下载网络图片

首先我们看一下这是要下载的图片地址:
image_1c8vhth18ls2gnul9n1eggqih13.png-222.6kB
可看到content是来返回这个网站的二进制响应内容的:
image_1c8vi202jos215eb1ukp1sr0nku1g.png-221.8kB
我们将这个图片下传到本地来:
image_1c8viq563dpp19fvopgclpv681t.png-126.5kB
有人会问我,为什么是wb而不只是w,因为这里是二进制数据,我们必须使用wb写才可以,否则会报错的。

代码:

  1. import requests
  2. url = "https://httpbin.org/image/png"
  3. r = requests.get(url)
  4. with open('小猪图片.jpg','wb') as f:
  5. f.write(r.content)

自定义请求的请求头

请求头有什么用,我来演示一下,首先我们不加任何东西去访问一下知乎网:
image_1c8vjb3m211ng455qg5dp81g2q2a.png-47.9kB
我们是无法访问的:
image_1c8vjjetndii1kqbmpba4r1rde2n.png-79.9kB
那我们如何来访问呢?设置请求头(headers),但是我们必须找到请求头才可以伪造,所以我们正常访问知乎,并且用Burp将请求包头全部复制下来:

Requests 异常

image_1c8vqrpg6glv1vuf1nds1t97111f3h.png-399.9kB
image_1c8vqtr6l1dd61t82iq31r1hfhg3u.png-110kB

设置超时:

requests.get("https://www.baidu.com",timeout = 6)就是说如果我们访问百度的话,6秒内没有访问成功,就会报错,所以我们可以这样子:

  1. out_time = 6 #设置超时时间
  2. url = "https://www.xxx.xxx"
  3. try:
  4. requests.get(url,timeout = out_time)
  5. except:
  6. print(url,"访问失败,因为已经超时{out_time}秒了~".format(out_time = out_time))

给将信息写在文件里传输:

image_1c8vrcgei1u15h7a8pvsg7e915v.png-153.8kB

设置代理:

image_1c8vrk34d1ubna4e11d61n3r1igc6c.png-715.1kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注