Python 环境加载中…

爬虫能做什么、不能做什么

3 道练习题·预计 45 分钟·做对一题解锁下一段

完整通读本章 →

教学 01 / 08· 已读

前言

学完基础语法和六个实战章,各位童鞋手里其实已经有了不少本事:会读写文件,会用字典、列表整理数据,还会自己查文档,学会一个新模块。

本事有了,可要拿来练手,还缺一样东西:数据。那么,数据从哪儿来呢?

记账本里的数据,是咱们一笔一笔敲进去的。可网上还有大量现成的数据,比如书店里每本书的价格、天气网站上每天的气温、公告栏里的每一条通知。要是一页一页地复制粘贴,几十条还行,几千条就受不了了。

这时候,就可以让程序替我们跑腿,去网页上把数据取下来。这样的程序,就叫爬虫。

这门课一共 12 章。前 9 章就在网页里运行,抓的是本站专门搭的一个练习靶场:一家虚构的「两点书店」。别看它是虚构的,真实网站上会遇到的结构,它基本都有:列表页、分页、详情页,还有藏在背后的数据接口。最后 3 章回到自己电脑上,去抓公开的爬虫练习站。

整门课都沿着一条主线走:获取 → 解析 → 提取 → 存储。也就是先把网页取回来,再看懂它的结构,接着从里面挑出想要的数据,最后存成文件。抓下来的书店数据,到数据分析课里还会接着用。

不过一开始,咱们先不急着写代码,而是弄清楚一件更要紧的事:爬虫能做什么,不能做什么。

学这一章之前,需要先学完基础课的第 0~9 章和实战 1~6,尤其是 实战 5 的文件读写和 实战 6 的自学方法。

目录

这一章会学到:

  • 一、爬虫是什么——用 requests 取回第一个网页
  • 二、能爬什么、不能爬什么——公开数据、个人信息和版权
  • 三、robots.txt——网站写给爬虫的「告示」
  • 四、做一个有礼貌的爬虫——放慢速度、只取需要的
  • 五、常见坑
  • 六、自己查一次文档——robotparser 还能告诉我们什么
  • 七、小结与回看

学完这一章,你会写出第一个能取回网页的小爬虫,也知道写爬虫之前要先看哪些规矩。

教学 02 / 08

一、爬虫是什么

打开浏览器,在地址栏里输入一个网址,按下回车,网页就出来了。

这中间其实发生了两件事。第一件,浏览器向网站要这个网页,网站把网页的内容发回来;第二件,浏览器再把这些内容画成我们看到的样子。

爬虫做的,只是前一半,也就是第一件事:向网站要网页,再把发回来的内容交给程序去处理。它不需要把网页画出来,只关心里面的文字和数据。

那么,在 Python 里怎么向网站要网页呢?最常用的工具是 requests 。它不是 Python 自带的,在自己电脑上要先安装,怎么装第 10 章会讲;在网页里,它已经准备好了,直接 import 就能用。

下面就用它取回两点书店的首页:

Python· 可在网页运行
import requests

response = requests.get('https://learn-py.org/lab/bookstore/')
print(response.status_code)
print(len(response.text))
print(response.text[:15])

输出的结果:

文本
200
6621
<!doctype html>

代码虽然短,可用到的这几样东西,后面每一章都离不开。咱们一行一行地看:

  • requests.get(网址) 向网站要这个网页。拿回来的结果叫响应(response),存在变量 response 里。
  • response.status_code 是状态码。200 表示「要到了,一切正常」。
  • response.text 是网页的内容,它是一个很长的字符串。用 len() 量一下,有六千多个字符。再看开头,是 <!doctype html> ,说明拿回来的是一个 HTML 网页。

就这么三行,第一个爬虫就写好了。

不过,在网页里运行有一个限制:只能取本站,也就是 learn-py.org 上的网页。为什么呢?因为浏览器出于安全考虑,不让一个网站上的代码随便去读别的网站。所以前 9 章都在两点书店里练,到了第 10 章,回到自己电脑上,才去抓别的网站。

刚才取的首页是存在的,所以状态码是 200 。那么,要是去取一个不存在的网页,又会怎么样呢?

Python· 可在网页运行
import requests

response = requests.get('https://learn-py.org/lab/bookstore/no-such-page/')
print(response.status_code)

输出的结果:

文本
404

404 表示「没有这个网页」。注意,程序并没有报错,而是老老实实地把状态码交给了你。也就是说,取没取到,得你自己来判断。所以拿到响应以后,第一件事就是看看状态码是不是 200 。状态码还有很多种,第 2 章会把它们讲透。

下面先做一道练习,自己取两个网页,看看各自的状态码。

练习 1 / 3取回两个网页,看状态码题目有问题?

两点书店的列表页地址是 https://learn-py.org/lab/bookstore/page/页码/ 。请用 requests 依次取回第 3 页和第 7 页,每一页打印一行:页码和状态码,中间用空格隔开。

运行后的输出应该是:

文本
3 200
7 404

书店一共只有 6 页,所以第 7 页取不到。

main.py
可编辑
做对当前题解锁下一段 ·03

推荐一个,全网最全最友好的中文 AI 编程指南: coding.stormzhang.ai

学习目录