python request库_【Python爬虫】Request库入门

什么是爬虫?

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

其实通俗的讲就是通过程序去获取web页面上自己想要的数据,也就是自动抓取数据。

你可以爬去妹子的图片,爬取自己想看看的视频。。等等你想要爬取的数据,只要你能通过浏览器访问的数据都可以通过爬虫获取

爬虫的本质

模拟浏览器打开网页,获取网页中我们想要的那部分数据

浏览器打开网页的过程:

当你在浏览器中输入地址后,经过DNS服务器找到服务器主机,向服务器发送一个请求,服务器经过解析后发送给用户浏览器结果,包括html,js,css等文件内容,浏览器解析出来最后呈现给用户在浏览器上看到的结果

所以用户看到的浏览器的结果就是由HTML代码构成的,我们爬虫就是为了获取这些内容,通过分析和过滤html代码,从中获取我们想要资源(文本,图片,视频.....)

爬虫的基本流程

发起请求

通过HTTP库向目标站点发起请求,也就是发送一个Request,请求可以包含额外的header等信息,等待服务器响应

获取响应内容

如果服务器能正常响应,会得到一个Response,Response的内容便是所要获取的页面内容,类型可能是HTML,Json字符串,二进制数据(图片或者视频)等类型

解析内容

得到的内容可能是HTML,可以用正则表达式,页面解析库进行解析,可能是Json,可以直接转换为Json对象解析,可能是二进制数据,可以做保存或者进一步的处理

保存数据

保存形式多样,可以存为文本,也可以保存到数据库,或者保存特定格式的文件

Request,Response

浏览器发送消息给网址所在的服务器,这个过程就叫做HTPP Request

服务器收到浏览器发送的消息后,能够根据浏览器发送消息的内容,做相应的处理,然后把消息回传给浏览器,这个过程就是HTTP Response

浏览器收到服务器的Response信息后,会对信息进行相应的处理,然后展示

Request中包含什么?

请求方式

主要有:GET/POST两种类型常用,另外还有HEAD/PUT/DELETE/OPTIONS

GET和POST的区别就是:请求的数据GET是在url中,POST则是存放在头部

GET:向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问

POST:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。

HEAD:与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。

PUT:向指定资源位置上传其最新内容。

OPTIONS:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。

DELETE:请求服务器删除Request-URI所标识的资源。

请求URL

URL,即统一资源定位符,也就是我们说的网址,统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

URL的格式由三个部分组成:

第一部分是协议(或称为服务方式)。

第二部分是存有该资源的主机IP地址(有时也包括端口号)。

第三部分是主机资源的具体地址,如目录和文件名等。

爬虫爬取数据时必须要有一个目标的URL才可以获取数据,因此,它是爬虫获取数据的基本依据。

请求头

包含请求时的头部信息,如User-Agent,Host,Cookies等信息,下图是请求请求百度时,所有的请求头部信息参数

997599-20170524114125357-155405725.png

请求体

请求是携带的数据,如提交表单数据时候的表单数据(POST)

Response中包含了什么

所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。

响应状态

有多种响应状态,如:200代表成功,301跳转,404找不到页面,502服务器错误

1xx消息——请求已被服务器接收,继续处理

2xx成功——请求已成功被服务器接收、理解、并接受

3xx重定向——需要后续操作才能完成这一请求

4xx请求错误——请求含有词法错误或者无法被执行

5xx服务器错误——服务器在处理某个正确请求时发生错误 常见代码: 200 OK 请求成功 400 Bad Request 客户端请求有语法错误,不能被服务器所理解 401 Unauthorized 请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 403 Forbidden 服务器收到请求,但是拒绝提供服务 404 Not Found 请求资源不存在,eg:输入了错误的URL 500 Internal Server Error 服务器发生不可预期的错误 503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常 301 目标永久性转移 302 目标暂时性转移

响应头

如内容类型,类型的长度,服务器信息,设置Cookie,如下图

997599-20170524114314513-1022567785.png

响应体

