爬虫(一)基础介绍

news2024/11/15 17:16:20

文章目录

  • 1. 爬虫简介
    • 1.1 robots协议
    • 1.2 反爬手段
    • 1.3 请求组成
    • 1.4 响应组成
    • 1.5 POST 请求与 GET 请求
  • 2. requests库
    • 2.1 GET请求
    • 2.2 POST请求
    • 2.3 代理

1. 爬虫简介

网络爬虫也叫做网络机器人,可以代替人们自动地在互联网中进行数据信息的采集与整理。它是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,可以自动采集所有其能够访问到的页面内容,以获取相关数据。

爬虫的使用,能够在一秒内访问几十甚至几百次服务器,这种速度根本不是人所能达到的,因而也就给服务器加大了负担,如果持续这种访问量,甚至可能导致服务器崩溃,所以,各个网站对爬虫的访问都是有一些限制的和要求的。

1.1 robots协议

在要求方面,各个网站提供了robots协议,里面规定了该网站中哪些部分能够进行爬虫访问,哪些部分不能进行爬虫访问,这也称为君子协议,不过好像大部分都是小人,不怎么想遵守,如果想要查看一个网站的robots协议,只需要在网站网址的后面加上 robots.txt 即可,比如想要查看CSDN的robots协议,只需要在CSDN的网址 https://www.csdn.net/ 加上 robots.txt ,即输入网址 https://www.csdn.net/robots.txt 就可以看到下面的内容,意思是进禁止所有人访问该网站部分内容,还玩傲娇。
在这里插入图片描述

1.2 反爬手段

在限制方面,各大网站手段也是层出不穷,以前我不知道搞那些弱智的验证码有什么用,现在学了爬虫知道了,确实难受了一段时间,不过该行还是得行。反爬手段主要有以下几种:

  1. User Agent
    这种方法破解很简单,只需要将网页的 User Agent 复制了放入header即可。
  2. 代理IP
    该方法里网站设置了一些人类行为的阈值,只要高于这个行为网站就会将其视作爬虫,并封掉IP,禁止该IP访问。比如一秒内访问网页20次以上视作爬虫,这应该不过分吧。一般遇到这种情况,我们都会配置一个代理IP,使用代理IP来进行访问。
  3. 验证码访问
    这玩意经常遇到。
  4. 动态加载网页
    网站访问的是JS数据,不是网站的真实数据,可以使用selenium驱动浏览器进行请求。
  5. 数据加密
    这是最恶心的,将数据在JS代码里面加密,然后使用加密的数据发送请求,这种只有在JS代码里面找到加密规则,漫篇的打包后的JS代码,头都给看没。

1.3 请求组成

用户向服务器发送信息称之为请求,服务器向用户发送信息称之为响应。请求一般由请求方法、请求网址、请求头、请求体组成。

  1. 请求方法
    常见的请求方法如下:
    GET:请求页面,数据包含在URL里面
    POST:大多用于提交表单或者上传文件,数据包含在请求体中
    HEAD:类似GET请求,不过响应报文没有具体的内容,用于获取报头
    PUT:用客户端传送的数据取代指定的内容
    DELETE:请求服务器删除指定的页面
    CONNECT:把服务器当作跳板,让服务器代替客户端访问其他网页
    OPTIONS:允许客户端查看服务器的性能
    TRACE:回显服务器收到的请求,主要用于测试或者诊断
    不过我们见到和使用的大多数都是GET和POST请求

  2. 请求网址
    请求的网址即URL

  3. 请求头
    请求头,一般是传送服务器需要的一些附加信息,其中比较重要的就是User-Agent,Referer,Cookie等,常用的请求有说明如下

    Accept: 请求报头域,用于指定客户端可接受哪些类型的信息
    Accept-Language: 指定客户端可接受的语言类型
    Accept-Encoding: 指定客户端可接受的编码
    Host:用于指定资源主机的IP和端口号,其内容为请求URL的原始服务器或网关的位置
    Cookie:网站为了辨别用户进行会话跟踪而存储在用户本地的数据,它的主要功能是维持当前访问会话。
    Referer: 用来标识这个请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应的处理,如做资源统计,防盗链接处理等。
    User-Agent: 可以是服务器识别客户端使用的操作系统及版本,浏览器及版本信息等。所以在做爬虫时要加上此信息,可以伪装浏览器;不加的话很容易被识别为爬虫。
    Conten-Type:互联网媒体类型,用来表示具体请求中媒体类型信息;如text/html代表HTML格式,image/gif代表GIF图片,application/json代表JSON类型

  4. 请求体
    请求体一般POST请求的时候才会有,因为GET请求的信息都在URL里。

