爬虫基本原理

一、爬虫的原理

爬虫是什么?把互联网上的数据,抓取下来,存到自己的本地。

以百度为例,爬取一个个的网页,存到自己库中,当我们搜索的时候,去百度的数据库中搜索,显示在前端,点击某个页面,直接跳转到真正的地址。

基本原理:
发送http请求(requests)---->返回数据----->解析数据(数据清洗,bs4,re…)---->入库(文件,excel,mysql,redis,mongodb)

注:
爬取数据时,如果被禁止了,一定是你模拟的不像。

爬虫协议:
每个网站,都有爬虫协议,规定了哪些允许你爬,哪些不允许你爬(君子协议)
robots.txt---->只是一个协议

反爬:

  • 验证码
  • 封ip
  • 封账号
  • js逆向:js比较不错
  • app爬取:加密
  • app逆向:java,动态调试so文件---->汇编

爬虫所需工具:
请求库:requests,selenium
解析库:正则,beautifulsoup,pyquery
存储库:文件,MySQL,Mongodb,Redis

爬虫常用框架:
scrapy

二、请求库requests基本使用

模拟发送http请求(只要http请求有的东西,都可以使用requests发送出去)。
python内置的urllib2、urllib3,不太好用,用起来比较麻烦。

大神基于urllib3封装了requests,python界非常出名的第三方库,只能发送http请求,不能解析;
又封装了一个requets-html库,把request和解析库封装到一起了。

安装:pip3 install requests

1.基本使用

import requests# res对象中会有,响应体,响应头,cookie。。。。
# 请求头中带User-Agent,是客户端类型
# 加入请求头
res = requests.get('https://dig.chouti.com/',headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
})
print(res.text) # 响应体,转成了字符串
with open('a.html','w',encoding='utf-8') as f:f.write(res.text)# 另外一种使用
requests.request('post',cookies={})

2.带参数的GET请求

# 方式一:get请求参数,直接拼接在路径中
response = requests.get('https://www.baidu.com/s?wd=美女',headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36',})
with open('baidu.html', 'w', encoding='utf-8') as f:f.write(response.text)# 方式二:使用params参数
response = requests.get('https://www.baidu.com/s',params={'wd': '帅哥'},headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36',})
with open('baidu.html', 'w', encoding='utf-8') as f:f.write(response.text)

3.带参数的GET请求(headers)

import requests# res对象中会有,响应体,响应头,cookie。。。。
# 请求头中带User-Agent,是客户端类型
# referer:上一次请求的地址,做图片防盗链
# cookie:cookie信息
# 加入请求头
header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36','referer':'https://www.lagou.com/wn/zhaopin'
}
res = requests.get('https://www.lagou.com/gongsi/',headers=header)
print(res.text) # 响应体,转成了字符串

referer:比如向这个图片地址发请求,会有referer,检测referer是不是这个网站的,不是则禁止。

4.带参数的GET请求(cookies)

# 方式一:带在请求头中
header={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36','cookie':'deviceId=web.eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqaWQiOiIwZmVlMjk5OS1iMDgzLTRmYzctOTM4MC03YjIzZmVmY2U5YmYiLCJleHBpcmUiOiIxNjIzOTA0ODk5MzM5In0.7cadtBYznS6OgnLwEF8aH0AmtDOoYB1WKDgdU4eYYS0; __snaker__id=VbChmBUEZIVY3FPa; _9755xjdesxxd_=32; YD00000980905869%3AWM_TID=%2FazmF9%2FrClJFEVFBVRN70z7msH6De39Y; Hm_lvt_03b2668f8e8699e91d479d62bc7630f1=1631674964,1634180671,1634183906; gdxidpyhxdE=SmmnuyrMOQB%2B9hzOlIaMPx0O9ZJbqWBllx7aa1OTmRwgGymo94mTYgZ0DrUWw7tfx8qIZmRt01BbIVX2jIc30jqSzPWznXpll6kBokS56266%2FmPg%2BC%5CvNV%2BJhO%5C9ln%2FQdskmo%2FH5A%2BLOADRDACtDp59%5CH51jexwMSIXSA9atTxuJDXOn%3A1634184810108; YD00000980905869%3AWM_NI=WlPwT2GigeoAGFNAH66LZluq3E87sk7E%2Bn6YtGANtE0G%2Bke2f0x6a1rG8kACozd%2FrWBXr3ne%2FBnps6fdDDeTm052UXP1VES3VxQISaL9zd91nvo%2FON%2FVuXS9INJSQYS%2FOG8%3D; YD00000980905869%3AWM_NIKE=9ca17ae2e6ffcda170e2e6ee97c96aadeda38de27286ef8bb3d45a828f8babae8095aea8d0b47e9191e186c42af0fea7c3b92a95b4a098d73a85b7a986ee4b859a82a2cb3ef694968df87bf19bf8d8f261f59be58fb553b8998faff74ff499e58ce83aa6f0b8d7e43bb299f88cc449ada6acd0f15d8288bed4ed6fed9ea291f23ea6bc8ca5e860aff0fbd3d85494ef9aa6d23996a89faad26b90e7b685bc3baeaaa1d0ce46ed8abbb9d2338b9286b4d45391f181a8bb37e2a3; token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqaWQiOiJjZHVfNTMyMDcwNzg0NjAiLCJleHBpcmUiOiIxNjM2Nzc1OTIyMTI2In0.o5-Y9-USxFog5sdo1WR1WORUzPkUD4fozEVA_f0WSHU; Hm_lpvt_03b2668f8e8699e91d479d62bc7630f1=1634183939'
}
# post请求,携带在请求体中的数据
res=requests.post('https://dig.chouti.com/link/vote',data={'linkId': '32667354'},headers=header)
#https://dig.chouti.com/link/cancel/vote
print(res.text)# 方式二:直接以参数形式传入,cookie会经常用,而且一般是字典形式,提供了一个cookie参数
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36',
}
# cookies需要是:Dict or CookieJar object
res = requests.post('https://dig.chouti.com/link/vote', data={'linkId': '32667354'}, headers=header,cookies={})
print(res.text)