最主要的部分,包含请求资源的内容,如网页HTMl,图片,二进制数据等

能爬取什么样的数据

网页文本:如HTML文档,Json格式化文本等

图片:获取到的是二进制文件,保存为图片格式

视频:同样是二进制文件

其他:只要请求到的,都可以获取

如何解析数据

直接处理

Json解析

正则表达式处理

BeautifulSoup解析处理

PyQuery解析处理

XPath解析处理

关于抓取的页面数据和浏览器里看到的不一样的问题

出现这种情况是因为,很多网站中的数据都是通过js,ajax动态加载的,所以直接通过get请求获取的页面和浏览器显示的不同。

如何解决js渲染的问题?

分析ajax

Selenium/webdriver

Splash

PyV8,Ghost.py

怎样保存数据

文本:纯文本,Json,Xml等

关系型数据库:如mysql,oracle,sql server等结构化数据库

非关系型数据库:MongoDB,Redis等key-value形式存储

什么是Requests

Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库

如果你看过上篇文章关于urllib库的使用,你会发现,其实urllib还是非常不方便的,而Requests它会比urllib更加方便,可以节约我们大量的工作。(用了requests之后,你基本都不愿意用urllib了)一句话,requests是python实现的最简单易用的HTTP库,建议爬虫使用requests库。

默认安装好python之后,是没有安装requests模块的,需要单独通过pip安装

pip install requests

requests功能详解

总体功能的一个演示

importrequests

response= requests.get("https://www.baidu.com")print(type(response))print(response.status_code)#状态码

print(type(response.text))print(response.text)#打印网页内容

print(response.cookies)print(response.content)print(response.content.decode("utf-8"))#改变编码

我们可以看出response使用起来确实非常方便,这里有个问题需要注意一下:

很多情况下的网站如果直接response.text会出现乱码的问题,所以这个使用response.content

这样返回的数据格式其实是二进制格式,然后通过decode()转换为utf-8,这样就解决了通过response.text直接返回显示乱码的问题.

请求发出后,Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。当你访问 response.text 之时,Requests 会使用其推测的文本编码。你可以找出 Requests 使用了什么编码,并且能够使用 response.encoding 属性来改变它.如:

response =requests.get("http://www.baidu.com")

response.encoding="utf-8"

print(response.text)

