Python网络爬虫与信息提取(1)—— 基于pycharm的requests库学习

前言

一直有这个想法,看到csdn上有人说想学就快速入手,所以尝试的学习学习,记录下。

学习目标

掌握定向网络数据的爬取和网页解析的基本能力

总体内容

  • Requests:自动爬取HTML页面,自动网络请求提交
  • robots.txt:网络爬虫排除标准
  • Beautiful Soup:解析HTML页面
  • Projects:实战项目
  • Re:正则表达式提取关键信息
  • Scrapy:专业网络爬虫的框架
解析
提取
Requests获取网页信息
Beautiful Soup解析HTML页面
使用正则表达式提取关键信息

Requests库的安装

1、在pycharm中ctrl + alt + s打开setting
2、打开Projects中的第一项如图:
在这里插入图片描述
3、点击右边一栏的 + 号搜索requests如图:
在这里插入图片描述
4、点击底下的Install Package安装即可。
5、新建pyfile,输入代码测试

import requests as req
r = req.get("http://www.baidu.com")
print(r.status_code)
r.encoding = 'utf-8'
print(r.text)

在这里插入图片描述
看到状态码为200,网页内容已经抓取下来了。

requests库的主要方法

在这里插入图片描述

get方法

在这里插入图片描述

  • 构造一个向服务器请求资源的Requests对象
  • 返回一个包含服务器资源的Response对象

Response对象

这个对象包含了网页的全部信息,常用的属性如下图:
在这里插入图片描述

访问流程

  1. get方法回去Response对象
  2. 检测Response对象的状态码是否是200
  3. 是200则可以操作r.text,r.encoding等
  4. 不是200则根据出错原因产生异常

使用例子

 import requests as req
r = req.get("http://www.baidu.com")
print(r.status_code)
print(r.encoding)
print(r.text)
r.encoding = 'utf-8'
print(r.text)

输出:
在这里插入图片描述
说明:
在未修改encoding的时候输出的text文本是存在乱码的如图:
在这里插入图片描述
r.encoding:如果header中不存在charset,则认为编码为ISO-8859-1,他是不支持中文的,修改成‘utf-8’则可以显示中文。
r.apparent_encoding:从http的响应网页内容中分析它应该是什么编码格式,备选编码参数是更可靠的。所以可以直接用备选编码复制给encoding即可。

import requests as req
r = req.get("http://www.baidu.com")
print(r.status_code)
r.encoding = r.apparent_encoding
print(r.text)

requests库的异常

在这里插入图片描述
在这里插入图片描述

通用异常处理框架

import requests as req


def getHTMLText(url):
    try:
        r = req.get(url, timeout=30)
        r.raise_for_status() # 捕获状态码是否是200不是则抛出异常
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "产生异常"
    

if __name__ == "__main__":
    url = 'http://www.baidu.com'
    print(getHTMLText(url))

这里可以断网测试下:就会输出产生异常

http协议

HTTP:Hypertext Transfer Protocol,超文本传输协议,是一种基于“请求与相应”模式的、无状态的应用层协议。
在这里插入图片描述
在这里插入图片描述

requests库与之对应的方法使用

import requests as req
url = 'http://httpbin.org/post'

r = req.head(url)
print("头部信息" + str(r.headers))
print("文本内容" + str(r.text))

paylooad = {'key1':'value1','key2':'value2'}
r = req.post(url,data = paylooad)
print("测试post" + str(r.text))

r = req.post(url,data = 'ABC')
print("测试post" + str(r.text))

r = req.put(url,data = paylooad)
print("测试put" + str(r.text))

输出:

头部信息{'Allow': 'OPTIONS, POST', 'Access-Control-Allow-Credentials': 'true', 'Content-Length': '178', 'Content-Type': 'text/html', 'Server': 'gunicorn/19.9.0', 'Connection': 'keep-alive', 'Access-Control-Allow-Origin': '*', 'Date': 'Thu, 16 Apr 2020 06:17:00 GMT'}
文本内容
测试post{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "key1": "value1", 
    "key2": "value2"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "23", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.23.0", 
    "X-Amzn-Trace-Id": "Root=1-5e97f85d-a25589248bed0d9cae98419c"
  }, 
  "json": null, 
  "origin": "117.162.175.151", 
  "url": "http://httpbin.org/post"
}

测试post{
  "args": {}, 
  "data": "ABC", 
  "files": {}, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "3", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.23.0", 
    "X-Amzn-Trace-Id": "Root=1-5e97f85f-50fde59a01623de670cebb50"
  }, 
  "json": null, 
  "origin": "117.162.175.151", 
  "url": "http://httpbin.org/post"
}

测试put<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>405 Method Not Allowed</title>
<h1>Method Not Allowed</h1>
<p>The method is not allowed for the requested URL.</p>
发布了81 篇原创文章 · 获赞 21 · 访问量 8795

猜你喜欢

转载自blog.csdn.net/qq_37668436/article/details/105553639
今日推荐