爬虫入门一

news2024/11/26 14:49:45

文章目录

  • 一、什么是爬虫?
  • 二、爬虫基本流程
  • 三、requests模块介绍
  • 四、requests模块发送Get请求
  • 五、Get请求携带参数
  • 六、携带请求头
  • 七、发送post请求
  • 八、携带cookie
    • 方式一:放在请求头中
    • 方式二:放在cookie参数中
  • 九、post请求携带参数
  • 十、模拟登录
    • 方式一
    • 方式二
  • 十一、session对象
  • 十二、响应response对象
  • 十三、下载图片
  • 十四、ssl认证
  • 十五、超时设置,异常处理,上传文件
  • 十六、使用代理

一、什么是爬虫?

爬虫就是程序从互联网中各个网站上爬取数据,做数据清洗再入库。

本质原理

从技术层面来说就是:通过程序模拟浏览器请求站点的行为,把站点返回的HTML代码/JSON数据/二进制数据(图片、视频等)爬取到本地,进而提取自己需要的数据,存放起来使用

通俗的说就是:通过模拟发送http请求从而去别人的服务端获取数据,然后把获取的数据入库

爬虫是否合法?

爬虫有爬虫协议(是一个君子协议):每个网站根路径下都有robots.txt,这个文件规定了该网站,哪些可以爬取,哪些不能爬取

在这里插入图片描述

SEO与SEM的区别和联系

二、爬虫基本流程

用户获取网络数据的方式:

  1. 方式1:浏览器提交请求—>下载网页代码—>解析成页面
  2. 方式2:模拟浏览器发送请求(获取网页代码)—>提取有用的数据—>存放到数据库或文件中

而爬虫就是使用 方式2来实现的

在这里插入图片描述

	1.发起请求(模拟发送http请求)
		使用http库向目标站点发送请求,即发送一个request请求
		request包含:请求头、请求体等
		需要使用到爬虫模块
			1.reqeusts模块
			2.selenium
			'网页反扒:封id:ip代理,封账号:cookie池'
			
	2.获取响应内容
		如果服务器能正常响应,则会得到一个Response
		Response包含:html,json,图片,视频等
		
	3.解析数据内容
		解析html数据:正则表达式(RE模块),第三方解析库如Beautifulsoup,pyquery等
		解析json数据:json模块
		解析二进制数据:以wb的方式写入文件
	
	4.保存数据(数据入库)
		数据库(MySQL,Mongdb、Redis)
		文件中

三、requests模块介绍

使用python如何向网页发送http请求,本质是requests模块,封装了python内置模块urllib,使用requests可以模拟浏览器的请求(http),比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3)

requests库发送请求将网页内容下载下来以后,并不会执行js代码,这需要我们自己分析目标站点然后发起新的request请求

安装reqeusts模块

	pip install requests

四、requests模块发送Get请求

	import requests

	res = requests.get('https://www.cnblogs.com/')
	# print(res)  # <Response [200]>
	print(res.text)  # http响应体文本内容
	
	'''如果有的网站,发送请求后,不返回数据或者拦截,这是别人做了反扒'''
	# http请求:请求头中没带东西,没带cookie,客户端类型,referer....
	res = requests.get('https://dig.chouti.com/')
	print(res.text)

五、Get请求携带参数

	import requests
	'方式一:直接拼到路径中'
	res = requests.get('https://www.baidu.com?info=jack')
	print(res.url)  # https://www.baidu.com/?info=jack
	
	'方式二:使用params参数携带'
	res = requests.get('https://www.baidu.com',params={'info':'jack','age':19})
	print(res.url) #https://www.baidu.com/?info=jack&age=19

	# print(res.text) # 响应体内容

URL编码与解码

	'从地址栏里拿出数据 都会被URL进行编码和解码'
	from urllib.parse import quote,unquote   # 内置模块
	info = quote('上海')  # 编码
	print(info)  # %E4%B8%8A%E6%B5%B7
	info1 = unquote('%E4%B8%8A%E6%B5%B7')  # 解码
	print(info1)  # 上海

六、携带请求头

http请求中,请求头中有一个很重要的参数 :User-Agent,如果向后端发送请求没有带这个请求头,后端就禁止访问。大多网站没有携带该参数就被禁止了。

