乐趣区

关于python:Python-爬虫出发前的装备之简单实用的-Requests-模块

1. 概念

爬虫不是动物,而是一种计算机程序。

这种程序有本人特定的性能,能依照使用者给定的一系列规定自行浏览万维网并获取须要的信息。此类程序被称为 网络爬虫(web crawler)网络蜘蛛(spider)
它具备智能剖析能力,也称为 机器人程序

爬虫的利用应用领域:

如百度、谷歌等以搜寻为主的公司,就是利用其自行研发的爬虫程序在互联网上对网页中的数据进行爬取、剖析、归类、存储……再提供给用户应用。
新闻聚合利用也是利用爬虫程序爬取各新闻网站上的新闻信息,进行分检归类后提供给使用者。

爬虫程序可使用于各种须要数据分析的应用领域。如价格剖析,依据商品关键字爬取各商城中商品价格,对价格进行比拟、剖析后展现给用户一个直观的比照表。

爬虫程序从网络上爬取数据时,须要恪守 Rebots 协定。

Rebots 协定是网站拟定的资源共享清单,规定爬虫在本网站爬取数据时,哪些资源能够爬取,哪些资源不能够爬取。

爬虫程序的工作流程:

  1. 确定 指标网页 。此页为 起始页 或叫 入口页面
  2. 获取页面的数据,通过某种形式(如正则表达式)获取页面中的相干信息。并可提取页面中链接,以递归形式持续对页面数据进行剖析,提取。
  3. 将信息长久化存储,可备后续的解决。

2. Python 爬虫模块

爬虫程序的外围逻辑之一便是通过网络申请模式,下载指定页面的数据。

爬虫程序 的实质就是一个 网络应用程序

Python 提供了丰盛的库或模块可帮助开发者疾速开发此类网络应用程序。

2.1 urllib 库

urllib 库是 python 内置库,不须要另外装置。残缺的 urllib 库包含如下 5 大模块:

  • urllib.request:可应用不同的协定发送申请包并获取申请之后的响应后果。
  • urllib.response:用来解析响应包数据。
  • urllib.error: 蕴含了 urllib.request 产生的异样。
  • urllib.parse: 用来解析和解决 URL。
  • urllib.robotparse: 用来解析页面的 robots.txt 文件。

应用 urllib.request 模块发送网络申请:

import urllib.request
# 基于 https 协定的 url 地址
url = "https://www.cnblogs.com/guo-ke/p/15951196.html"
# 构建一个申请对象
req = urllib.request.Request(url)
# 应用 urlopen 办法发送申请包
with urllib.request.urlopen(req) as resp:
    # 解析数据
    data = resp.read()
    print(data.decode())
  1. urllib.request.Request() 类阐明:构建申请包。

类原型申明:

class Request:
   def __init__(self, url, data=None, headers={},origin_req_host=None, unverifiable=False,method=None):
           #…… 其它代码块

构造方法参数阐明

  • url: 要申请的 url 地址。
  • data: data 必须是 bytes(字节流)类型,如果是字典,能够用 urllib.parse 模块里的 urlencode() 编码
  • headers: headers 是一个字典类型,用来形容申请头信息。

    可在构造方法中指定,也能够通过调用 add_header() 办法增加

    默认 User-AgentPython-urllib

  • origin_req_host: 指定申请方的 host 名称或者 ip 地址。
  • unverifiable:设置网页是否须要验证,默认是 False。
  • method: 用来指定申请应用的办法,如 GET、POST 或 PUT 等。

很多网站具备反爬虫设置,除了浏览器之外的拜访均认定为非法申请。所以爬虫程序须要把本人伪装成浏览器。

from urllib import request, parse

url = 'http://www.guo-ke.com/post' 
headers = {
    # 伪装成谷歌浏览器
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36',
    'Host': 'guo-ke.org'
}
dict = {
    'name': 'guoke',
    'key':'python'
}
# 数据必须是字节流
data = bytes(parse.urlencode(dict), encoding='utf8')
'''
# 转换成 URL 格局的字符串
data = parse.urlencode(dict)
# 编码成字节流数据
data = data.encode()
'''request = request.Request(url=url, data=data, headers=headers, method='POST')
# req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36')
with  request.urlopen(req) as response:
    res=(response.read()
    print(res.decode('utf-8'))

Tip: 当应用了 data 参数或指定 method=”POST” 则为 POST 申请。

GET 申请也能附加申请参数:https://www.baidu.com/s?wd=java

  1. urllib.request.urlopen() 办法阐明:发送网络申请。
def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
            *, cafile=None, capath=None, cadefault=False, context=None):

参数阐明:

  • url: 能够接管一个 URL 字符串 或一个 urllib.request.Request 对象
  • data: POST 申请时的数据,GET 申请设置为 None。
  • timeout: 设置网站的拜访超时工夫。仅仅用于应用 HTTP、HTTPS、FTP 协定申请连贯时。
  • cafile、capath: 当应用 HTTPS 申请时,用来指定 CA 数字证书。

    cafile 指定数字证书文件。

    capath 指定蕴含的数字认证文件的目录。

