大作业笔记-爬虫1|青训营笔记

166 阅读5分钟

这是我参与「第四届青训营 」笔记创作活动的第4天

简介

在本次字节跳动青训营中,我们小组选择的大作业项目是实现分布式爬虫,作为一个爬虫小白,本文整理归纳了我入门学习爬虫的笔记。本文为爬虫笔记的第一篇,预计随着学习的深入日后还会发布其他(分布式)爬虫相关笔记。

目录

  1. 背景知识概述
  2. requests模块初步
  3. UA伪装
  4. Ajax请求初步
  5. 总结

背景知识概述

爬虫,顾名思义,即程序如同spider在网上一般,从互联网上爬取信息。应遵循君子协议,不爬取robots.txt表明的不应爬取的内容(在网页对应正常网址后加上/robots.txt即可查看),不爬取私密信息,不在短时间内对网站访问次数过多对网站造成压力。

爬虫的分类:

  1. 通用爬虫--即爬取对应网页中一整张页面的数据
  2. 聚焦爬虫--建立在通用爬虫的基础上,爬取网页中指定的特定内容比如某个词条,只爬取图片等
  3. 增量式爬虫--关注网站中数据的更新

http与https:

我们常在网址的开头看到http或https。他们都代表的是服务器与客户端进行数据交互的一种形式。其中https相比于http,是更安全的超文本传输协议,是进行了加密的。具体加密密钥的建立等在此不赘述。

requests模块初步

requests module为python中的一款基于网络请求的库,其意义在于可以模拟浏览器发送请求。

安装方式为:

pip/pip3 install requests

有些版本的python已经自带了requests库,在输入以上内容时会提示已有。

requests的基本使用思路为:

  1. 确定要访问网页的url
  2. 发起请求
  3. 得到对应网页的响应数据
  4. 持久化储存得到的对应数据

一个基本的代码展示:

import requests
des_url="wanted_url" //输入想去的网页的url
response=requests.get(url=des_url) //response接收返回的对象
page_text=response.text() //这里我们取用对应网页的text数据,也可以取用其他类型的数据,根据具体的需求决定
with open("./des/html","w",encoding="utf-8")as fp:
    fp.write(page_text) //简单地把爬取到的数据写下来

UA伪装

而如今很多网站都有一种基本的反爬机制称为UA(User Agent)检测,即检查访问该网站的载体身份是不是一个正常的浏览器,对于以上的爬虫程序,显然其载体不会被识别为浏览器,所以我们可以进行UA伪装,用一款浏览器对应的身份标识。

浏览器身份标识的查看:

(对于Google Chrome)在一个网页,右键,选择inspect

Screen Shot 2022-08-03 at 15.18.31.png

在上方选择“Network”,然后在页面上进行一些操作,比如点击一个链接,会看到该network部分中显示出来了刚刚的活动

Screen Shot 2022-08-03 at 15.17.36.png

随便选择一个包,在右侧“headers”一栏中拉到最下方,可以看到“user-agent”,这即是当前浏览器对应的user-agent

Screen Shot 2022-08-03 at 15.17.58.png

在爬虫程序中,进行UA伪装即是把这样的浏览器的user-agent(任一浏览器即可)封装到一个字典中,然后在requests.get是,传入这个字典作为headers的参数,如

headers={
    "User-Agent": xxx
}
response=requests.get(url=url,headers=headers)

Ajax请求初步

在上面展示的requests对于网页请求的内容中,只是一个很初步的对于整个网页的读取,然而,很多时候,网页会存在局部刷新,比如很多在线翻译,像百度翻译,当我们在输入要翻译的内容的时候,页面实际上会进行一个局部刷新。这样的局部刷新就涉及到Ajax(阿贾克斯)请求。

我们可以通过inspect-->Network-->XHR来看是不是产生了Ajax请求,以及是否产生了什么包。

Screen Shot 2022-08-03 at 15.30.47.png

然后我们可以在下方的面板中寻找一下我们输入的“计算机”以及这个网页对应给我们的反馈,即“计算机”的相关翻译出现在了哪里,以对这个Ajax请求进行分析。在此,我们发现第三个包覆合我们要找的,“计算机”对应的是data中query这个参数

Screen Shot 2022-08-03 at 15.39.30.png

Screen Shot 2022-08-03 at 15.39.41.png

于是我们可以点进“Headers”,看具体这是什么请求类型,返回的数据又是什么类型。发现这个是一个POST请求,Ajax请求的一种,其返回的是一个json对象。

Screen Shot 2022-08-03 at 15.40.01.png

由此,我们可以利用requests.post()实现Ajax请求,并在程序中将我们想翻译的内容,即“计算机”,封装进一个字典,然后在请求时传入data这个参数,如下:

headers={
    "User-Agent": xxx
}
data={
    "query"="计算机"
}
response=requests.post(url=xxxx,headers=headers,data=data)

不同网站不同的操作涉及的具体Ajax请求即相关参数会有不同,本例子中只有query一个参数是我们需要关心的,但有时候会有很多,那么data这个字典中就还会需要添加其他内容。

总结

学习的最好方法便是get your hands dirty,真正去读代码写代码。在到目前的爬虫学习过程中,读网页客户端源码很有利于加深对于整个网页架构的理解,以及找到爬虫的突破口。我目前对于这个领域的了解还十分浅显,但期待随着实践经验的增加,代码阅读的增加,渐渐深入。