当前位置:   article > 正文

python爬虫--requests简介

requests

一:requests的概念

 简单来说,爬虫由获取网页和解析网页获取数据组成,reqiuests模块就是用来获取网页的,当然requests模块时第三方模块,需要下载导入(win+r--->pip install requests),另外  使用urlib也是一种获取网页的方式,不过使用urlib的效率比requests效率和兼容较低,故我们重点了解掌握requests模块即可!

二:requests基本使用(常用方法)

例1:获取百度首页

  1. # 导入 requests 包
  2. import requests
  3. # 发送请求
  4. x = requests.get('https://www.baidu.com')
  5. # 返回网页内容
  6. print(x.text)

例2:破解百度翻译(控制台输入要翻译的单词,导出json文件的解释在文件目录中)

  1. import requests
  2. import json
  3. # 1.指定url
  4. post_url="https://fanyi.baidu.com/sug"
  5. # 2.进行UA伪装
  6. headers={
  7. "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36"
  8. }
  9. kw=input("请输入你要翻译的字符:")
  10. # 3.请求参数处理
  11. data={
  12. "kw":kw
  13. }
  14. # 4.请求发送
  15. response=requests.post(url=post_url,data=data,headers=headers)
  16. # 5,获取响应数据
  17. dic_obj=response.json()
  18. # 6.持久化存储
  19. fp=open(kw+".json","w",encoding="utf-8")
  20. json.dump(dic_obj,fp=fp,ensure_ascii=False)
  21. print("over")

如何知道是改用get()还是post(),可以右键检查(F12),抓包工具可以看到require method(需要方法),以及如何知道获取的数据是text文本内容格式还是json格式,也是早抓包查看network--->Headers

1.request()

构造请求,支撑以下的基础方法

2.get()

获取HTML页面的主要方法,对应于http的get(常用)

3.head()

获取HTML页面的头部信息的主要方法,对应于http的head

4.post()

向HTML提交post请求的方法,对应于http的post(常用)

-​​向URLpost一个字典将自动编码为form(表单)​

-​​向URLpost一个字符串自动编码为data​

5.put()

向HTML提交put请求的方法,对应于http的put

6.patch()

向HTML提交局部修改的请求,对应于http的patch

7.delete()

向HTML提交删除请求,对应于http的delete

  8.json()返回结果的 JSON 对象 (结果需要以 JSON 格式编写的,否则会引发错误)

每次调用 requests 请求之后,会返回一个 response 对象,该对象包含了具体的响应信息。

响应信息如下:

status_code

HTTP请求的返回状态码,200表示成功,400表示失败

text

HTTP响应内容的字符串形式,即URL对应的页面内容

encoding

从HTTPheader中猜测的响应内容编码方式

-​​如果header中不存在charset,则认为编码是ISO-8859-1​

apparent_encoding

从内容中分析出的响应内容编码方式(备选编码方式)

-​​从内容中分析出可能的编码形式​

content

HTTP响应内容的二进制形式

现在再来看一个例子:

  1. import requests
  2. #构造一个向服务器请求资源的Response对象
  3. r = requests.get(url="http://www.baidu.com")
  4. print(r.status_code) #打印请求状态码
  5. #200
  6. print(type(r)) #打印请求对象类型
  7. #<class 'requests.models.Response'>
  8. print(r.headers) #打印请求对象的头部信息
  9. #{'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Sat, 27 Jun 2020 09:03:41 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:27:32 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
  10. print(r.text) # 页面源代码(html)
  11. print(r.encoding) #ISO-8859-1
  12. print(r.apparent_encoding) #备用编码utf-8
  13. r.encoding = "utf-8"
  14. print(r.text)

三:请求异常捕获

为了获取网页请求超时或者组织是给出回应而不是报错强制退出,同样使爬虫程序更完善,便引入了异常捕获的方面内容:

爬虫程序的通过用异常捕获代码:

  1. try:
  2. r = requests.get(url,timeout=30)
  3. r.raise_for_status()
  4. r.encoding = r.apparent_encoding
  5. return r.text
  6. except:
  7. return "产生异常!"

作用:r.raise_for_status()函数判断当前请求返回状态码,当返回状态码不为200时,产生异常并能够被except捕获

  1. import requests
  2. # (定义方法)封装函数
  3. def getHTMLText(url):
  4. try:
  5. r = requests.get(url,timeout=30) # 超时30s发出异常
  6. r.raise_for_status()
  7. r.encoding = r.apparent_encoding
  8. return r.text
  9. except:
  10. return "代码错误,产生异常!"
  11. if __name__ =="__main__":
  12. url = "http://www.baidu.com"
  13. print(getHTMLText(url)) #正常显示爬取的页面信息
  14. if __name__ =="__main__":
  15. url = "www.baidu.com" #缺失了
  16. print(getHTMLText(url)) #代码错误,产生异常!

 

 requests常见异常:

requests.ConnectionError

网络连接错误异常,如DNS查询失败、拒绝连接等

requests.HTTPError

HTTP错误异常

requests.URLRequired

URL缺失异常

requests.TooManyRedirects

超过最大重定向次数,产生重定向异常

requests.ConnectTimeout

连接远程服务器超时异常

 

requests.Timeout

请求URL超时,产生超时异常

Robots协议展示

  1. import requests
  2. # (定义方法)封装函数
  3. def getHTMLText(url):
  4. try:
  5. r = requests.get(url,timeout=30)
  6. r.raise_for_status()
  7. r.encoding = r.apparent_encoding
  8. return r.text
  9. except:
  10. return "代码错误,产生异常!"
  11. if __name__ =="__main__":
  12. url = "http://www.baidu.com/robots.txt"
  13. print(getHTMLText(url)) #正常显示爬取的页面信息,显示出robots协议对于不同类型爬虫的限制

 

 接下来展示几个案例来做巩固:

1:搜狗搜索实现(在控制台输入要搜索的信息条即可搜索,并把搜索结果以文件形式进行保存)

  1. import requests
  2. import json
  3. # 1.指定url
  4. post_url="https://fanyi.baidu.com/sug"
  5. # 2.进行UA伪装
  6. headers={
  7. "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36"
  8. }
  9. kw=input("请输入你要翻译的字符:")
  10. # 3.请求参数处理
  11. data={
  12. "kw":kw
  13. }
  14. # 4.请求发送
  15. response=requests.post(url=post_url,data=data,headers=headers)
  16. # 5,获取响应数据
  17. dic_obj=response.json()
  18. # 6.持久化存储
  19. fp=open(kw+".json","w",encoding="utf-8")
  20. json.dump(dic_obj,fp=fp,ensure_ascii=False)
  21. print("over")

2:获取豆瓣top榜信息(电影名称,导演,评分,时间等等)

 

  1. import requests
  2. import json
  3. url="https://movie.douban.com/j/chart/top_list"
  4. param={
  5. "type": "24",
  6. "interval_id":'100:90',
  7. "action":"",
  8. "start": "0",
  9. "limit":"20"
  10. }
  11. headers={
  12. "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36"
  13. }
  14. response=requests.get(url=url,params=param,headers=headers)
  15. list_data=response.json()
  16. fp=open("./douban.json","w",encoding="utf-8")
  17. # json对文件进行操作
  18. # json.dump(json格式化,文件,ensure_ascii=False)
  19. json.dump(list_data,fp=fp,ensure_ascii=False)
  20. print("豆瓣电影爬取完毕!!!")

3: 获取北京肯德基的地理位置:

  1. import requests
  2. import json
  3. url="http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname"
  4. data={
  5. "cname": "北京",
  6. "pid":"",
  7. "pageIndex": "1",
  8. "pageSize": "2"
  9. }
  10. headers={
  11. "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36"
  12. }
  13. response=requests.post(url=url,data=data,headers=headers)
  14. page_text=response.json()
  15. fp=open("./f_kfc.json","w",encoding="utf-8")
  16. json.dump(page_text,fp=fp,ensure_ascii=False)
  17. print("beijing kfc area 查询完毕!!!")

4:获取网上图片保存

  1. import requests
  2. import os
  3. url = "http://image.ngchina.com.cn/2019/0523/20190523103156143.jpg"
  4. root = "F:/图片/" #根目录
  5. path = root + url.split('/')[-1] #以最后一个/后的文字命名
  6. try:
  7. if not os.path.exists(root): #如果不存在根目录文件,则创建根目录文件夹
  8. os.mkdir(root) #该方法只能创建一级目录,如要创建多层,可以遍历循环创建
  9. if not os.path.exists(path):
  10. r = requests.get(url)
  11. with open(path,'wb') as f:
  12. f.write(r.content) #r.content返回的是2进制编码,将其写入
  13. f.close()
  14. print("文件已成功保存!")
  15. else:
  16. print("文件已存在~")
  17. except:
  18. print("爬取失败!!!")

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/463258
推荐阅读
相关标签
  

闽ICP备14008679号