不管是通过response.content.decode("utf-8)的方式还是通过response.encoding="utf-8"的方式都可以避免乱码的问题发生

各种请求方式

requests里提供个各种请求方式

1783030-20200531142435694-332357635.png

Requests库的get()方法

1783030-20200531142806981-2139632250.png

1783030-20200531142851087-816402211.png

1783030-20200531143105879-399902254.png

1783030-20200531143338129-1325714928.png

实践:

1783030-20200531143633312-272664734.png

爬取网页的通用代码框架

1783030-20200531143728416-1928611451.png

1783030-20200531143728416-1928611451.png

1783030-20200531143955220-1597683334.png

运行

importrequests

r= requests.get("https://www.baidu.com")

r.status_code#获取网站状态码

r.text#获取内容

r.encoding#获取编码

r.apparent_encoding#获取另一个编码

r.encoding='utf-8'#替换编码为'UTF-8'

会发现一个乱码,一个正常,是因为

1783030-20200531145054032-1455575886.png

1783030-20200531145329720-1621443044.png

代码:

importrequestsdefgetHTMLText(url):try:

r=requests.get(url,timeout=30)

r.raise_for_status()#如果状态码不是200,就引发HTTPError异常

r.encoding=r.apparent_encoding #替换编码

return r.text #返回网页内容

except:return "产生异常啦!"

url="www.baidu.com/"

print(getHTMLText(url))

1783030-20200531152007380-896891165.png

HTTP协议及Requests库方法

1783030-20200531152323058-28666756.png

1783030-20200531152523259-1394485663.png

1783030-20200531152611897-1676422418.png

1783030-20200531152652329-1148381671.png

1783030-20200531152728416-175500696.png

1783030-20200531152958211-860986704.png

1783030-20200531153215687-1194070194.png

1783030-20200531153303748-1850767194.png

1783030-20200531154644019-294285249.png

1783030-20200531154706131-1958995924.png

1783030-20200531154947446-40247802.png

1783030-20200531155003483-1992089938.png

1783030-20200704161202405-648292210.png

1783030-20200704161257022-1515916055.png

1783030-20200704161327820-1150731255.png

1783030-20200704162657194-289067161.png

1783030-20200704164915704-1532959959.png

1783030-20200704170243711-2018300887.png

1783030-20200705103148180-914005837.png

1783030-20200705103207427-194169720.png

1783030-20200705103255263-931719409.png

1783030-20200705103314299-885466456.png

1783030-20200705103419826-1205981171.png

1783030-20200705103623806-2122284369.png

1783030-20200705103639591-2041624826.png

1783030-20200705103658444-1503632864.png

1783030-20200705103710246-932407537.png

1783030-20200705103735575-1700704245.png

1783030-20200705103757231-1425132871.png

1783030-20200705103811855-306074053.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428206.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

world文档粘贴图片进去看不到

在大学做实验报告的时候经常要插入一些截图,往往会遇到直接复制粘贴图片会看不到的情况,会很烦,我自己也找了好多方法,下面是我最喜欢的简便方法的一种。 解决方法如下: 可以点击鼠标右键选择段落,将行距修改为1.5倍即…

c盘users的用户名怎么改_怎么修改iPhone备份文件夹路径 iPhone C盘路径修改教程【详解】...

iPhone备份文件夹路径怎么修改_iPhone C盘备份路径修改教程 我们都知道iPhone默认的备份是在C盘,不过现在各种视频、照片体积那么大,小小的C盘只怕是负荷不了了,那么有什么办法去修改备份路径呢,下面小编就为大家介绍一下。需要注…

javaweb开发的准备工作——配置篇

1.配置 a. jdk配置(用于web开发编程,此处不需要配置path,只需配置环境变量即可) b. tomcat配置 打开Tomcat(打开bin目录下的startup.bat文件) 检验是否打开成功(两个网址都可以,出现汤姆猫即为…

阅读引擎开源项目调研总结

农历腊月初二,也是冬至后的第四个九天,俗称“四九”。冬至这一天开始数九,这就是人们所说的“提冬数九”。数上9天是一九,再数9天是二九……数到“九九”就算“九”尽了,“九尽杨花开”,那时天就暖了。《九…

ftp 上传文件夹_命令行连接FTP服务器

Windows下:打开命令行窗口,输入 ftp,进入ftp命令模式:输入 open ip地址 端口,进入ftp服务器,如open 172.16.3.77 2121。如下图:输入Windows下的用户名,然后输入密码(注意…

创建实现一个简单的web项目

创建一个新的web项目 注意要选择Dynamic Web Project,第一次用可能要找一下,也可以直接搜索栏搜web,就会出来 图片是我自己照片照的,不好截图,看到有个人影勿慌哈哈哈哈,不是你眼睛的问题。 然后在web文件目…

eclipse xml文件报错_Maven教程6: Maven与Eclipse整合

点击上方“Java技术前线”,选择“置顶或者星标”与你一起成长一、安装Maven插件下载下来的maven插件如下图所示:,插件存放的路径是:E:/MavenProject/Maven2EclipsePlugin进入到eclipse中的dropins目录下,新建三个txt文…

C语言#define宏定义可能注意不到的地方

#define使用的核心:直接替换 我也觉得自己很清楚这一点&#xff0c;但看到这一道输出程序片段结果题&#xff0c;还是懵了。大家也可以在不看我下方答案的情况下&#xff0c;自己做一下&#xff0c;题目如下: #include<stdio.h> #define P 3 #define S(a) P*a*a int mai…

结合JSP与HTML做一个九九乘法表

不说了&#xff0c;先上效果图&#xff0c;下面附有源码: 代码一:jsp表达式法 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitio…

python中parse是什么_Python中optparse模块使用浅析

最近遇到一个问题&#xff0c;是指定参数来运行某个特定的进程&#xff0c;这很类似Linux中一些命令的参数了&#xff0c;比如ls -a&#xff0c;为什么加上-a选项会响应。optparse模块实现的也是类似的功能&#xff0c;它是为脚本传递命令参数。 使用此模块前&#xff0c;首先需…

Topshelf创建Windows服务

入门例子 using log4net; using System; using System.Timers; using Topshelf;namespace ConsoleAppTest {class Program{static void Main(string[] args){log4net.Config.XmlConfigurator.Configure();HostFactory.Run(x >{x.Service<TownCrier>();x.RunAsLocalSys…

jsp网页中的换行

JSP网页中输出换行在一开始学习的时候困扰了我不短的时间&#xff0c;因为一些排版需要换行总是很难实现&#xff0c;随着学习&#xff0c;找到了如下几种方法做到换行&#xff0c;以保持页面的美观。 代码和截图我给放在下面了&#xff0c;附了注释: 代码如下&#xff0c;想…

npu算力如何计算_CPU、GPU、NPU、FPGA等芯片架构特点分析

来源 | 汽车电子与软件知圈 | 进“高精度地图社群”&#xff0c;请加微信15221054164&#xff0c;备注地图概述随着人工智能的热潮和AI算法的广泛应用&#xff0c;深度学习已成为当前AI研究的重点&#xff0c;在自动驾驶领域&#xff0c;环境感知、传感器融合、控制决策等等都会…

Eclipse——恢复的默认窗口设置篇

你可能也会像我一样&#xff0c;时不时不小心把一些窗口关掉了&#xff0c;然后想要改回来的时候&#xff0c;又要疯狂的去设置里把它们一个个的显示出来&#xff0c;大概率的还可能得百度一下&#xff0c;看着英文单词有时候就会烦躁。 直接崩溃&#xff1a; 这里一招教你直…

翻牌游戏如何打乱牌面java_家长专栏提高儿童记忆力的游戏训练

记忆是人脑对过去经验的保持和再现。记忆过程包括三个基本环节&#xff0c;即识记、保持、再认或回忆。识记是识别和记住事物。保持是将已获得的知识或经验巩固与保留在大脑中。再认是指过去经历过的事物再度出现时&#xff0c;能将它指认出来。回忆是指过去经历过的事物不在面…

Leetcode 206. Reverse Linked List

Similar Questions Reverse Linked List II Binary Tree Upside Down Palindrome Linked List思路&#xff1a;链表反转。 解法一&#xff1a;迭代。 添加头节点&#xff08;推荐&#xff09;&#xff1a;不断将当前元素start插入dummy和dummy.next之间&#xff0c;实现反转。…

java中输出系统时间

老用老忘&#xff0c;乐此不疲 自己给自己写个模板&#xff0c;忘了随时copy也很香&#xff0c;不是吗&#xff1f; 不说废话了&#xff0c;上代码: package java操作的复习;import java.text.SimpleDateFormat; import java.util.Date;public class SystemTime {public sta…

centos redis make 报错_Redis入门安装,你只需要看我写的这篇就行了

今天来写点基础的东西&#xff0c;可能很多初学者不太会装Redis&#xff0c;这篇文章主要是分享一下如何在Linux中安装redis服务。1. Redis的介绍Redis是一种非关系型数据库(NoSQL)&#xff0c;NoSQL是以key-value的形式存储&#xff0c;和传统的关系型数据库不一样&#xff0c…

四舍六入五凑偶原则

写物理实验报告遇到的&#xff0c;给自己的记忆存个档&#xff0c;下次遇到不迷路 1 2

axios某一接口失败后不调用_axios 源码系列之如何取消请求

我们在前后端交互的过程中&#xff0c;通常是通过请求接口来实现的&#xff0c;而一个页面中的交互又非常复杂&#xff0c;例如需要多次频繁请求同一个接口&#xff0c;或者在接口还没返回时就要切换路由等。这些都需要对接口请求的时机或者请求接口之后进行处理&#xff0c;避…