用户代理(User Agent,简称 UA),是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

	import requests
	headers = {
	    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
	}
	res = requests.get('https://dig.chouti.com/',headers=headers)
	'''
	def request(method, url, **kwargs):
	    :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`.
	'''
	print(res.text)
	'User-Agent:客户端类型:有浏览器、手机端浏览器、爬虫类型,程序,scrapy一般伪造成浏览器'

我们去爬某个网站,发送请求不能正常返回数据,说明模拟的不够像,需要携带参数,只要参数对应上就能返回相应的数据。

一般网站可以通过Referer来做反扒如果要登录,模拟向登录接口发请求,正常操作必须在登录页面上才能干这事。如果没有携带referer,它就认为你是恶意的就会拒绝。

七、发送post请求

	import requests
	headers = {
	    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',
	    'Cookie':'iJ9flkdsjaxxxx=...'
	}
	data = {'linkId':'41569712',}  # 发送请求携带的文章id
	res = requests.post('https://dig.chouti.com/link/vote',headers=headers,data=data)
	print(res.text)  # {"data":4,"code":200,"success":true}

八、携带cookie

方式一:放在请求头中

	'模拟抽屉网点赞信息'
	import requests
	'''
	是否登录---》有个标志
	 1 前后端混合项目---》登录信息-->放在cookie中了
	 2 前后端分离项目---》登录信息--》后端规定的--》放在请求头的
	'''
	headers = {
	    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',
	    'Cookie':'deviceId=web.eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9flkdsjaxxxx=...'
	}
	data = {'linkId':'41569712',}  # 发送请求携带的文章id
	res = requests.post('https://dig.chouti.com/link/vote',headers=headers,data=data)
	print(res.text)  # {"data":4,"code":200,"success":true}

方式二:放在cookie参数中

	通过cookie参数:因为cookie很特殊,一般都需要携带,模块把cookie单独抽取成一个参数,是字典类型,以后可以通过参数传入
	headers = {
	    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',
	}
	data = {'linkId':'41569712',}  # 发送请求携带的文章id
	cookie = {
		'token':'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9xxxxx'
	}  # cookies格式都是字典格式 按照输入即可
	res = requests.post('https://dig.chouti.com/link/vote',headers=headers,data=data,cookies=cookie)
	print(res.text)  # {"data":5,"code":200,"success":true}

九、post请求携带参数

	import requests
	'''post请求:三种编码方式:json、Urlencoded、form-data'''
	'方式一:data参数'
	# 咱们以data字典形式携带,它使用的Urlencoded编码,最终编码为name=jack&age=19,然后放在请求体中
	':param data: (optional) Dictionary, list of tuples, bytes, or file-like'
	\res = requests.post('地址',data={'name':'jack','age':19})
	# res = requests.post('地址',data=b'name=jack&age=19')
	
	'方式二:json编码'
	# 咱们以json字典形式携带,它使用的json编码,最终编码为{'name':'jack','age':19},然后放在请求体中
	':param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`'
	res = requests.post('地址',json={'name':'jack','age':19})

十、模拟登录

方式一

	先发送错误登录请求 看返回数据是否对错 输入对的密码 获取cookie 通过Cookie登录
	import requests
	data = {
	    'username': 'jack',
	    'password': '123',
	    'captcha': '111',
	    'remember': '1',
	    'ref': 'http://www.aa7a.cn/',  # 登录成功重定向到这个地址
	    'act': 'act_login'
	}
	res = requests.post('http://www.aa7a.cn/user.php',data=data)
	print(res.text)  # {"error":5}
	print(res.cookies)  # RequestsCookieJar对象响应头中得cookie,如果正常登录,这个cookie,就是登录后的cookie
	
	res1 = requests.get('http://www.aa7a.cn/',cookies=res.cookies)  # 访问首页,携带cookie
	print('jack' in res.text)

方式二

	data = {
	    'username': 'xxxxx',
	    'password': 'xxxxx',   # 错误的 请求码是 error 5 正确的是0
	    'captcha': 'cccc',
	    'remember': 1,
	    'ref': 'http://www.aa7a.cn/',
	    'act': 'act_login'
	}
	res = requests.post('http://www.aa7a.cn/user.php', json= {"key": "Value"})