1.4 响应组成

  1. 响应状态码
    状态码能够最基本的判定服务器对请求的响应情况,比如200就是请求成功,301就是重定向,404就是请求资源不存在,500就是服务器错误等,常见的一些如下:

    200:请求成功,服务器已成功处理请求。
    301: 重定向,请求的网页已经移动到新位置
    400: 请求错误401: 未授权,请求没有进行身份验证或者验证未通过
    403: 禁止访问404:未找到,请求资源不存在500:服务器错误
    503: 服务器无法使用

  2. 响应头
    响应头包含了服务器对请求的一些应答信息,如Server,Content-Type,Set-cookie等信息。

    content-type: 返回数据的类型
    sever:服务器名称,版本等信息
    set-cookie: 会话cookie,下次请求需要带上。

  3. 响应体
    响应信息中最重要的当属响应体了,因为我们想要获取的信息基本都在里面。python的request库也有对应的方法了提取相关信息,即 r.text

1.5 POST 请求与 GET 请求

POST请求和GET请求都是请求的方式,其区别如下:

  1. GET 请求,请求的数据会附加在 URL 之后,以?分割 URL 和传输数据,多个参数用&连接。POST 请求:POST 请求会把请求的数据放置在 HTTP 请求包的包体中。因此, GET 请求的数据会暴露在地址栏中,而 POST 请求则不会。
  2. 传输数据的大小对于 GET 请求方式提交的数据最多只能有 1024 字节,而 POST 请求没有限制。
  3. 安全性问题使用 GET 请求的时候,参数会显示在地址栏上,而 POST 请求不会。所以,如果这些数据是非敏感数据,那么使用 GET;如果用户输入的数据包含敏感数据,那么还是使用 POST 为好。

2. requests库

爬虫中很重要的一个库就是requests库,该库能够完全代替Python自带的urllib库,且使用起来更加简单高效。

2.1 GET请求

GET请求我们可以拿百度来进行尝试。

从网址搜索后百度的网址可以看出来,我们的搜索信息都在网址后面,使用的是 wd=关键词 的形式,比如下面我搜索requests后,百度的网页显示如下:

在这里插入图片描述
这里的 wd 明显与我们搜索的关键词一致,因此,我们只需要拼接后即可进行搜索。

为了防止其进行反爬,我们需要模拟用户请求,即将网站请求头的一些信息加入到我们的requests请求中,网站的请求头信息可以按F12在Network中筛选Fetch/XHR找到。
在这里插入图片描述
当然,这里面并不是每个请求头都有用,起最大作用的是 user-agent 以及 Cookie 请求头。

代码如下:

import requests

# 在使用requests库时,可以不用在后面加?,其会自动添加
url = 'https://www.baidu.com/s'
data = {
    'wd': '背景'
}
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36',
    'Cookie': 'ORIGIN=2; ISSW=1; ISSW=1; BIDUPSID=F58D6799C8D928D5A89BE0274671EFA6; BD_UPN=12314753; BAIDUID=86EC4A79A69BC30551F1FD13B3AE7BA2:FG=1; PSTM=1662961767; BDUSS=JUbDcySUhQfjMtelJzYzd5cX5Kby1vfmFCMnFZWTBCTU10cnJ2SVBLbzJTRTlqRVFBQUFBJCQAAAAAAAAAAAEAAABcBQRhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADa7J2M2uydjN3; BDUSS_BFESS=JUbDcySUhQfjMtelJzYzd5cX5Kby1vfmFCMnFZWTBCTU10cnJ2SVBLbzJTRTlqRVFBQUFBJCQAAAAAAAAAAAEAAABcBQRhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADa7J2M2uydjN3; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; H_PS_PSSID=26350; BAIDUID_BFESS=86EC4A79A69BC30551F1FD13B3AE7BA2:FG=1; delPer=0; BD_CK_SAM=1; PSINO=1; BA_HECTOR=852gak0l80a4a10h848k817d1hr74qv1i; ZFY=jgTOVcYL:Bdg0DHAbUhXQBWwwekSdsO0e3M8I:AuGvUec:C; B64_BOT=1; channel=baidusearch; baikeVisitId=31de3916-22bc-4816-a9ab-4ebe4d94b9b2; COOKIE_SESSION=321_0_2_3_12_1_1_0_2_1_18_0_3221_0_0_0_1672670956_0_1672713052|9#0_1_1671682412|1; H_PS_645EC=5e1ejfIQh/o7iHoCJqcOElbwpqojGL7pDiZ4mELA5If6tWQt/KbIX56pKTgD5GbedAlsG2DnInR7; WWW_ST=1672713491580'
}
response = requests.get(url, params=data, headers=headers)
print(response.text)

