「爬虫教程」第一章:python爬虫基础教程

原文链接:

1.1 通用爬虫与聚焦爬虫

通用爬虫可进行网页的下载, 其下载的对象是互联网上的网页, 它会把这些网页下载至本地, 最终形成一份关于互联网的镜像备份。

聚焦爬虫:通过特定的规则对网页内容进行与需求相关的爬取。

1.2 http协议

首先看一下在浏览器中是怎么样发送一个http请求的过程:

当你把网址(也就是url)输入进去, 然后按下回车, 此时浏览器就会朝着服务器发送请求, 其目的是去获取那个网址对应的html文件。

服务器将对应的html文件作为对象返回给浏览器。

在当浏览器对处于解析进程当中的html文件作出分析时, 要是察觉到该文件还存在着对于其他文件开展引用的情况, 诸如js文件、css文件、图片等诸如此类的, 则浏览器这一主体将会自主地再次施行发出请求这一行为, 以此去达成对于这些文件予以获取的目的。

当所有文件都成功获取了之后,网页会自动解析展示给用户。

1.3 URL详解

URL:是 的的简写,叫做统一资源定位符。

URL的组成:://host:post/path?#

:访问协议,一般是http、https、ftp等。

host:主机名/域名,比如。定位到主机。

端口号, 即post。它能定位到应用。一台主机有可能作为多个应用的服务器, 故而要用端口号去进行识别。

path:查找路径。例如/login。定位到具体的文件。

找寻查询字符串, 或者说是请求参数。就好比是/s?wd= 一样, 当浏览器发出请求之际, 会将请求参数解析成{"wd":""}这般的形式发送至后端, 而后端会针对这些参数开展相应的处理工作。

用于前端网页定位的锚点, 被许多网络小说用来实现章节跳转, 这类情况颇为常见。

小贴士, 超文本传输协议的端口平常设定为八十, 超文本传输安全协议的端口通常设定为四百四十三。

1.4 常见的请求方式

于HTTP请求里头, 界定了八种请求方式 , 其中常见的存在get以及post。

get请求: 直接从服务器那儿把数据给获取过来, 不会对服务器的资源产出影响呢。get请求所携带的参数长度存在限制, 携带参数的方式啊就是在url的后面给加上。

post请求, 用于朝着后台发送颇为重要的数据, 诸如登录时所用的(数据), 还有用于文件上传的(数据)。其参数长度不存在限制因素, 携带参数的有关方式放置于body里面。

tips:

相较于post, get存在着更大的不安全因素。这是由于, get会将请求参数, 直接完整地展示于url里面, 以至于很容易被他人获取到。

get跟post在技术上可以相互实现

通常情形下, get会生成一个TCP数据包, post则会产生两个TCP数据包。

对于HTTP协议来讲, 向服务器发送一个请求, 这一行为被分割为三个部分, 其一涵盖将数据放置于url里, 其二包括把post请求(倘若存在)放置在body之中, 其三是把数据置于head里。

1.5 请求头常见参数

http协议详解_Python网络抓包_通用爬虫与聚焦爬虫

使用者代理: 在请求之际所展现的浏览器名号, 于后续时期爬虫时常会运用到这个, 鉴于我们所供给的爬虫在发送请求之时默认的使用者代理是如此这般, 故而我们需要去更改名称, 使之让服务器无法辨识出我们。

表明此等请求究竟是自哪个url跳转而来的, 通常而言, 其亦可被用以施行反爬虫技术, 缘由在于, 存在一些页面唯有从指定的url跳转过去才能够予以访问句号。

网页的信息会被暂时存储起来 , 由于http协议具有无状态的特性 , 这种无状态就好比 , 当同一个用户发出两次请求时 , 服务器没办法知晓这两次请求是不是源于同一个人 , 所以需要借助某种方式来进行标识 , 如此一来 , 每次访问之时 , 就会向服务器表明 , 我便是那个靓仔。

1.6 常见状态码

200:一切正常

301, 即永久重定向, 往后, 一旦再度对该网址加以访问, 便都会跳转至新的网址处。

302, 是那种临时重定向的情况, 在后续一段时间, 当对这个网址进行访问时, 都会跳转到另外一个新的网址那里去。

404:资源不存在

403:权限不足

5开头:服务器内部出错(一般是代码写错)

1.7 分析调试界面

于一个页面之内, 按下F12、或者右手右键之后选点检查元素, 如此便能跳转至开发者调试界面, 该开发者调试界面能够查看某些关于网站的一些信息, 往后爬虫需要时常借助它来搞抓包, 进行面对页面的分析等相关操作。

控制台的样子一般长这样:

:网页的html源代码内容。

:控制台,用来进行一些JS操作。

:网站所要用到的资源文件。

:查看该网页向服务器发送了哪些请求。(常用)

http协议详解_通用爬虫与聚焦爬虫_Python网络抓包

1.8 库

存在着这样一个库, 它属于基本的网络请求库范畴, 能够对浏览器行为予以模拟, 朝着指定的服务器去发送一个请求, 并且具备保存服务器返回数据的能力。在运用这个库之前, 要先进行导入操作, 需从from开始。

下面看看这个库里面使用的一些函数吧:

函数: 发送网络请求,返回 对象。

格式:(url,data=None)

参数:

url:要请求的网址。默认为get请求
data:请求参数。默认值为None,如果设置了此值就变成post请求
from urllib import request # 1.导入urllib库
url = 'https://www.baidu.com/baidu'
# 2.获取Response对象
res = request.urlopen(url)
print(res.read()) # 获取网页源代码
print(res.status) # 获取返回状态码

函数:将服务器的一个文件保存到本地

格式:(url,)

参数:

url:要请求的网址。默认为get请求

:保存到本地时文件的名字(可以指定路径)


from urllib import request # 1.导入urllib库
url = 'https://www.baidu.com'
request.urlretrieve(url, 'baidu.html')

这会儿你会发觉, 当下项目文件夹里愣是多出来了个名为baidu.html的文件。要是你打算把这个文件下载到指定的目录那儿去, 能够执行(url, \('D://baidu.html'\)) , 等代码运行完毕后文件就跑到D盘下面去了。

这个函数具备着极为强大的功能, 比如说, 要是你有着想要去爬取那些漂亮美眉的图片的想法, 那么就能够去谱写一个while循环, 接着再去拟用好美眉图片的路径, 如此一来, 你便可以随心所欲了。

.类

处于前方位置的, 是不晓得该怎么去伪装自身的, 仅仅能够憨傻地告知服务器讲: 我身为爬虫, 我打算去爬取你的信息, 你究竟给还是不给我, 要是不给我那我就离开了。在这个时候, “凶狠”一些的服务器便会径直上前去攻击它, MD, 还从未见识过如此张狂的爬虫呢。

因而, 要是我们想要能够更为安全地去爬取某些信息, 那我们就得进行一些伪装, 就像前面所提及的User - Agent那样。假设我们需要对这些信息加以配置, 那就得运用到。

from urllib import request
url = 'https://www.baidu.com/baidu'
# 设置请求头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/82.0.4077.0 Safari/537.36'
}
# 伪装User-Agent
req = request.Request(url, headers=headers)
res = request.urlopen(req) # 此时不再需要传url
print(res.read().decode('utf-8')) # 将二进制内容解码成utf-8

到了这一步,妈妈就不再担心我因为“名字”被打了。

那么问题来了,这个User-Agent 要怎么设置呢?

实际上挺简易, 借助浏览器随意开启一个页面, 随后按下F12进入开发者调试工具, 随后抵达某个地方, 紧接着随意点一下一个请求, 寻得请求头, 随后把里面的User-Agent复制到代码内, 随后改成字典的样式就行了。

Python网络抓包_http协议详解_通用爬虫与聚焦爬虫

1.9 小实战

类能够进行User - Agent的设置, 除此之外, 还能够设置(data)参数, 以及设置请求方式()。

让我们把以上内容跟类结合爬取一下拉勾网吧。

Python网络抓包_通用爬虫与聚焦爬虫_http协议详解

首先, 随意寻找一个能够进行分页的区域(此处以爬取分页信息当作例子), 按下F12 , 在所存在的诸多请求里找出获取分页信息的那个请求(在拉钩网这是.json扩展名而type属性为xhr的请求), 当找到该特定请求之后, 你会察觉到, 这个请求所采用的方式是post。

摹写上面那部分内容, 鉴于我摁下了第二页呢的按键情况, 故而它意思所指的是从第一页那儿转弯过来情形的。

复制User-Agent 伪装下自己。

剖析Form Data, 我这儿的是以浏览器的形式呈现的, 而其他浏览器的做法大致相同, 能够见到。

有这样的一些参数:

first:true 表示是否第一次访问

pn:1 表示当前的页数。

kd: 搜索的职业是

下面来看看代码:

from urllib import request
from urllib import parse
url = 'https://www.lagou.com/guangzhou-zhaopin/Python/4/?filterOption=3&sid=4d3fa0ba0cc14b84a9e25164db9ca571'
# 设置请求头和referer
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/82.0.4077.0 Safari/537.36',
"referer": "https://www.lagou.com/guangzhou-zhaopin/Python/4/?filterOption=3&sid=4d3fa0ba0cc14b84a9e25164db9ca571"
}
# 设置请求参数,如这里设置请求第四页的内容
data = {
"first": "false",
"pn": 4,
"kd": "python"
}
# 设置POST请求,且设置POST请求的参数
req = request.Request(url, headers=headers, data=parse.urlencode(data).encode('utf-8'), method='POST')
res = request.urlopen(req)
print(res.read().decode('utf-8'))

这处讲述parse. 办法, 该办法的功用乃是助力我们把key:value 这般的键值对转变为"key=value" 这样的字符串。

如何, 发展至当前这般状况是不是就已稍有成绩了, 这仅仅是初步的对一个网页展开爬取, 历经后续的学习便能够爬取自身所期望获取的数据, 并非仅仅局限于一个网页, 而是确切的文字呀, 信息之类的, 奋勇向前, 让咱们一同全力以赴!

小结:

因为诸多网站所采用的皆是ajax异步请求,所以在寻觅这些异步请求之际, 通常是搜寻那些带有ajax字眼, 且为json文件的。

爬虫时能在网页的请求头中复制的就尽量在请求头中复制。

鉴于往后这个爬虫教程主要是借助学库去开展网络爬取工作, 因而在此处就不会对学库展开过多的阐述啦。而且从下一章起就要运用学库了。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值