Python "爬虫"出发前的装备之二数据先行( Requests 模块)
1. 概念
爬虫不是动物,而是一种计算机程序。
这种程序有自己特定的功能,能按照使用者给定的一系列规则自行浏览万维网并获取需要的信息。此类程序被称为 网络爬虫(web crawler) 或 网络蜘蛛(spider)。
它具有智能分析能力,也称为 机器人程序 。
爬虫的应用应用领域:
如百度、谷歌等以搜索为主的公司,就是利用其自行研发的爬虫程序在互联网上对网页中的数据进行爬取、分析、归类、存储……再提供给用户使用。
新闻聚合应用也是利用爬虫程序爬取各新闻网站上的新闻信息,进行分检归类后提供给使用者。
爬虫程序可运用于各种需要数据分析的应用领域。如价格分析,根据商品关键字爬取各商城中商品价格,对价格进行比较、分析后展示给用户一个直观的对比表。
爬虫程序从网络上爬取数据时,需要遵守 Rebots 协议。
Rebots 协议是网站拟定的资源共享清单,规定爬虫在本网站爬取数据时,哪些资源可以爬取,哪些资源不可以爬取。
爬虫程序的工作流程:
- 确定目标网页。此页为起始页或叫入口页面。
- 获取页面的数据,通过某种方式(如正则表达式)获取页面中的相关信息。并可提取页面中链接,以递归方式继续对页面数据进行分析,提取。
- 将信息持久化存储,可备后续的处理。
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())
- 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-Agent 是 Python-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
- 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 异常。
当使用 http 或 https 协议请求后返回的是一个 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 对象,使用 r.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 介绍 ,本文只做了些简单描述。更多方法或使用可查阅文档。
Python "爬虫"出发前的装备之二数据先行( Requests 模块)的更多相关文章
- Python "爬虫"出发前的装备之一正则表达式
1. 正则表达式 正则表达式是一种模板表达式语言 通过定义规则去匹配.查找.替换.分割一个长字符串中特定的子字符信息. 如在一篇文章中查找出所有合法的电子邮箱地址,则可以先用正则表达式定义一个电子邮箱 ...
- python爬虫Scrapy(一)-我爬了boss数据
一.概述 学习python有一段时间了,最近了解了下Python的入门爬虫框架Scrapy,参考了文章Python爬虫框架Scrapy入门.本篇文章属于初学经验记录,比较简单,适合刚学习爬虫的小伙伴. ...
- from appium import webdriver 使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium)
使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium) - 北平吴彦祖 - 博客园 https://www.cnblogs.com/stevenshushu/p ...
- Python爬虫框架Scrapy实例(三)数据存储到MongoDB
Python爬虫框架Scrapy实例(三)数据存储到MongoDB任务目标:爬取豆瓣电影top250,将数据存储到MongoDB中. items.py文件复制代码# -*- coding: utf-8 ...
- python爬虫(5)——正则表达式(二)
前一篇文章,我们使用re模块来匹配了一个长的字符串其中的部分内容.下面我们接着来作匹配"1305101765@qq.com advantage 314159265358 1892673 ...
- Python爬虫从入门到放弃(二十四)之 Scrapy登录知乎
因为现在很多网站为了限制爬虫,设置了为只有登录才能看更多的内容,不登录只能看到部分内容,这也是一种反爬虫的手段,所以这个文章通过模拟登录知乎来作为例子,演示如何通过scrapy登录知乎 在通过scra ...
- 【转】Python爬虫:抓取新浪新闻数据
案例一 抓取对象: 新浪国内新闻(http://news.sina.com.cn/china/),该列表中的标题名称.时间.链接. 完整代码: from bs4 import BeautifulSou ...
- Python爬虫:抓取新浪新闻数据
案例一 抓取对象: 新浪国内新闻(http://news.sina.com.cn/china/),该列表中的标题名称.时间.链接. 完整代码: from bs4 import BeautifulSou ...
- 04 Python网络爬虫 <<爬取get/post请求的页面数据>>之requests模块
一. urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib ...
随机推荐
- golang中的标准库log
Go语言内置的log包实现了简单的日志服务.本文介绍了标准库log的基本使用. 使用Logger log包定义了Logger类型,该类型提供了一些格式化输出的方法.本包也提供了一个预定义的" ...
- linux面试题(重点)
1.No space left on device ,但df -h,磁盘空间还很富余?原因是 Inode 耗尽.可以使用df -i检查.磁盘中中产生了很多小的临时文件,造成在磁盘空间耗尽之前文件系统的 ...
- 不难懂——CSS 匹配指定name元素
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...
- 无法自动装配。未找到 ‘xxxx’ 类型的 Bean。
无法自动装配.未找到 'xxxx' 类型的 Bean. 1.解决办法 打开设置,找到编辑器->检查.把"自动装配Bean类",取消勾选,点击应用.确定.
- linux挂载windows nfs
1.win下创建nfs文件夹并共享 2.登陆linux,执行 yum 3.创建挂载点 4.挂载win nfs 5./etc/fstab添加永久挂载 6.查看挂载磁盘,此时windows盘已落在linu ...
- 【Containerd版】Kubeadm高可用安装K8s集群1.23+
目录 基本环境配置 节点规划 网段规划及软件版本 基本配置 内核升级配置 K8s组件及Runtime安装 Containerd安装 K8s组件安装 高可用实现 集群初始化 Master01初始化 添加 ...
- django之js模板插件artTemplate的使用
安装: 方式1:artTemplate模板源码下载地址:https://aui.github.io/art-template/zh-cn/index.html 方式2:使用node.js进行安装:np ...
- 「CTSC 2011」排列
「CTSC 2011」排列 要求不存在公差为 A 或者公比为 B 的子列,那么实际上可以把该问题转化为求一个图的最优拓朴序. 任意差为 A 或者比为 B 的两个数连一条边. 求一个合法序列的答案可以用 ...
- IDE中集成widfly
第一步:添加JBOss服务器,Tomcat同理添加 第二步:选择刚刚部署好的服务器 第三步:启动服务: 注意:与Tomcat略有不同的是,启动的根目录可能不相同,导致一直404 查看启动的根目录: 注 ...
- .net core部署到ubuntu 上传文件超过30MB
默认的上传文件不能超过30MB,需要修改几个地方 一.web.config中添加配置 <requestLimits maxAllowedContentLength="214748364 ...