十一、session对象

	# http 请求,每次都是一个新的---》cookie需要自己处理携带
	# session可以自动处理cookie,不需要手动携带了
	import requests
	session=requests.session()
	data = {
	    'username': 'jack',
	    'password': '123',
	    'captcha': '111',
	    'remember': '1',
	    'ref': 'http://www.aa7a.cn/',  # 登录成功重定向到这个地址
	    'act': 'act_login'
	}
	res = session.post('http://www.aa7a.cn/user.php',data=data)
	print(res.text)  # {"error":5}
	'使用session对象,就无需在请求中携带cookie,会自动携带'
	res1 = session.get('http://www.aa7a.cn/') # 自动保持登录状态,自动携带cookie
	print('jack' in res.text)  

十二、响应response对象

	使用requests模块
	1.发送请求:request对象:请求头,请求参数,请求体---》本质就是http请求--》被包装成一个对象
	2.响应回来:response对象:http响应--》cookie,响应头,响应体。。

	import requests
	# response对象有很多属性和方法
	headers={
	   'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
	}
	respone = requests.get('https://www.jianshu.com/',headers=headers)
	# respone属性
	print(respone.text)  # 响应体的文本内容
	print(respone.content)  # 响应体的二进制内容
	print(respone.status_code)  # 响应状态码
	print(respone.headers)  # 响应头
	print(respone.cookies)  # 响应cookie
	print(respone.cookies.get_dict())  # cookieJar对象,获得到真正的字段
	print(respone.cookies.items())  # 获得cookie的所有key和value值
	print(respone.url)  # 请求地址
	print(respone.history)  # 访问这个地址,可能会重定向,放了它重定向的地址
	print(respone.encoding)  # 页面编码

	'''
		# 有的网站,打印
		res.text --->发现乱码---》请求回来的二进制---》转成了字符串---》默认用utf8转---》
		response.encoding='gbk'
		再打印res.text它就用gbk转码
	'''

十三、下载图片

	1.没有带图片防盗链的图片地址
	res = requests.get('https://img.zcool.cn/community/0186025d143ecaa8012051cd9c2eb7.jpg@1280w_1l_2o_100sh.jpg')
	res = requests.get('https://pic.3gbizhi.com/uploads/20210611/a070a0d807c9042c9d123597d83797f0.jpg')
	res = requests.get('https://c-ssl.dtstatic.com/uploads/blog/202311/01/wgSLoQZi9oAPeg.thumb.1000_0.jpeg')
	# print(res.content)
	with open('feng.jpg','wb') as f:
	   f.write(res.content)
	with open('chognwu.jpg', 'wb') as f:
	   for line in res.iter_content(chunk_size=1024):
	     f.write(line)
	     
	2.带有图片防盗链的图片地址
	'以上是没有带图片防盗链的,如果到了图片防盗链,需要在请求头中添加一个referer参数,里面写的是上次访问的地址'
	headers = {
	'Referer':'https://www.tupianzj.com/'
	}
	res = requests.get('https://img.lianzhixiu.com/uploads/allimg/220223/9-220223141210-51.jpg',headers=headers)
	with open('ju.jpg','wb') as f:
	   for line in res.iter_content():
	      f.write(line)

在这里插入图片描述

获取视频的操作同上面一样

十四、ssl认证

	http协议
	HTTP协议以明文方式发送内容,不提供任何方式的数据加密。HTTP协议不适合传输一些敏感信息

	https协议:http+ssl/tsl
	https则是具有安全性的ssl加密传输协议。HTTP+ SSL / TLS,也就是在 http上又加了一层处理加密信息的模块,比 http安全,可防止数据在传输过程中被窃取、改变,确保数据的完整性

http版本区别

	  0.9:底层基于tcp,每次http请求,都是建立一个tcp连接,三次握手,请求结束需要四次挥手
      1.1:请求头中有个参数Keep-alive,可以保证多个http请求公用一个TCP连接
      2.x:多路复用,多个请求使用同一个数据包

    -请求协议:
           请求首行:请求头地址,请求方式,http的版本
           请求头:key-value
           请求体
    -响应协议:
           响应首行:响应状态码,响应字符串描述
           响应头:key-vaule,响应状态码,cookie
           响应体

	'简单了解:https比http多了ssl和tls协议,多了一层处理加密信息的模块。'