返回类型阐明: 无论应用何种协定发送申请后返回的对象都会包含 3 个通用办法。

  • geturl() 返回申请的资源 URL。
  • info() 返回元数据信息,如音讯头。
  • getcode() 返回响应的状态码. 如果有谬误则会抛出 URLError 异样。

当应用 httphttps 协定申请后返回的是一个 http.client.HTTPResponse 对象,此对象除了下面的 3 个办法,还包含:

  • read(): 获取响应返回的 bytes 类型数据,只能应用一次,输入时须要应用 decode() 解码。
  • getheaders(): 获取返回的响应头信息。

应用 urllib.request 下载一张图片:

爬虫程序弱小之处在于能批量、递归下载用户所须要的数据,一个弱小的逻辑背地的思维可能就是一个简略的原理撑持的。咱们能够先试着下载一张图片以小窥大。

import urllib.request

# 图片 URL
url = "https://img2022.cnblogs.com/blog/2749732/202202/2749732-20220222195931956-448995015.jpg"
with urllib.request.urlopen(url) as resp:
    data = resp.read()
    with open("d:/my_file.jpg", "wb") as f:
        f.write(data)

关上对应盘符,能够查阅到图片曾经下载胜利。

urllib.request 还提供有一个更不便的 urlretrieve() 办法。可间接以文件形式存储下载下来的字节流数据。

from urllib import request
url = "https://img2022.cnblogs.com/blog/2749732/202202/2749732-20220222195931956-448995015.jpg"
# urlretrieve() 办法传入的第二个参数为文件保留的地位,以及文件名。request.urlretrieve(url, 'd:/temp.jpg')

2.2. requests 库

requests 是基于 urllib 编写的第三方库,应用时,须要下载安装:

pip3 install requests

次要提供了 2 个办法:

1. get() 办法用来发送 GET 申请。

def get(url, params=None, **kwargs):
    #……

参数阐明:

  • url:须要申请的 url 资源(字符串类型)。
  • params:查问数据,能够是字典、列表、元组、字节类型。
  • kwargs:以键值对形容的申请音讯头参数。

根本 GET 应用:

import requests

# 用 get 形式发送申请并取得响应
response = requests.get('https://www.cnblogs.com/guo-ke/p/15925214.html')
# 用 text 查看响应内容
print(response.text)

带参数 get 申请

import requests

response = requests.get('https://www.baidu.com/s?wd=java')
# 将参数拼接到 url 前面,用问号分隔,参数间用 & 来分隔
print(response.text)

字典格局的参数

import requests

data = {'wd': 'java'}
response = requests.get('https://www.baidu.com/s', params=data)
# 用字典的模式传递给 params 参数,不须要本人写 url 编码
print(response.text)

GET 办法返回一个 Responese 对象,此对象提供有相应属性或办法解析响应包中的数据。

  • response.encoding:获取以后的编码。
  • response.encoding = ‘utf-8’:设置编码。
  • response.text:主动依据响应头部的字符编码进行解码。
  • response.content:以字节模式(二进制)返回。
  • response.headers:以字典对象存储服务器响应头,字典键不辨别大小写,若键不存在则返回 None。
  • response.status_code:响应状态码。
  • response.raw:返回原始响应体,也就是 urllib 的 response 对象,应用 response.raw.read()
  • response.json():Requests 中内置的 JSON 解码器,以 json 模式返回, 前提返回的内容确保是 json 格局的,不然解析出错会抛异样。

下载一张图片

import requests
#;图片地址
url = "https://img2022.cnblogs.com/blog/2749732/202202/2749732-20220222195931956-448995015.jpg"
#申请头元数据
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'
}
response = requests.get(url, headers=headers)
# 获取字节流数据
data = response.content
#保留字节流数据
with open("d:/test.jpg", "wb") as f:
    f.write(data)

2. post() 办法:以 post 形式发送申请

def post(url, data=None, json=None, **kwargs):

参数阐明:

  • url:字符串类型的须要申请的 url 资源。
  • data:发送数据,能够是字典、列表、元组、字节类型
  • json:json 格局的数据。
  • kwargs:以键值对形容的申请头参数。

根本应用形式

import requests

data={'name':'zhuzhu','age':'23'}
headers={'User-Agent':'Mozilla/5.0(Macintosh;Intel Mac OS X 10_11_4)AppleWebKit/537.36(KHTML,like Gecko)Chrome/52.0.2743.116 Safari/537.36'
}
response=requests.post("http://httpbin.org/post",data=data,headers=headers)
#数据必须是 json 封装
print(response.json())

3. 总结

requests 在基于 urllib 编写的第三方库,相比拟 urllib 应用起来更简略。对其 API 介绍,本文只做了些简略形容。更多办法或应用可查阅文档。

退出移动版