开往未来的列车|Python爬虫快速入门,静态网页爬取

在开始之前 , 请确保你的电脑上已经安装好了BeautifulSoup库 , 可以通过在命令行中输入pip install beautifulsoup4来进行安装 。
一、数据解析在爬取之前 , 我们需要检测下响应状态码是否为200 , 如果请求失败 , 我们将爬取不到任何数据:
import requestsre = requests.get('')if re.status_code == 200:print('请求成功!')else:print('请求失败!响应状态码为{}'.format(re.status_code))响应状态码为418 , 我们请求失败了 , 这是为什么呢?因为豆瓣有反爬虫机制 , 我们无法通过直接请求服务器来爬取数据 , 必须在发起请求之前将自己伪装起来 。
1.1 反爬虫反爬虫是网站限制爬虫的一种策略 。 它并不是禁止爬虫(完全禁止爬虫几乎不可能 , 也可能误伤正常用户) , 而是限制爬虫 , 让爬虫在网站可接受的范围内爬取数据 , 不至于导致网站瘫痪无法运行 。 常见的反爬虫方式有判别身份和IP限制两种 , 这里我们先介绍前者 , 后者稍后再提及 。
有些网站在识别出爬虫后 , 会拒绝爬虫进行访问 , 比如之前提到的豆瓣 。 那我们怎样做才能不被识别出来呢?在此之前 , 我们先尝试一下直接爬取:
import requestsre = requests.get('')print(re.text)结果是什么都没有输出 , 因为豆瓣将我们的爬虫识别了出来并拒绝提供内容 。 你可能会有疑问 , 爬虫不是模拟浏览器访问网站、获取网页源代码的吗?为什么就被识别出来了呢?事实上 , 无论是浏览器还是爬虫 , 访问网站时都会带上一些信息用于身份识别 , 而这些信息都被存储在一个叫请求头(request headers)的地方 。
服务器会通过请求头里的信息来判别访问者的身份 。 请求头里的字段有很多 , 我们暂时只需了解user-agent(用户代理)即可 。 user-agent里包含了操作系统、浏览器类型、版本等信息 , 通过修改它我们就能成功地伪装成浏览器并爬取我们想要的数据 。
那么如何找到user-agent呢?操作步骤如下:

  1. 首先按F12(或Fn+F12) , 然后单击上方的Network标签 。
  2. 此时打开 , 在Name一列中找到top250并单击 。
  3. 在右边的Headers中找到Request Headers , User-Agent就在其中 。
选中后将其复制下来 , 我的浏览器的User-Agent是Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36 , 而requests默认的User-Agent是python-requests/2.24.0 。 默认的User-Agent和在头上贴着“我是爬虫”的纸条没有什么区别 , 很容易被服务器识别出来 。 因此我们需要修改请求头里的user-agent字段内容 , 将爬虫伪装成浏览器 。
我们只需定义一个字典(请求头字段作为键 , 字段内容作为值)传递给headers参数即可 , 方法如下:
import requestsheaders = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36'}re = requests.get('', headers=headers)print(re.text)这样就能正常输出内容了(结果太长这里不展示) 。 除了user-agent之外的其他请求头字段也能以同样的方式添加进去 , 但大部分情况下我们只需要添加user-agent字段即可 。 当我们加了user-agent字段还是无法获取到数据时 , 说明该网站还通过别的信息来验证身份 , 我们可以将请求头里的字段都添加进去再尝试 。
1.2 BeautifulSoup 对象接下来我们将网页源代码解析成BeautifulSoup对象:
import requestsfrom bs4 import BeautifulSoupheaders = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36'}re = requests.get('', headers=headers)soup = BeautifulSoup(re.text, 'html.parser')