解决证书提示错误问题
1.不验证证书—加入verify=False

	import requests
	respone=requests.get('https://www.12306.cn',verify=False) #不验证证书,报警告,返回200
	print(respone.status_code) # 200

2.关闭警告

	import requests
	from requests.packages import urllib3
	urllib3.disable_warnings() #关闭警告
	respone=requests.get('https://www.12306.cn',verify=False)
	print(respone.status_code)

3.手动携带证书-了解

	import requests
	respone=requests.get('https://www.12306.cn',
	                     cert=('/path/server.crt',
	                           '/path/key'))
	print(respone.status_code)

十五、超时设置,异常处理,上传文件

	import requests
	1.超时设置
	# res = requests.get('https://www.baidu.com/',timeout=0.0001)
	# print(res.text)
	
	2.异常处理
	from requests.exceptions import * #可以查看requests.exceptions获取异常类型
	try:
	    r=requests.get('https://www.baidu.com',timeout=0.0001)
	except ReadTimeout:
	    print('--------')
	# except ConnectionError: #网络不通
	#     print('-----')
	# except Timeout:
	#     print('aaaaa')
	except RequestException:  # 通用方案
	    print('Error')
	
	
	3.上传文件
	files={'file':open('ju.jpg','rb')}
	respone=requests.post('http://httpbin.org/post',files=files)
	print(respone.status_code)

十六、使用代理

	免费代理池:https://github.com/jhao104/proxy_pool
	'原理:有些网站提供免费的代理--》爬虫技术---》爬取别人的免费代理--》验证过后---》自己用'
	import requests
	res = requests.get('http://demo.spiderpy.cn/get/?type=https')
	print(res.json())
	print(res.json()['proxy'])
	
	# 111.177.63.86:8888
	headers={
	   'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
	}
	respone = requests.get('https://www.jianshu.com/',headers=headers,proxies={'https':res.json()['proxy']})
	print(respone.text)

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

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

相关文章

使用IDEA配置GO的开发环境备忘录

1. 安装GO 1.1 下载&安装 进入GO的官网下载对应的GO&#xff0c;本人环境为mac选择最新的1.22.0版本&#xff0c;在本地安装即可 1.2 配置相关环境变量 修改~/.bash_profile&#xff0c;添加如下的配置 GOPATH/Users/kevin/go/src GOBIN/Users/kevin/go/go/bin GOROOT/…

【Redis快速入门】深入解读哨兵模式

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

贪心算法之合并区间

“任世界多宽广&#xff0c;停泊在这港口~” 区间问题&#xff0c;涉及到最多的就是 取交集 和 并集的概念。我们使用C排序算法后&#xff0c;其默认规则就是按照 “左排序”进行的。因而&#xff0c;我们实质上注意的是每一个区间的 右端点&#xff0c;根据题目要求&#xff…

如何使用Docker部署Drupal并结合cpolar实现固定公网地址访问

文章目录 前言1. Docker安装Drupal2. 本地局域网访问3 . Linux 安装cpolar4. 配置Drupal公网访问地址5. 公网远程访问Drupal6. 固定Drupal 公网地址 前言 Dupal是一个强大的CMS&#xff0c;适用于各种不同的网站项目&#xff0c;从小型个人博客到大型企业级门户网站。它的学习…

C++ Webserver从零开始:配置环境(九)——下载github的项目进行测试

前言 大家好&#xff0c;我又来更新Webserver的博客了。上一次更新这个专栏时2024.2.5号&#xff0c;离现在已经13天了。非常抱歉&#xff0c;中间隔了那么久。一方面是基础知识学完之后&#xff0c;就要开始自己写代码了。看基础知识和写代码是两回事&#xff0c;理论和实践的…

Python Selenium实现自动化测试及Chrome驱动使用

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站零基础入门的AI学习网站~。 目录 ​编辑 前言 Selenium简介 安装Selenium库 编写自动化测试脚本 1 打开浏览器并访问网页 2 查找页面元…

如何低成本实现商场室内导航地图制作

