爬虫入门一

文章目录

  • 一、什么是爬虫?
  • 二、爬虫基本流程
  • 三、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.获取响应内容如果服务器能正常响应,则会得到一个ResponseResponse包含: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 requestsres = 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%B7info1 = unquote('%E4%B8%8A%E6%B5%B7')  # 解码print(info1)  # 上海

六、携带请求头

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

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

	import requestsheaders = {'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 requestsheaders = {'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',}  # 发送请求携带的文章idres = 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',}  # 发送请求携带的文章idres = 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',}  # 发送请求携带的文章idcookie = {'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 requestsdata = {'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,就是登录后的cookieres1 = requests.get('http://www.aa7a.cn/',cookies=res.cookies)  # 访问首页,携带cookieprint('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 requestssession=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/') # 自动保持登录状态,自动携带cookieprint('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)  # 响应cookieprint(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/tslhttps则是具有安全性的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 requestsrespone=requests.get('https://www.12306.cn',verify=False) #不验证证书,报警告,返回200print(respone.status_code) # 200

2.关闭警告

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

3.手动携带证书-了解

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

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

	import requests1.超时设置# 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 requestsres = requests.get('http://demo.spiderpy.cn/get/?type=https')print(res.json())print(res.json()['proxy'])# 111.177.63.86:8888headers={'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.mzph.cn/news/690958.shtml

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

相关文章

HTTPS网络通信协议基础

目录 前言&#xff1a; 1.HTTPS协议理论 1.1协议概念 1.2加密 2.两类加密 2.1对称加密 2.2非对称加密 3.引入“证书” 3.1证书概念 3.2数据证书内容 3.3数据签名 4.总结 前言&#xff1a; 了解完HTTP协议后&#xff0c;HTTPS协议是HTTP协议的升级加强版&#xff0c…

设计模式二:代理模式

1、什么是动态代理 可能很多小伙伴首次接触动态代理这个名词的时候&#xff0c;或者是在面试过程中被问到动态代理的时候&#xff0c;不能很好的描述出来&#xff0c;动态代理到底是个什么高大上的技术。不方&#xff0c;其实动态代理的使用非常广泛&#xff0c;例如我们平常使…

unity 使用VS Code 开发,VS Code配置注意事项

vscode 对应的插件&#xff08;unity开发&#xff09; 插件&#xff1a;.Net Install Tool,c#,c# Dev Kit,IntelliCode For C# Dev Kit,Unity,Unity Code Snippets 本人现在是用了这些插件 unity需要安装Visual Studio Editor 1、.Net Install Tool 设置 需要在设置里面配置…

jvm gc日志拿取与分析思路

前言 参考文章:Java中9种常见的CMS GC问题分析与解决 - 美团技术团队 排查过程 进入容器里 生产应用是跑在docker上的&#xff0c;所以需要先进入到应用里面去&#xff0c;步骤如下 1. docker ps 找到对应的应用id&#xff0c;比如 zxc 2. 进入容器内部 docker exec -it 7690…

Elasticsearch:什么是搜索引擎?

搜索引擎定义 搜索引擎是一种软件程序或系统&#xff0c;旨在帮助用户查找存储在互联网或特定数据库中的信息。 搜索引擎的工作原理是对各种来源的内容进行索引和编目&#xff0c;然后根据用户的搜索查询向用户提供相关结果列表。 搜索引擎对于希望快速有效地查找特定信息的用…

怎么清理mac系统缓存系统垃圾文件 ?怎么清理mac系统DNS缓存

很多使用苹果电脑的用户都喜欢在同时运行多个软件&#xff0c;不过这样会导致在运行一些大型软件的时候出现不必要的卡顿现象&#xff0c;这时候我们就可以去清理下内存&#xff0c;不过很多人可能并不知道正确的清内存方式&#xff0c;下面就和小编一起来看看吧。 mac系统是一…

读十堂极简人工智能课笔记07_模拟与情感

1. 数码式考察 1.1. 制作计算机动画或游戏 1.1.1. 想怎么制作都可以 1.2. 计算机模拟 1.2.1. 目标是建造一个虚拟的实验室&#xff0c;其行为与现实完全一致&#xff0c;只是某些变量由我们来控制 1.3. 对现实世界进行建模并不容易&#xff0c;需要非常谨慎地收集和使用数…

Vscode vim 插件使用Ctrl+C和V进行复制粘贴到剪切板