2.2 POST请求

这里我们寻找一个post请求的网页,百度翻译来进行讲解。

百度翻译肯定有一个请求是向服务器请求翻译的,我们只需要将其找出来,然后吧URL记录下来即可进行爬取。
在这里插入图片描述
在这里插入图片描述
通过我们一个单词一个单词的输入,我们可以发现,百度翻译的sug网页传递的就是我们的翻译请求的单词。然后复制下来该网页的Cookie值以及user-agent值到请求头,代码如下:

import requests
import json

url = 'https://fanyi.baidu.com/sug'

data = {
    'kw': 'what'
}

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36',
    'Cookie': 'BIDUPSID=F58D6799C8D928D5A89BE0274671EFA6; BAIDUID=86EC4A79A69BC30551F1FD13B3AE7BA2:FG=1; PSTM=1662961767; APPGUIDE_10_0_2=1; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; BDUSS=JUbDcySUhQfjMtelJzYzd5cX5Kby1vfmFCMnFZWTBCTU10cnJ2SVBLbzJTRTlqRVFBQUFBJCQAAAAAAAAAAAEAAABcBQRhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADa7J2M2uydjN3; BDUSS_BFESS=JUbDcySUhQfjMtelJzYzd5cX5Kby1vfmFCMnFZWTBCTU10cnJ2SVBLbzJTRTlqRVFBQUFBJCQAAAAAAAAAAAEAAABcBQRhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADa7J2M2uydjN3; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; H_PS_PSSID=26350; BAIDUID_BFESS=86EC4A79A69BC30551F1FD13B3AE7BA2:FG=1; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1672137088,1672154361,1672228903,1672714258; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1672714258; ab_sr=1.0.1_ZDgwZDczYmJmYmZlNGYxNGQ4MmE3M2Y5ODljNDhlNzI2ZWI4YmQ5MWZjOGZmZTUxYTcyMWUzOTIyMjc0Y2ZmMDM3MzRmMjVlMDgxYTRjOTBjYjVhNWU0YTgzNjA3OWZmMThiODNjYjUxM2RiM2EwZGVjZWIxNzllMzdhZDdkMGE4OTAxOTk1NTBmOGJhMjE2MzE0Nzc3ZjdkNzYyMGZiODVmYTAxMjE2ZDcyNTM4M2Y0ODkzMzI4NWM1NzMzZmRi'
}

response = requests.post(url, data=data, headers=headers)
# response.text 传递回来的编码有问题,需要用json将其转为‘utf-8’
obj = json.loads(response.text)
print(obj)

2.3 代理

代理需要一个能用的IP,这样如果你的IP被网站封了,那么使用代理后网站那么就会显示你使用的是代理后的IP进行请求,就不会拒绝访问。由于免费代理不太靠谱,我又不想花钱,这里我就给大家演示个模板吧。

import requests