商场地图导航可提升顾客服务体验&#xff0c;促进商场信息化建设。蜂鸟视图提供两种低成本的商场导航实现方式&#xff0c;以满足不同需求。 一、模拟导航 用户可选用“模拟导航”&#xff1a;将商场CAD图纸导入蜂鸟视图地图编辑器&#xff0c;通过简单操作生成室内3D地图&…

深入理解 Vue3 中的 setup 函数

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

迁移SVN和GIT的云端数据

在新服务器搭建GIT仓库 教程很多&#xff0c;大致的流程是&#xff1a; 1. 新建linux用户密码专用于git操作 2. 新建git库的存放文件夹并在此初始化git 3. 配置git库所在目录权限 *只需要有一个库和有一个用户&#xff0c;与在windows上建库是一样的。不需要搭建类似gitla…

一文彻底搞懂什么是类加载器

文章目录 1. 类加载器简介2. 类加载器的种类3. 类加载执行过程3.1 加载3.2 验证3.3 准备3.4 解析3.5 初始化3.6 使用3.7 卸载 1. 类加载器简介 类加载器&#xff08;Class Loader&#xff09;是 Java 虚拟机&#xff08;JVM&#xff09;的一部分&#xff0c;JVM只会运行二进制…

C语言------一种思路解决实际问题

1.比赛名次问题 ABCDE参加比赛&#xff0c;那么每个人的名次都有5种可能&#xff0c;即1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff1b; int main() {int a 0;int b 0;int c 0;int d 0;int e 0;for (a 1; a < 5; a){for (b 1; b < 5; b){for…

树和堆的精讲

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

(简易部署)恒创科技「幻兽帕鲁香港游戏服务器」搭建教程

近期&#xff0c;作为一款主打多人游戏模式的全新开放世界生存制作游戏——《幻兽帕鲁》(Palworld) &#xff0c;可谓“高效出圈”&#xff0c;自 2024 年 1 月 19 日在 Steam 平台发售抢先试玩版后&#xff0c;短短两个星期&#xff0c;幻兽帕鲁 steam 在线峰值已突破 200 万&…

23.java-日志框架

日志框架 介绍 : 程序中的日志可以用来记录程序运行过程中的信息&#xff0c;并可以进行永久存储。 生活中的日志&#xff1a; 生活中的日志就好比日记&#xff0c;可以记录你生活的点点滴滴。 引入 : 目前输出语句的弊端 : 信息只能展示在控制台不能将其记录到其他的位置&a…

Caddy 自动HTTPS 反向代理、重定向、静态页面 - docker版

简介 Caddy 是一个通用的、易于使用的 Web 服务器&#xff0c;具有以下特点&#xff1a; 快速: Caddy 使用 Go 语言编写&#xff0c;以高性能著称。 安全: Caddy 支持 HTTPS、自动证书生成、HTTP/2 等安全功能。 易用: Caddy 的配置文件简单易懂&#xff0c;易于配置。 功能丰…

代码随想录刷题笔记-Day19

1. 二叉搜索树的最小绝对差 530. 二叉搜索树的最小绝对差https://leetcode.cn/problems/minimum-absolute-difference-in-bst/ 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝…

Git基本操作(超详细)

文章目录 创建Git本地仓库配置Git配置命令查看是否配置成功重置配置 工作区、暂存区、版本库添加文件--场景一概述实例操作 查看.git文件添加文件--场景二修改文件版本回退撤销修改情况⼀&#xff1a;对于工作区的代码&#xff0c;还没有 add情况⼆&#xff1a;已经 add &#…

单片机和RTOS

一.单片机和RTOS区别 单片机是一种集成了处理器、内存、输入输出接口和外围设备控制器等功能的微型计算机系统。它通常用于控制简单的嵌入式系统&#xff0c;如家电、汽车电子、工业控制等。单片机具有低功耗、低成本和高可靠性等特点。 而RTOS&#xff08;Real-Time Operati…

HTTP 请求 400错误

问题 HTTP 请求 400错误 详细问题 客户端发送请求 public static UserInfo updateUserInfo(UserInfo userInfo) {// 创建 OkHttpClient 对象OkHttpClient client new OkHttpClient();// 创建请求体MediaType JSON MediaType.parse("application/json; charsetutf-8&…