发送简单的请求

response = requests.get(“url”)

response常用方法
  • response.text
  • response.content
  • response.status_code
    (获取状态码,如果返回200,说明请求的某个URL成功,并不能说明当前URL请求成功)
    (用assert response.status_code == 200,断言请求成功)
  • response.headers
    响应头,一般不用,如果用只需要看Network-Headers里的Set-Cookie键值对,共有3个,是对方服务器在我们本地设置的cookie,Django Flask可以通过js设置cookie到本地
  • response.request.headers
    请求头,-----(此处是request,不是requests)----在ipython3交互界面以访问百度首页为例时,response.requests.headers返回的结果是一个字典,其中’User-Agent’: ‘python-requests/2.9.1’,跟正常浏览器请求的’User-Agent’(浏览器名称)不一样,会很容易被识别出是一个爬虫。
  • response.request.url
    请求的URL
  • response.url
    响应的URL
    当对方服务器把请求的URL地址重定向到另外一个URL地址时,请求的和相应的URL就不一样了
发送带header的请求

response = requests.get(“http://www.baidu.com”)
response.content.decode()
返回的内容比正常浏览器访问服务器返回的内容少,因为通过response.request.headers返回的结果可以查看到,我们的程序访问时用的请求头中的’User-Agent’:
'python-requests/2.9.1’是一个程序,被识别出是爬虫,所以接下来要学习如何发送带headers的请求,而不被对方服务器通过User-Agent识别出来。

目的

模拟浏览器,欺骗服务器,获取和浏览器一样的内容。

header形式:字典
  • headers = {“User-Agent”: “Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1”}
用法
  • requests.get(url,headers=headers)
  • 需要把headers传进去,而不是直接写进去。
  • 具体示范步骤
    进入ipython3交互模式
import requests
 headers={"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"} 
 response=requests.get("http://www.baidu.com",headers=headers)
 response.content.decode()

会得到与浏览器访问服务器一样的返回结果。

发送带参数的请求
什么是请求参数

实际情况中,不可能带这么多参数,只带重要的参数就行wd=…

参数的形式:字典
  • kw = {“wd”:“长城”}
用法
  • requests.get(url,params=kw)
  • 具体操作步骤示范

注意事项:

  • URL编码后如果看不懂,可以通过在线的URL解码工具
  • 遇到URL中有%的先进行解码再观察
  • url_temp中的?可有可无
1 import requests
  2 
  3 
  4 url_temp = "http://baidu.com"
  5 headers = {"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1    .38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"}
  6 p = {"wd":"教程"}
  7 r = requests.get(url_temp,headers=headers,params=p)
  8 print(r.status_code)
  9 print(r.request.url)

如果发现了URL的规律,不传递参数,可以手动拼接URL地址,代码如下:

字符串格式化的另一种方式(之前是%s)
  • 用字符串的format方法来直接传递参数
  • 例如:要在传智播客中传和智中间放一个内容进去,可以先用大括号占一个位置,然后用.format(“内容”)
  • 传{}智播客.format(1)或者传{}智播客.format(“a”),内容可以为字典、元组、列表都可以
  • 如果要在传智播客每个字中间都加内容,可以分别在每个字中间用一个大括号站位,然后后面依次放要填的内容,会自动按顺序放进去
    传{}智{}播{}客.format(1,2,3),返回的结果就是:传1智2播3客
1 import requests
  2 
  3 
  5 headers = {"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1    .38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"}
  6 url = "http://www.baidu.com/s?wd={}".format("传智播客")
  7 r = requests.get(url,headers=headers)
  8 print(r.status_code)
  9 print(r.request.url)