爬虫教程---第一章:爬虫基础

第一章:爬虫基础

1.1 通用爬虫与聚焦爬虫

通用爬虫:主要将互联网上的网页下载到本地,形成一个互联网的镜像备份。

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


1.2 http协议

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

  1. 当你输入网址(也叫url)回车的时候,浏览器会向服务器发送Request请求去获取该网址的html文件。
  2. 服务器将对应的html文件作为Response对象返回给浏览器。
  3. 当浏览器解析Response中的html文件时,如果发现此文件还引用了其他的文件,例如js文件、css文件、图片等,浏览器会自动再发送请求去获取这些文件。
  4. 当所有文件都成功获取了之后,网页会自动解析展示给用户。

1.3 URL详解

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

URL的组成:scheme://host:post/path?queryString#anchor

  • scheme:访问协议,一般是http、https、ftp等。
  • host:主机名/域名,比如www.baidu.com。定位到主机。
  • post:端口号。定位到应用。因为一台主机可能作为多个应用的服务器,所以需要用端口号来识别。
  • path:查找路径。例如www.baidu.com/login。定位到具体的文件。
  • queryString:查询字符串/请求参数。例如www.baidu.com/s?wd=python 浏览器发送Request请求时会把请求参数解析为{“wd”:”python”}发送到后端,后端会对参数做相应的处理。
  • anchor:锚点。前端用做网页定位的。比如很多网络小说的章节跳转,多数用的就是锚点。

tips:http的端口默认是80,https的端口默认是443

1.4 常见的请求方式

HTTP请求中,定义了八种请求方式,常见的有getpost

  • get请求:直接从服务器获取数据,不会对服务器资源产生影响。get请求携带的参数长度有限制,携带参数的方式就是在url后面加上queryString
  • post请求:向后台发送比较重要的数据(登录)、文件上传。参数长度没有限制,携带参数的方式放在Request body中。

更详细的get和post解释可以看:GET和POST两种基本请求方法的区别 这篇博客利用了很形象的例子解释了这两种请求方式之间的联系。

tips:

  1. get比post更不安全。因为get会把请求参数直接显示到url
  2. get跟post在技术上可以相互实现
  3. 一般情况下:get产生一个TCP数据包;post产生两个TCP数据包。
  4. HTTP协议中,向服务器发送一个请求分为三部分:第一是把数据放在url中,第二是把post请求(如果有)放在Request body中,第三是把数据放在head中。

1.5 请求头常见参数

在这里插入图片描述

User-Agent:请求时显示的浏览器名称。后期爬虫会经常用到这个,因为我们提供爬虫发送请求时默认的User-Agent是python,所以我们需要改名字,让服务器认不出我们。

Referer:表名这个请求时从哪个 url 跳转过来的。一般也可以用来做反爬虫技术,因为有些页面必须是要从指定的 url 跳转才可以访问。

cookie:暂时存储网页的信息。因为http协议是无状态的,所谓的无状态就比如当同一个用户发送两次请求时,服务器没有能力知道这两次请求是否来自同一个人,所以需要使用cookie来做标识,这样每次访问的时候cookie就会跟服务器说,我就是那个靓仔。

1.6 常见状态码

200:一切正常

301:永久重定向。以后再访问此网址的时候都会跳转到新的网址。

302:临时重定向。在接下来一段时间,访问此网址的时候都会跳转到新的网址。

404:资源不存在

403:权限不足

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

1.7 分析调试界面

在一个页面中,按下F12右键->检查元素可以跳转到开发者调试界面,开发者调试界面可以查看一些关于网站的一些信息。以后爬虫需要经常利用它进行抓包,页面的分析等操作。

控制台的样子一般长这样:在这里插入图片描述

Elements:网页的html源代码内容。

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

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

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

在这里插入图片描述

1.8 urllib库

urllibpython一个基本的网络请求库,可以模拟浏览器行为,向指定服务器发送一个请求,并可以保存服务器返回的数据。在使用这个库之前需要先导入from urllib import request

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

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

格式:urlopen(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)  # 获取返回状态码

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

格式:urlretrieve(url,filename)

参数:

  • url:要请求的网址。默认为get请求
  • filename:保存到本地时文件的名字(可以指定路径)
from urllib import request  # 1.导入urllib库

url = 'https://www.baidu.com'
request.urlretrieve(url, 'baidu.html')

此时你会发现,当前项目文件夹就多出了个baidu.html 的文件。那么如果你想把文件下载到指定的目录可以request.urlretrieve(url, 'D://baidu.html') ,执行代码之后文件就跑到D盘下了。

此函数功能很强大,比如你想爬取漂亮美眉的图片,可以写个while循环然后写好美眉图片的路径,那么你就可以为所欲为了。


request.Request类

前面的urlopen 是不知道如何伪装的,只能傻傻的告诉服务器说:我是爬虫,我要爬取你的信息,你给不给我,不给我就走了。这时,“凶”一点的服务器就直接上来打它,MD,还没见过这么嚣张的爬虫呢。

所以,如果我们要能更安全的爬取一些信息,我们需要作出一些伪装,例如前面提到的User-Agent 。如果我们需要配置这些信息,那就需要使用到request.Request

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 进入开发者调试工具,然后来到Network ,接着随便点击一个请求,找到请求头,然后复制里面的User-Agent 到代码中,然后改成字典的形式就可以了。
在这里插入图片描述

1.9 小实战

Request类除了可以设置User-Agent还可以设置参数(data)跟请求方式(method)。

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

在这里插入图片描述

首先随便找到个可以分页的地方(这里以爬取分页信息为例),按F12 找到 Network 在众多请求中找到获取分页信息的请求(在拉钩网应该是.json结尾且type为xhr 的请求),找到该请求之后你会发现,这个请求的方式为post

复制上面的referer ,因为我按了第二页,所以他的referer的意思是从第一页跳转过来的。

复制User-Agent 伪装下自己。

分析Form Data,我这里的是Google浏览器其他浏览器的方式大同小异。可以看到

有这样的一些参数:

  • first:true 表示是否在第一页
  • pn:1 表示当前的页数。
  • kd:Python 搜索的职业是python

下面来看看代码:

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.urlencode 方法,这个方法的作用就是帮我们将key:value这样的键值对转换成"key=value"这样的字符串

怎么样,到了这一步是不是就小有成就了,这只是初步的爬取一个网页,经过以后的学习就可以爬取自己想要的数据,不仅仅是一个网页啦,而是具体的文字啊,信息啊什么的,加油,让我们一起努力!

小结:

  1. 由于很多网站采取的都是ajax异步请求,所以找这些异步请求的时候一般找有ajax字眼并且是json文件的
  2. 爬虫时能在网页的请求头中复制的就尽量在请求头中复制。

由于以后这个爬虫教程主要是学Request库来进行网络爬取,所以在这里就不过多的介绍urllib 库了。并且下章开始就使用Request库了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章