# 在使用requests库时,可以不用在后面加?,其会自动添加
url = 'https://www.baidu.com/s'
data = {
    'wd': '背景'
}
headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36',
    'Cookie': 'ORIGIN=2; ISSW=1; ISSW=1; BIDUPSID=F58D6799C8D928D5A89BE0274671EFA6; BD_UPN=12314753; BAIDUID=86EC4A79A69BC30551F1FD13B3AE7BA2:FG=1; PSTM=1662961767; BDUSS=JUbDcySUhQfjMtelJzYzd5cX5Kby1vfmFCMnFZWTBCTU10cnJ2SVBLbzJTRTlqRVFBQUFBJCQAAAAAAAAAAAEAAABcBQRhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADa7J2M2uydjN3; BDUSS_BFESS=JUbDcySUhQfjMtelJzYzd5cX5Kby1vfmFCMnFZWTBCTU10cnJ2SVBLbzJTRTlqRVFBQUFBJCQAAAAAAAAAAAEAAABcBQRhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADa7J2M2uydjN3; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; H_PS_PSSID=26350; BAIDUID_BFESS=86EC4A79A69BC30551F1FD13B3AE7BA2:FG=1; delPer=0; BD_CK_SAM=1; PSINO=1; BA_HECTOR=852gak0l80a4a10h848k817d1hr74qv1i; ZFY=jgTOVcYL:Bdg0DHAbUhXQBWwwekSdsO0e3M8I:AuGvUec:C; B64_BOT=1; channel=baidusearch; baikeVisitId=31de3916-22bc-4816-a9ab-4ebe4d94b9b2; COOKIE_SESSION=321_0_2_3_12_1_1_0_2_1_18_0_3221_0_0_0_1672670956_0_1672713052|9#0_1_1671682412|1; H_PS_645EC=5e1ejfIQh/o7iHoCJqcOElbwpqojGL7pDiZ4mELA5If6tWQt/KbIX56pKTgD5GbedAlsG2DnInR7; WWW_ST=1672713491580'
}
# 设置代理
proxy = {
    'http': '212.129.251.56:16896'
}
# 将代理放入请求
response = requests.get(url, params=data, headers=headers, proxies=proxy)
print(response.text)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/400435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

哪种类型蓝牙耳机佩戴最舒服?舒适度最好的蓝牙耳机推荐

如果您想在外出时听自己喜欢的音乐,您需要佩戴耳机,当前的耳机都足够小,可以将它们放在口袋里,即使它们在充电盒中也是如此,舒适度一直都是人们所追求的,舒适之余,佩戴同样稳固更加令人安心&…

ASEMI高压MOS管7N65参数,7N65图片,7N65大小

编辑-Z ASEMI高压MOS管7N65参数: 型号:7N65 漏极-源极电压(VDS):650V 栅源电压(VGS):30V 漏极电流(ID):7A 功耗(PD)…

中文数字对照表--课后程序(Python程序开发案例教程-黑马程序员编著-第4章-课后作业)

实例5:中文数字对照表 阿拉伯数字因其具有简单易写、方便使用的特点成为了最流行的数字书写方式,但在使用阿拉伯数字计数时,可以对某些数字不漏痕迹的修改成其它数字,例如,将数字“1”修改为数字“7”,将数…

Excel·VBA矩阵、求逆矩阵、解线性方程组

