1、requests库相比于urllib的优点

  • requets底层实现是urllib
  • requests在Python2和Python3中通用
  • requests简单易用
  • requests可以自动解压(gzip压缩的)网页内容

2、requests作用

模拟客户端发送请求,返回响应数据;

3、res.encoding

requests会从服务器返回的响应头中的Content-Type 去获取字符集编码,如果Content-Type中有charset字段,那么requests就可以正确使用编码来解码,否则就使用默认的encoding=”ISO-8859-1”来解码(因为requests库是欧洲人写的),由于百度首页是通过utf-8格式来编码的,而编码与解码不一致,导致出现乱码。
encoding的注释:Encoding to decode with when accessing r.text:当访问r.text时,使用encoding的值来解码;

  1. import requests
  2. res = requests.get("https://www.baidu.com")
  3. # 获取字符集编码
  4. print(res.encoding)
  5. res.encoding = "utf-8"
  6. print(res.headers["Content-Type"])
  7. # 获取响应头
  8. print(res.headers)
  9. print(res.text)

4、常用属性

  • res.headers:获取响应头;
  • res.request.headers:获取请求头;
  • res.request.url:获取请求的url地址;
  • res.encoding:使用encoding来解码;
  • res.status_code:获取响应状态码;
  • res.text:获取响应文本内容,返回的是str;
  • res.content:获取响应字节内容(包括图片、音频、视频等等),返回的是byte;
  • res.json():获取相应的json内容,返回的是字典,其中的json.loads()自动将json转成了字典;

5、下载图片

  1. import requests
  2. res = requests.get("https://www.baidu.com/img/bd_logo1.png?where=super")
  3. with open("img/baidulogo.png", "wb") as f:
  4. f.write(res.content)

6、发送带headers的请求

模拟浏览器,欺骗服务器,获取和浏览器一致的内容;
headers的形式是字典,将请求头中的那些参数写入字典中;

  1. header的形式:字典
  2. headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}
  3. 用法:requests.get(url, headers=headers)

7、发送带参数的get请求;

参数:get请求中的参数常常是以 的形式开始,每组参数以键值对的形式体现,不同组之间用&连接;
参数的形式:字典
params = {‘wd’:’居然’}
用法:requests.get(url, params=params)
注意:
(1)?会自动加上,原url中可以不用写?
(2)使用params参数的好处是,当其中含有中文等非ASCII集合中的字符时,会自动帮我们进行url编码;否则需要手动编码然后传入;

但也不一定要使用params,有时直接写在url中会更方便一些;

  1. import requests
  2. url = "https://www.cn.bing.com/search"
  3. # url = "https://www.cn.bing.com/search?q=Python"
  4. headers = {
  5. "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
  6. }
  7. params = {
  8. "q": "Python"
  9. }
  10. res = requests.get(url, headers=headers, params=params)
  11. print(res.request.url)

7.1 url编码

按照标准,URL只允许一部分ASCII字符,其他字符(如汉字)是不符合标准的,此时就要进行编码
因为我在构造URL的过程中要使用到中文,所以需要对其进行编码;

  • 使用requests中的utils.quote方法和utils.unquoter方法
  • 使用urllib中的parse模块的quote方法和unquote方法 ```python from urllib import parse

name = “贴吧” print(parse.quote(name)) # %E8%B4%B4%E5%90%A7 print(parse.unquote(“%E8%B4%B4%E5%90%A7”)) # 贴吧

  1. <br />
  2. <a name="DPqBV"></a>
  3. ### 8、贴吧练习
  4. 注意:保存文件时:文件名中不可以含的特殊符号 '*', '|', ':', '?', '/', '<', '>', '"', '\\'<br />可以使用正则中的替换,re.sub(r"[], "", count=0)
  5. ```python
  6. import requests
  7. from urllib import parse
  8. class TiebaSpider(object):
  9. def __init__(self, tieba_name):
  10. self.tieba_name = tieba_name
  11. self.headers = {
  12. "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
  13. }
  14. self.url = "https://tieba.baidu.com/f?kw={}&ie=utf-8&pn={}"
  15. def get_url_list(self):
  16. url_list = []
  17. for i in range(10):
  18. url_list.append(self.url.format(self.tieba_name, i*50))
  19. return url_list
  20. def tieba_parsed(self, tieba_url):
  21. res = requests.get(tieba_url, headers=self.headers)
  22. print(res.status_code)
  23. return res
  24. def save_html(self, page, res):
  25. # 文件名中不可以含的特殊符号 '*', '|', ':', '?', '/', '<', '>', '"', '\\'
  26. filename = "贴吧/贴吧 {}-第{}页.html".format(parse.unquote(self.tieba_name), page)
  27. with open(filename, "wb") as f:
  28. f.write(res.content)
  29. def run(self):
  30. """实现主要业务逻辑"""
  31. # 1、构造url列表
  32. url_list = self.get_url_list()
  33. # 2、遍历发送请求,获取响应
  34. for tieba_url in url_list:
  35. res = self.tieba_parsed(tieba_url)
  36. page = url_list.index(tieba_url) + 1
  37. # 3、保存HTML页面
  38. self.save_html(page, res)
  39. if __name__ == '__main__':
  40. tieba_name = parse.quote("植物大战僵尸2")
  41. tieba_spider = TiebaSpider(tieba_name)
  42. tieba_spider.run()