5.POST请求

# 发送post请求,模拟浏览器的登录行为
header = {'Referer': 'http://www.aa7a.cn/user.php?&ref=http%3A%2F%2Fwww.aa7a.cn%2F','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}
res = requests.post('http://www.aa7a.cn/user.php', headers=header, data={'username': 'xxx@qq.com','password': 'xxx','captcha': 'fmd8','remember': 1,'ref': 'http://www.aa7a.cn/','act': 'act_login',
})# 获取到cookie,登陆过后的cookie
cookie = res.cookies
print(cookie)  # CookieJarres1 = requests.get('http://www.aa7a.cn/', headers=header, cookies=cookie)
# res1=requests.get('http://www.aa7a.cn/',headers=header)
print('xxx@qq.com' in res1.text)

6.响应Response

import requests
respone=requests.get('http://www.360buy.com')
# respone属性
print(respone.text)   # body的内容转成str类型
print(respone.content) # body的二进制内容 (图片,视频)print(respone.status_code) # 响应状态码
print(respone.headers)    # 响应头
print(respone.cookies)    # 把响应的cookie转成了cookiejar的对象
print(respone.cookies.get_dict()) # 把cookiejar的对象转成字典
print(respone.cookies.items()) # key和valueprint(respone.url)          # 请求的地址
print(respone.history)       # 请求历史,重定向,才有数据,列表print(respone.encoding)   # 响应的编码格式response.iter_content()  #循环它,如果是视频,一点一点保存

解析json(http请求返回的数据是json格式):
res.text是json字符串,取值不好取,需要json.loads(res.text)转成字典,再取值
直接res.json()转成json后的字典形式

import requestsres = requests.post('http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword', data={'cname': '','pid': '','keyword': '上海','pageIndex': 1,'pageSize': 10,
})# print(res.text)
print(type(res.json()))

7.编码问题
url编码问题 把中文用url编码,把url编码解成中文

# https://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3
from urllib import parse
# 把中文用url编码,
res=parse.quote('美女')
print(res)# 把url编码解成中文
res=parse.unquote('%E7%BE%8E%E5%A5%B3')
print(res)

网站编码,不是utf-8,使用res.text默认用utf-8转,可能出乱码

import requests
res=requests.get('')
# res.encoding='GBK'
res.encoding=res.apparent_encoding
print(res.text)

8.获取二进制数据
视频、图片需要保存二进制

import requests
res=requests.get('https://img.lianzhixiu.com/uploads/allimg/202001/9999/a7b0199df8.jpg')with open('致命诱惑2.png','wb') as f:# f.write(res.content)for line in res.iter_content(1024):f.write(line)

9.request.session的使用

import requestssession = requests.session()  # 可以帮咱们保持cookie,以后不用手动携带header = {'Referer': 'http://www.aa7a.cn/user.php?&ref=http%3A%2F%2Fwww.aa7a.cn%2F','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}
res = session.post('http://www.aa7a.cn/user.php', headers=header, data={'username': 'xxx@qq.com','password': 'xxx','captcha': 'fmd8','remember': 1,'ref': 'http://www.aa7a.cn/','act': 'act_login',
})# 获取到cookie,登陆过后的cookie
# cookie=res.cookies
# print(cookie)  # CookieJarres1 = session.get('http://www.aa7a.cn/', headers=header)print('xxx@qq.com' in res1.text)

补充:
什么是正向代理,什么是反向代理?

  • 正向代理,隐藏客户端
    翻墙软件

  • 反向代理,隐藏服务器
    nginx 是一个反向代理服务器

正向代理---->买票的黄牛
反向代理---->租房的代理

总结:
1 爬虫介绍

  • 模拟发送http请求---->获取到数据(html,json,图片,视频)---->数据清洗---->入库

2 请求库:requests模块

  • 跟其他服务交互,使用requests模块
  • postman:完全自己写,使用requests写

3 发送get请求

4 发送get请求,地址中带参数

  • 直接拼在路径中
  • params参数传入,字典
  • url编码和解码:中文编成url的编码形式

5 发送get请求,携带请求头

  • headers参数
  • user-agent:客户端类型
  • referer:上一个地址

6 发送请求,携带cookie
请求头
以参数形式携带

7 发送post请求

  • 地址中带数据:params参数传入
  • 请求头中带:headers
  • 请求体中:data={},json={}

8 Respons对象属性,参数

  • text:响应的body体,转成了字符串
  • content:响应体的二进制(图片,视频)
  • iter_content:图片,视频,循环保存
  • 编码
  • cookies:一旦登录成功,这个cookies就是认证后的cookies
  • json() :把返回的json格式字符串直接转成字典形式

9 编码问题

10 request.session的使用

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

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

相关文章

【K8S系列】深入解析K8S调度

序言 做一件事并不难,难的是在于坚持。坚持一下也不难,难的是坚持到底。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记论点蓝色:用来标记论点 Kubernetes (k8s) 是一个容器编…

基于springboot的智慧养老系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

面部识别技术VS其他生物识别技术:哪种更安全、更准确、更可靠?

面部识别技术是一种生物识别技术,通过分析人脸特征,识别和验证个体身份。与其他生物识别技术相比,面部识别技术具有一些独特的优点和局限性。下面将从技术原理、应用场景、准确性、安全性、可用性等方面,对面部识别技术与其他生物…

【云原生】Init 容器

Init 容器 v ljx97609760 一起沟通学习 Init 容器是一种特殊容器,在 Pod 内的应用容器启动之前运行。Init 容器可以包括一些应用镜像中不存在的实用工具和安装脚本 理解 Init 容器 每个 Pod 中可以包含多个容器, 应用运行在这些容器里面,…

centos磁盘挂载

通常情况下,云平台开出来的服务器只有默认的系统盘,而数据盘需要运维人员自己挂载在数据目录,此篇记录centos磁盘挂载的过程,以便今后遇到类似情况便于查看。 系统版本:centos7.9 1、查看磁盘情况: [root…

数学建模学习之简单设备分配问题

简单的设备分配问题 某公司新购置了某种设备 6台,欲分配给下属的4 个企业,已知各企业获得这种设备后年创利润如表 1.1 所示,单位为千万元。问应如何分配这些设备能使年创总利润最大,最大利润是多少? 表1.1的数据为: 对…

Go 微服务开发框架 DMicro 的设计思路

Go 微服务开发框架 DMicro 的设计思路 DMicro 源码地址: Gitee:dmicro: dmicro是一个高效、可扩展且简单易用的微服务框架。包含drpc,dserver等 背景 DMicro 诞生的背景,是因为我写了 10 来年的 PHP,想在公司内部推广 Go, 公司内部的组件及 rpc 协议…

Webpack5开发模式选择

Webpack 5 是一款强大的模块打包工具,可用于将许多分散的模块按照依赖关系打包成一个(或多个)bundle。在Webpack 5中,主要有两种开发模式,分别是开发模式(development)和生产模式(pr…

LeetCode 142.环形链表II

142. 环形链表 II - 力扣(LeetCode) /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode *detectCycle(ListNode …

4.日志分布式-ELK

文章目录 日志分布式-ELK概念可以添加的其它组件filebeat 结合 logstash 带来好处为什么要使用 ELK缓存和Fluentd完整日志系统基本特征ELK 的工作原理 部署Elasticsearchjdk环境和防火墙配置安装Elasticsearch修改配置文件优化内存参数启动程序并测试效果安装 Elasticsearch-he…

leetcode-344. 反转字符串

leetcode-344. 反转字符串 文章目录 leetcode-344. 反转字符串一.题目描述二.第1次提交(std::reverse)三.第2次提交(左右指针)四.第3次提交(左右指针,swap函数)五.第4次提交(左右指针) 一.题目描述 二.第1次提交(std::reverse) class Solution {public:void revers…

常用数字电路模块:计数器与分频器(一)

本文介绍常见的电路——计数器,方便后续讲解分频电路。 一、计数器 (1)计数器代码   计数器,顾名思义就是在时钟的节拍下进行计数,一个简单的N位计数器的代码如下所示,这个计数器从0计数到2N -1&#x…

python爬虫

一.爬虫介绍 1.什么是爬虫 爬虫(Spider),也被称为网络爬虫或网络蜘蛛,是一种自动化程序,用于在互联网上浏览和提取信息。爬虫通过模拟人类用户访问网页的行为,从网页中提取数据并将其存储或进行进一步处理…

ubuntu freeradius 3.0 + mariadb

安装数据库及Radius sudo apt update sudo apt install -y freeradius freeradius-mysql freeradius-utils mariadb-server mariadb-client# sudo mysql_secure_installationNOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDBSERVERS IN PRODUCTION USE…

Springboot启用HTTP响应压缩

官方文档:https://docs.spring.io/spring-boot/docs/2.3.12.RELEASE/reference/htmlsingle/#how-to-enable-http-response-compression

mmc记录

1、获取csd,也就是DSR寄存器 说是应该可以获取块长度、卡存储容量等,但是在8953上,没看到这个日志 参考: 一、有6个主要的和寄存器 1、OCR寄存器 描述了存储卡的Vdd电压描述 ,总共32Bit Bit31 --- 卡上电状态位&…

赋能智能智造-RK3568智能主板助力机器人产业高速发展

机器人作为现代制造业的重要一环,正在以惊人的速度推动着生产效率和智能化水平的提升,它们在生产线上的准确操作和高效工作,为企业带来了巨大的竞争优势。关于工业机器人的编程和控制技术,在过去几年中已经有了很多发展和新的应用…

计算机网络——物理层

物理层 物理层是计算机网络体系结构中的底层层级,负责处理计算机与物理传输媒介之间的接口和通信细节。它主要关注如何在物理媒介上传输原始比特流,并确保数据能够可靠地从发送方传输到接收方。 物理层的主要任务包括: 传输介质&#xff1a…

谷歌Bard入门指南

文章目录 谷歌Bard入门指南一、简介二、使用指南三、中文化3.1 中文提问3.2 中文回答 四、Hello Game五、亮点 谷歌Bard入门指南 一、简介 Bard 是一个大型语言模型,也称为对话式 AI 或聊天机器人,经过训练,内容丰富且全面。Bard 接受过大量…

无线基站与无线频谱资源

文章目录 基站的主要组成天线馈线(电缆线)RRU(射频拉远单元,Remote Radio Unit)BBU(室内基带处理单元,Building Base band Unit)AAU(有源天线单元,Active Ant…