初等变换法求逆矩阵 vba内置函数MInverse可以计算矩阵的逆矩阵,《Office VBA 参考-WorksheetFunction.MInverse 方法 (Excel)》 初等变换法代码思路 对于一个3x3矩阵(下图3x3红色部分)右侧扩充单位矩阵(下图3x3黑色部分&#xf…

海格里斯HEGERLS料箱穿梭车生产厂家|配有高速货物提升机滚筒输送线设备的料箱四向穿梭车立体库

随着物流自动化需求的增中和自动化料箱数量的增加,现在市场对料箱四向穿梭车系统的需求正在逐渐增加,这也使得四向穿梭车在储物效率和储物空间利用率方面的优势的更加突出,其应用场景也在不断扩大。料箱四向穿梭车仓储方案已成为一种高效、智…

svg的深度利用绕过waf

目录 DOM树的构建 源码 img失败的原因 解法一 --- svg成功的原因 触发流程 实验 解法二 --- details标签 事件触发流程 实验验证 总结 首先在解这道题的开始连了解下什么是DOM树,以及DOM树的构建 DOM树的构建 我们知道JS是通过DOM接口来操作文档的&…

针对博客系统的自动化测试

针对博客系统进行web自动化测试 文章目录针对博客系统进行web自动化测试引入依赖创建出合适的目录结构AutoTestUtilsBlogLoginTestBlogListTestBLogEditTestBlogDetailTest使用套件执行关于博客系统的自动化测试的源代码已经上传至gitee链接 引入依赖 首先在pom.xml上导入依赖…

【错误记录】映射文件发生改变

遇到映射文件发生改变在项目中有的地方是使用反射机制进行的操作,可能对于类进行了某些更改,科室映射文件没有更改,采用匿名就会出现这样的问题,解决办法要么更改映射文件,要不不要使用匿名调用。JavaDocs路径报红Clas…

ruoyi-vue-plus学习2(异步日志)(@EventListener)(@Async)(线程池池相关)

ruoyi-vue-plus的日志打印是通过监听器实现的,和原版若依稍稍不同 找到登录时记录日志的方法 该方法如下 这里的参数LogininforEvent为消息类,注意,貌似高版本的spring定义消息类不需要继承ApplicationEvent类也行。直接使用普通实体类就行…

详解-序列化和反序列化

文章目录问题使用场景序列化协议TCP/IP 4 层模型的哪一层?序列化协议问题 什么是序列化和反序列化? Java对象保存在文件中/网络传输Java对象,这些场景需要用到序列化。 序列化:将Java对象或数据结构转化成二进制流反序列化:将二…

Git简单使用

Git简单使用 git初始化操作 pwd&#xff1a;显示当前目录 git init&#xff1a;把这个目录变成git可以管理的仓库 git clone&#xff1a; 从现有 Git 仓库中拷贝项目&#xff08;类似 svn checkout&#xff09;。 克隆仓库的命令格式为&#xff1a; git clone <repo&g…

【Java基础 下】 031 -- 反射 动态代理

一、什么是反射&#xff1f; 换句话说就是&#xff08;从类里拿出来&#xff09; 可以获取到&#xff1a;&#xff08;利用反射&#xff0c;我们可以获取到类中所有的东西&#xff09; 获取是先从class字节码文件中获取的 二、获取class对象的三种方式 三种方式也对应了三种阶段…

Unity之Addressable使用注意事项

基本设置 Profile文件中配置资源构建路径和资源首次加载路径&#xff0c;资源如何设置了缓存&#xff0c;在首次加载之后会将再用缓存在缓存目录&#xff0c;后面将直接从缓存目录中读取&#xff0c;RemoteLoadPath一般要设置成可以动态修改类型的参数&#xff0c;方便项目发包…

[oeasy]python0104_指示灯_显示_LED_辉光管_霓虹灯

编码进化 回忆上次内容 x86、arm、riscv等基础架构 都是二进制的包括各种数据、指令 但是我们接触到的东西 都是屏幕显示出来的字符 计算机 显示出来的 一个个具体的字型 计算机中用来展示的字型 究竟是 如何进化的 呢&#xff1f;&#x1f914;&#x1f914; 模拟电路时…

在线客服机器人是什么?有什么用处?

在线客服机器人是客服自动智能问答 真人模拟应答以及意向分类 高效低成本可以同时进行一对多服务&#xff0c;而在一些情况下&#xff0c;在线客服机器人还可以进行客户接待&#xff0c;完全代替人工客服&#xff0c;提高整个客服中心的接待量。在这里我们拿ttkefu在线机器人为…

Spring学习——Maven进阶

分模块开发与设计 创建模块 书写模块代码 通过maven指令安装模块到本地仓库(install指令) 在pom.xml中导入坐标执行maven的install命令将模块安装到本地maven仓库 团队内部开发可以发布模块功能到团队内部可共享的仓库中&#xff08;私服) 依赖管理 依赖指当前项目运行所需…

JAVA SE:多线程

一、线程简介多任务&#xff0c;看似同时在做&#xff0c;实际上同一时间只做一件事多线程&#xff0c;相当于路上多加一条车道普通方法vs多线程&#xff1a; 程序、进程、线程&#xff1a;程序&#xff1a;静态的概念&#xff0c;程序和数据的有序集合进程&#xff1a;操作系统…

CleanMyMac X4.20最新Mac系统垃圾清理工具

CleanMyMac X是一款Mac系统垃圾清理工具,可以清除Mac系统多余的语言包、系统缓存、应用程序、PowerPc软件运行库等,是硬盘瘦身的好工具。在面对一款多功能型的软件时&#xff0c;复杂的操作面板是最容易让人头疼的&#xff0c;好在 CleanMyMac 一直以来都原生支持简体中文语言&…

python第五天作业~基础练习

目录 求十进制数字9的二进制编码&#xff1a; 求十进制数字9的二进制编码中的1的数量&#xff1a; 作业15&#xff1a;求1~100之间不能被3整除的数之和 作业16&#xff1a;给定一个正整数N,找出1到N&#xff08;含&#xff09;之间所有质数的总和 作业19&#xff1a;计算PI&…

为什么那么多人转行编程都首选Java

计算机专业通常从C语言开始学&#xff0c;非计算机专业想要转行编程首选Java的主要原因&#xff1a;市场需求量大。Java可以用于开发各种应用程序&#xff0c;包括企业级Web应用程序、移动应用程序、桌面应用程序、游戏、嵌入式系统、云基础设施等等。在游戏领域也有两大经典游…