爬虫之requests的请求与响应

requests是基于urllib3的一个用于发起http请求的库(中文文档
数据采集流程: 
  1. 指定url>>
  2. 基于
  3. requests模块发起请求>>
  4. 获取响应中的数据>>
  5. 数据解析>>
  6. 进行持久化存储

 

1.模块安装
pip install requests

2.requests之request请求  

  2.1请求方式

  常用的就是requests.get()和requests.post()
1 #各种请求方式:常用的就是requests.get()和requests.post()
2 import requests
3 requests.get('https://api.github.com/events')
4 requests.post('http://httpbin.org/post', data = {'key':'value'})
5 requests.put('http://httpbin.org/put', data = {'key':'value'})
6 requests.delete('http://httpbin.org/delete')
7 requests.head('http://httpbin.org/get')
8 requests.options('http://httpbin.org/get')

  2.2请求url

  在数据采集之前,要通过页面的加载方式(静态加载还是动态加载)确定需要获取资源的url(可以参考爬虫简介实例)

  2.3请求头

  如果你想为请求添加 HTTP 头部,只要简单地传递一个 dict 给 headers 参数就可以了。

  有些网站为了拒绝通过程序代码的请求,会在接收请求时会对发起请求的载体进行校验,请求头中的‘User-Agent’参数就是请求载体的唯一标识,因此一般需要定制请求头加入载体标识,这也是其中一种反反爬策略:UA伪造。

  方式一:唯一指定请求载体身份

1 import requests
2 headers={
3     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
4 }
5 response=requests.get('http://www.baidu.com',headers=headers)
6 print(response.encoding)#百度编码格式为ISO-8859-1
7 response.encoding='utf-8'
8 print(response.text)
唯一指定请求载体
  方式二:通过fake-useragent随机生成
 1 import requests
 2 
 3 from fake_useragent import UserAgent#pip install fake-useragent模块
 4 UA=UserAgent()#实例化创建请求载体对象
 5 headers={
 6     'User-Agent':UA.random#随机获取一个请求载体
 7 }
 8 # print(headers)
 9 
10 response=requests.get('http://www.baidu.com',headers=headers)
11 print(response.encoding)#百度编码格式为ISO-8859-1
12 response.encoding='utf-8'
13 print(response.text)
fake-useragent随机生成请求载体

  2.3请求参数

    2.3.1 get请求参数----params

  get请求通过URL的查询字符串(querystring)传递某种数据。如果你是手工构建URL,那么数据会以键值对的形式置于URL中,跟在一个问号的后面。例如, https://movie.douban.com/typerank?type_name=%E5%8A%A8%E4%BD%9C&type=5&interval_id=100:90&action=&qq-pf-to=pcqq.c2c(豆瓣动作片评分)。 Requests允许你使用params关键字参数,以一个字符串字典来提供这些参数。

 1 import requests
 2 from fake_useragent import UserAgent
 3 UA=UserAgent()
 4 headers={'User-Agent':UA.random}
 5 
 6 START=0
 7 END=2000#如果循环爬取,起始位置数据计数会有大量重复,因此设置起始值爬取
 8 f=open('豆瓣动作片评分.txt','w',encoding='utf-8')
 9 
10 url=f'https://movie.douban.com/j/chart/top_list'
11 params={
12     'type':'5',
13     'interval_id':'100:90',
14     'action':'',
15     'start':START,
16     'limit':END,
17 }
18 response = requests.get(url=url, params=params, headers=headers)
19 data=response.json()
20 
21 for movie in data:
22     f.write(f'{movie["rank"]}\t{movie["title"]}\t{movie["score"]}\n')
23 
24 f.close()
get请求参数params

    2.3.2 post请求参数----data

  你想要发送一些编码为表单形式的数据——非常像一个 HTML 表单。要实现这个,只需简单地传递一个字典给 data 参数。你的数据字典在发出请求时会自动编码为表单形式。

 1 '''
 2 肯德基城市位置查询# http://www.kfc.com.cn/kfccda/storelist/index.aspx
 3 '''
 4 import requests
 5 from fake_useragent import UserAgent#伪造UA(pip install fake-useragent)
 6 useragent=UserAgent()
 7 
 8 headers={
 9     'UserAgent':useragent.random#随机生成UA
10 }
11 url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
12 city=input('请输入查询城市>>>')
13 data={
14     'cname':'',
15     'pid':'',
16     'keyword':city,
17     'pageIndex':'1',
18     'pageSize':'100',
19 }
20 
21 response=requests.post(url,data=data,headers=headers)
22 for i in response.json()['Table1']:
23     print(i['addressDetail'])
post请求参数data

  2.4超时设置----timeout

  requests 在经过以 timeout 参数设定的秒数时间之后停止等待响应。基本上所有的生产代码都应该使用这一参数。如果不使用,你的程序可能会永远失去响应。

1 >>> requests.get('http://github.com', timeout=0.001)
2 Traceback (most recent call last):
3   File "<stdin>", line 1, in <module>
4 requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)
5 
6 注意
7 timeout 仅对连接过程有效,与响应体的下载无关。 timeout 并不是整个下载响应的时间限制,而是如果服务器在 timeout 秒内没有应答,将会引发一个异常(更精确地说,是在 timeout 秒内没有从基础套接字上接收到任何字节的数据时)If no timeout is specified explicitly, requests do not time out.
超时timeout
3.requestsresponse响应

  任何时候进行了类似 requests.get() 的调用,都在做两件主要的事情。其一,你在构建一个 Request 对象, 该对象将被发送到某个服务器请求或查询一些资源。其二,一旦 requests 得到一个从服务器返回的响应就会产生一个 Response 对象。该响应对象包含服务器返回的所有信息,也包含你原来创建的 Request 对象。

 1  import requests
 2  
 3  response = requests.get('http://www.baidu.com')
 4  print(response.status_code)  # 打印状态码
 5  print(response.url)          # 打印请求url
 6  print(response.headers)      # 打印头信息
 7  print(response.cookies)      # 打印cookie信息
 8  #response.encoding='utf-8'/'gbk'#解决编码问题,或者对需要提取的内容进行部分编解码操作(数据解析会讲)
 9  print(response.text)  #以文本形式打印网页源码---文本内容
10  print(response.content) #以字节流形式打印-----图片/音频/视频
11  print(response.json()) #以json形式打印----数据接口API
12  print(response.encoding) #输出页面内容编码格式(如ISO-8859-1)可以指定编码确保输出不乱码

 

 

posted @ 2019-08-05 16:45  笑得好美  阅读(641)  评论(0编辑  收藏  举报