Vscode vim 插件使用CtrlC和V进行复制粘贴到剪切板 使用这一个插件的时候复制粘贴和其他软件互动的时候体验不好, 并且不可以用Ctrl c, Ctrl v很不爽 "vim.commandLineModeKeyBindings": [{"before" : ["Ctrl", "c"],"after&q…

httpd apache

虚拟主机 配置环境 [rootlocalhost ~]#cd /var/www/html/ [rootlocalhost html]#mkdir 123 [rootlocalhost html]#mkdir abc [rootlocalhost html]#ls 123 abc [rootlocalhost html]#cd 123/ [rootlocalhost 123]#echo 123 > index.html [rootlocalhost 123]#cd ../abc/ […

泰山派摄像头使用-opencv流程

1. 泰山派添加camera 连接摄像头连接到usb接口,查看dev设备: # 在终端中输入如下命令&#xff0c;可以查看到camera设备资源&#xff1a; ls /dev/video* 检查板卡上的camera设备资源示例 也可以使用v4l2命令查看 v4l2-ctl --list-devices v4l2-ctl --list-devices是一个命令…

CentOS上如何配置手动和定时任务自动进行时间同步

场景 Linux(Centos)上使用crontab实现定时任务(定时执行脚本)&#xff1a; Linux(Centos)上使用crontab实现定时任务(定时执行脚本)_centos 定时任务-CSDN博客 Winserver上如何配置和开启NTP客户端进行时间同步&#xff1a; Winserver上如何配置和开启NTP客户端进行时间同步…

ADS-B Receiver Module TT-SC1 for UAV and Drones

目录 Introduction Applications Main features Technical parameters Basic technical information Electrical specification Recommended operation conditions General electrical parameters Introduction TT-SC1 is a high quality and low price OEM ADS-B…

使用【Python+Appium】实现自动化测试

一、环境准备 1.脚本语言&#xff1a;Python3.x IDE&#xff1a;安装Pycharm 2.安装Java JDK 、Android SDK 3.adb环境&#xff0c;path添加E:\Software\Android_SDK\platform-tools 4.安装Appium for windows&#xff0c;官网地址 Redirecting 点击下载按钮会到GitHub的…

java面试题之redis篇

1.redis 中的数据类型有哪些 随着 Redis 版本的更新&#xff0c;后面又支持了四种数据类型&#xff1a; BitMap&#xff08;2.2 版新增&#xff09;、HyperLogLog&#xff08;2.8 版新增&#xff09;、GEO&#xff08;3.2 版新增&#xff09;、Stream&#xff08;5.0 版新增&am…

Java+SpringBoot:农业疾病防治新选择

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

基于FPGA的I2C接口控制器(包含单字节和多字节读写)

1、概括 前文对IIC的时序做了详细的讲解&#xff0c;还有不懂的可以获取TI的IIC数据手册查看原理。通过手册需要知道的是IIC读、写数据都是以字节为单位&#xff0c;每次操作后接收方都需要进行应答。主机向从机写入数据后&#xff0c;从机接收数据&#xff0c;需要把总线拉低来…

Linux常用操作指令

Linux常用操作指令 ls 指令 语法&#xff1a;ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 常用选项&#xff1a; -a 列出目录下的所有文件&#xff0c;包括以 . 开头…

【LeetCode每日一题】单调栈 581. 最短无序连续子数组

581. 最短无序连续子数组 给你一个整数数组 nums &#xff0c;你需要找出一个 连续子数组 &#xff0c;如果对这个子数组进行升序排序&#xff0c;那么整个数组都会变为升序排序。 请你找出符合题意的 最短 子数组&#xff0c;并输出它的长度。 示例 1&#xff1a; 输入&am…

【lesson59】线程池问题解答和读者写者问题

文章目录 线程池问题解答什么是单例模式什么是设计模式单例模式的特点饿汉和懒汉模式的理解STL中的容器是否是线程安全的?智能指针是否是线程安全的&#xff1f;其他常见的各种锁 读者写者问题 线程池问题解答 什么是单例模式 单例模式是一种 “经典的, 常用的, 常考的” 设…

【软考】软件质量模型

目录 一、说明二、ISO/IEC 9126软件质量模型2.1 说明2.2 功能性2.3 可靠性2.4 易使用性2.5 效率2.6 可维护性2.7 可移植性 三、Mc Call软件质量模型 一、说明 1.软件质量是指反映软件系统或软件产品满足规定或隐含需求的能力的特征和特性全体。软件质量管理是指对软件开发过程进…