# 一、爬虫简介
网络爬虫(又称为网页蜘蛛,网络机器人,在 FOAF 社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
# 二、网站 robots 协议
robots 是搜索引擎爬虫协议,也就是你网站和爬虫的协议。
** 简单的理解:**robots 是告诉搜索引擎,你可以爬取收录我的什么页面,你不可以爬取和收录我的那些页面。robots 很好的控制网站那些页面可以被爬取,那些页面不可以被爬取。
主流的搜索引擎都会遵守 robots 协议。并且 robots 协议是爬虫爬取网站第一个需要爬取的文件。爬虫爬取 robots 文件后,会读取上面的协议,并准守协议爬取网站,收录网站。
robots 文件是一个纯文本文件,也就是常见的.txt 文件。在这个文件中网站管理者可以声明该网站中不想被 robots 访问的部分,或者指定搜索引擎只收录指定的内容。因此,robots 的优化会直接影响到搜索引擎对网站的收录情况。
# 存放目录
robots 文件必须要存放在网站的根目录下。也就是 域名 /robots.txt 是可以访问文件的。你们也可以尝试访问别人网站的 robots 文件。 输入域名 /robots.txt 即可访问。示例:知乎
知乎的 robots 文件
# robots 写作语法
User-agent: Googlebot | |
Disallow: /appview/ | |
Disallow: /login | |
Disallow: /logout | |
Disallow: /resetpassword | |
Disallow: /terms | |
Disallow: /search | |
Allow: /search-special | |
Disallow: /notifications | |
Disallow: /settings | |
Disallow: /inbox | |
Disallow: /admin_inbox | |
Disallow: /*?guide* | |
User-agent: Googlebot-Image | |
Disallow: /appview/ | |
Disallow: /login | |
Disallow: /logout | |
Disallow: /resetpassword | |
Disallow: /terms | |
Disallow: /search | |
Allow: /search-special | |
Disallow: /notifications | |
Disallow: /settings | |
Disallow: /inbox | |
Disallow: /admin_inbox | |
Disallow: /*?guide* | |
User-agent: Baiduspider-news | |
Disallow: /appview/ | |
Disallow: /login | |
Disallow: /logout | |
Disallow: /resetpassword | |
Disallow: /terms | |
Disallow: /search | |
Allow: /search-special | |
Disallow: /notifications | |
Disallow: /settings | |
Disallow: /inbox | |
Disallow: /admin_inbox | |
Disallow: /*?guide* | |
User-agent: Baiduspider | |
Disallow: /appview/ | |
Disallow: /login | |
Disallow: /logout | |
Disallow: /resetpassword | |
Disallow: /terms | |
Disallow: /search | |
Allow: /search-special | |
Disallow: /notifications | |
Disallow: /settings | |
Disallow: /inbox | |
Disallow: /admin_inbox | |
Disallow: /*?guide* | |
User-agent: Baiduspider-render | |
Disallow: /appview/ | |
Disallow: /login | |
Disallow: /logout | |
Disallow: /resetpassword | |
Disallow: /terms | |
Disallow: /search | |
Allow: /search-special | |
Disallow: /notifications | |
Disallow: /settings | |
Disallow: /inbox | |
Disallow: /admin_inbox | |
Disallow: /*?guide* | |
User-agent: Baiduspider-image | |
Disallow: /appview/ | |
Disallow: /login | |
Disallow: /logout | |
Disallow: /resetpassword | |
Disallow: /terms | |
Disallow: /search | |
Allow: /search-special | |
Disallow: /notifications | |
Disallow: /settings | |
Disallow: /inbox | |
Disallow: /admin_inbox | |
Disallow: /*?guide* | |
User-agent: bingbot | |
Disallow: /appview/ | |
Disallow: /login | |
Disallow: /logout | |
Disallow: /resetpassword | |
Disallow: /terms | |
Disallow: /search | |
Allow: /search-special | |
Disallow: /notifications | |
Disallow: /settings | |
Disallow: /inbox | |
Disallow: /admin_inbox | |
Disallow: /*?guide* | |
User-Agent: * | |
Disallow: / |
user-agent 这句代码表示那个搜索引擎准守协议。user-agent 后面为搜索机器人名称,如果是 “*” 号,则泛指所有的搜索引擎机器人;案例中显示 “User-agent: *” 表示所有搜索引擎准守,* 号表示所有。
Disallow 是禁止爬取的意思。Disallow 后面是不允许访问文件目录(你可以理解为路径中包含改字符、都不会爬取)。案例中显示 “Disallow: /?s*” 表示路径中带有 “/?s” 的路径都不能爬取。 * 代表匹配所有。 这里需要主机。 Disallow 空格一个,/ 必须为开头。
如果 “Disallow: /” 因为所有路径都包含 / ,所以这表示禁止爬取网站所有内容。
如果没有被禁止到的路径,默认为可以被爬取。
# 关于 robots 的注意事项
-
不要禁止爬虫爬取网站的所有,因为从经验来看,如果屏蔽一次,解封后好一段时间爬虫都不会来你网站,收录成为问题。
-
代码后需要【冒号 + 空格 + 斜杆】 ,比如 “Disallow: /? ”
-
当网站为静态路径时,需要屏蔽掉所有动态链接。网站中存在一种链接被收录即可,避免一个页面 2 个链接。代码如下 “Disallow: /? ” 表示禁止所有带?号的网址被爬取。通常动态网址带有 “?”“=” 等。
-
根据自己网站情况定,屏蔽不需要收录的网址。
# 三、爬虫语言的选择
很多人提到爬虫就会想到 Python,其实除了 Python,其他的语言诸如 C,PHP,Java 等等都可以写爬虫,而且一般来说这些语言的执行效率还要比 Python 要高,但为什么目前来说,Python 渐渐成为了写很多人写爬虫的第一选择,简单总结了以下几点:
-
开发效率高,代码简洁,一行代码就可完成请求,100 行可以完成一个复杂的爬虫任务;
-
爬虫对于代码执行效率要求不高,网站 IO 才是最影响爬虫效率的。如一个网页请求可能需要 100ms,数据处理 10ms 还是 1ms 影响不大;
-
非常多优秀的第三方库,如 requests,beautifulsoup,selenium 等等;
# 四、HTTP 请求类型
根据 HTTP 标准,HTTP 请求可以使用多种请求方法。
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
| 序号 | 方法 | 描述 |
|---|---|---|
| 1 | GET | 请求指定的页面信息,并返回实体主体。 |
| 2 | HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
| 3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和 / 或已有资源的修改。 |
| 4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
| 5 | DELETE | 请求服务器删除指定的页面。 |
| 6 | CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
| 7 | OPTIONS | 允许客户端查看服务器的性能。 |
| 8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
| 9 | PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
# 五、HTTP 状态码
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它 URL
- 404 - 请求的资源(网页等)不存在
- 500 - 内部服务器错误
所有的状态代码的取值一般在 100-599 之间,超出这个范围的响应状态码就不是标准的状态响应码了。所有的状态码可以分成 5 类:
- 100–199:信息反馈(Informational responses);
- 200–299:成功反馈(Successful responses),上面的代码的 200 status code 就属于这里;
- 300–399:重定向消息(Redirection messages);
- 400–499:客户端错误响应(Client error responses),这个区间包含了我们常见的 403 和 404 错误响应码
- 500–599:服务器错误响应(Server error responses)
# 六、requests 中 get 与 post 的 headers 参数
在编写爬虫的过程中,有些网站会设置反爬机制,对不是来源于浏览器的访问进行拒绝,此时我们会收到 403 错误响应码,或者收到 “抱歉,无法访问 “等字眼,这就需要在爬虫程序中修改请求的 headers 伪装浏览器访问,从而绕开网站的反爬机制获取正确的页面。
# 1. 了解 requests 中 get 与 post 的 headers 参数
{ | |
"headers": { | |
"Accept": "*/*", | |
"Accept-Encoding": "gzip, deflate", | |
"Host": "httpbin.org", | |
"User-Agent": "python-requests/2.31.0", | |
"X-Amzn-Trace-Id": "Root=1-65373fd4-71bd6a663234e7c4749aa450" | |
} | |
} |
User-Agent: 用户代理(英语:User Agent)指的是代表用户行为的软件代理程序所提供的对自己的一个标识符。用于标识浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识
我们直接用 request 包,上来就调用 get 或者 post 方法,对方的服务器会根据我们发送的 **“User-Agent”: “python-requests/2.31.0”** 了解到,你是用 python 调用的 request 包来访问他们的服务器的。由于这种行为仅仅是消耗服务器资源带来成本,但是不会给对方带来任何好处(搜索引擎的爬虫除外),所以有一些网站会加入反爬机制,通过识别 headers 来拒绝对你的请求进行响应。
因此,我们需要在发送的请求中加入自定义的 headers,将我们的请求伪装成利用浏览器进行的请求。
# 2. 查看浏览器 headers 的常用方法
在浏览器的网页上:F12 打开检查 ——> Network ——> Doc ——> 在 Name 里找到对应的请求文件 ——> 在右边选择标头 标签页,找到 “请求标头”,就可以看到我们发送给服务器的 headers。
同理,服务器在发给我们信息的时候,也会发送 Headers。我们同样在上面的选择路径,可以看到 “Response Headers”。
我们可以查看到服务器响应返回的头信息知道响应结果的编码是 utf-8,有的还可以看到服务器所用是 apache 或是其他 web 服务器。
# 3.Headers 的解读
- User-Agent 的格式解读
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.61 |
- Mozilla/5.0 (WindowsNT 10.0; Win64; x64):表示代理服务器的操作系统和版本。这里表示代理服务器是在 Windows 10 64 位操作系统上运行的。
- AppleWebKit/537.36 (KHTML, like Gecko):表示代理服务器使用的浏览器引擎。这里表示代理服务器使用的是 AppleWebKit 引擎,它是一个开源的浏览器引擎,类似于 Gecko 引擎。
- Chrome/118.0.0.0 Safari/537.36:表示代理服务器使用的浏览器版本。这里表示代理服务器使用的是 Chrome 浏览器版本 118.0.0.0,以及 Safari 浏览器版本 537.36。
- Edg/118.0.2088.61:表示代理服务器使用的 Edge 浏览器版本。这里表示代理服务器使用的是 Edge 浏览器版本 118.0.2088.61。
- Cookie
cookie,有时也用其复数形式 Cookies。类型为 “小型文本文件”,是某些网站为了辨别用户身份,进行 Session 跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息 。具体信息见 cookies 百度百科。