当前位置: 首页 > news >正文

Python爬虫之requests(二)

Python爬虫之requests(二)

前面演示了requests模块的四种请求方式。接下来再来演示下综合的练习。

一、requests模块综合练习

  • 需求:爬取搜狗知乎某一个词条对应的某个范围页码表示的页面数据。

点开搜狗首页,有一个知乎的版块。
在这里插入图片描述

搜过框搜索可以看到很多页面词条。
在这里插入图片描述
我们的要求就是爬取这些页码的比如1-3页数据。
之前案例都是获取单个页面数据,而这里是多个页面数据。

import requests
import os#创建文件夹
if not os.path.exists("./pages"):os.mkdir("./pages")#指定URL,思考一下,三个页码就要指定三个url吗,那三百个岂不是要300条url
#原url = "https://www.sogou.com/sogou?query=%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD&pid=sogou-wsse-ff111e4a5406ed40&insite=zhihu.com&aria=0&sut=2057&sst0=1727143354044&lkt=1%2C1727143353930%2C1727143353930&sessiontime=1727143270719&page=2&ie=utf8"
#删除不必要的参数随后测试,发现上述url和下面简化的url是一样的页面。这里可以看到page=2就是页面2,那么page就是确定页面的参数了
#设计为通用URL
#url = "https://www.sogou.com/sogou?query=%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD&insite=zhihu.com&page=2&ie=utf8"
#指定url
url = "https://www.sogou.com/sogou?"#封装请求头
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0"
}#外界获取搜索参数
word = input("请输入您想搜索的数据:")#定位页码
start_page = int(input("您想查询从那一页开始的页码:"))
end_page = int(input("您想到哪一些查询结束:"))#利用循环,左闭右开区间,所以要加1。
#比如用户数据1-3页。start_page=1,end_page=3。
#for循环的range(1,4)。那么会循环3次,第一个page=1,第二次page=2,第三次page=3
for page in range(start_page, end_page+1):#封装参数param = {"query": word,"insite": "zhihu.com","page": page,"ie": "utf-8"}#发起请求:response = requests.get(url=url,params=param,headers=headers)#获取响应页面数据(指定页码的数据page)page_text = response.text#持久化存储fileName = word+str(page)+".html"filePath = "pages/"+fileNamewith open(filePath,"w",encoding="utf-8") as f:f.write(page_text)print(f"文件第{page}页数据写入成功!")

类似的,可以再试试爬取贴吧:

import requests
import os#创建文件夹
if not os.path.exists("text"):os.mkdir("text")#用户输入词条
page_citiao = input("您想搜索什么词条呢?")#用户输入页码数据
start_page = int(input("你想搜索从哪个开始的页码的数据:"))
end_page = int(input("你想搜索从哪个开始的页码的数据:"))#初始url
# url = "https://tieba.baidu.com/f?kw=%E5%8E%9F%E7%A5%9E%E5%86%85%E9%AC%BC&ie=utf-8&pn=50"
url = "https://tieba.baidu.com/f?"#伪装ua
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0"
}#参数拼接
for page in range(start_page,end_page+1):param = {"kw": page_citiao,"ie": "utf-8","pn": page}response = requests.get(url=url,params=param,headers=headers)#获取页面数据page_text = response.text#持久化存储fileName = page_citiao + str(page) + ".html"filePath = "./text/" + fileNamewith open(filePath,"w",encoding="utf-8") as f:f.write(page_text)print(f"写入第{page}页成功!")

二、requests模块高级之cookie操作

  • cookie:
    基于用户的数据
    - 需求:爬取张三用户的豆瓣网个人主页页面数据
  • cookie作用: 服务器端使用cookie来记录客户端的状态信息
    流程:
    1、执行登录操作(获取cookie)
    2、在发起个人主页请求时,需要将cookie携带到该请求中
    注意—> session对象:发送请求(会将cookie对象自动存储),第一次发送session请求之后,cookie就会自动存储到session里,那么第二次个人主页请求携带cookie,服务器端就能识别到cookie,返回个人主页数据。
import requests#创建seesion,requests模块有一个session方式,用它就能创建session请求
session = requests.session()#发起登录请求获取cookie,存储到session对象中(当然要发起session请求才能将cookie存储到session中)
login_url = "https://accounts.douban.com/login"#伪装ua
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0"
}data = {"source": None,"redir": "https://accounts.douban.com/login","form_email": "","form_password": "","login": "登陆"
}#使用session发起请求,第一次发起session是为了获取cookie,所以不需要此页面数据。
login_response = session.post(url=login_url,data=data,headers=headers)#对个人主页发起请求,获取响应页面数据(session里已经携带cookie)
url = "https://www.douban.com/people/230085989/?"
param = {"_i": "7151806ehwFyC0"
}#获得响应对象
response = session.get(url=url,params=param,headers=headers)
page_text = response.text#持久化存储
with open("douban110.html","w",encoding="utf-8") as f:f.write(page_text)

其实爬虫程序就是遵从浏览器的请求流程。

三、requests模块高级之代理操作

  • 代理操作:
    • 代理:第三方代理本体执行相关事务。生活:代购,微商,中介…
    • 为什么要使用代理?
      反爬操作。
      使用代理是一种反反爬手段
    • 分类:
      正向代理:代替客户端获取数据
      反向代理:代替服务器端提供数据
    • 免费代理ip的网站提供商

    https://www.kuaidaili.com/free/

import requests#首先百度查找自己的ip,拿取url
url = "http://ip.900cha.com/"#ua伪装
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0"
}#代理ip封装
proxy = {"http": "117.42.94.223:16388"
}#更换网络ip,
response = requests.get(url=url,proxies=proxy,headers=headers)with open("./daili.html","w",encoding="utf-8") as f:f.write(response.text)

好像有点点问题,代理ip不好找。。。(mark一下之后再改)

相关文章:

  • 基于SSM+Vue+MySQL的在线视频学习系统
  • 技术周刊第2期: Cursor 面临的挑战 -2024
  • 深度学习技术在流体力学中的应用与实操培训【1/3理论课程2/3实操课程】
  • python 实现random forest classifier随机森林分类器算法
  • 王道-计网
  • 工具类:JWT
  • 【Golang】Go语言字符串处理库--strings
  • Apache Solr:深入探索与常见误区解析
  • Docker-2.如何保存数据退出
  • STL与PLY格式转化
  • 基于Spring Boot+Vue的减肥健康管理系统设计和实现【原创】(BMI算法,协同过滤算法、图形化分析)
  • Redis 介绍
  • 修复: Flux女生脸不再油光满面, 屁股下巴 -- 超实用Comfyui小技巧
  • css 中 ~ 符号、text-indent、ellipsis、ellipsis-2、text-overflow: ellipsis、::before的使用
  • Day28笔记-Python自动化操作Word
  • Android 控件背景颜色处理
  • Javascript 原型链
  • js操作时间(持续更新)
  • XML已死 ?
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 山寨一个 Promise
  • 用Canvas画一棵二叉树
  • 优化 Vue 项目编译文件大小
  • 在Mac OS X上安装 Ruby运行环境
  • NLPIR智能语义技术让大数据挖掘更简单
  • Spring第一个helloWorld
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​MySQL主从复制一致性检测
  • (23)Linux的软硬连接
  • (C语言)fread与fwrite详解
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (二) 初入MySQL 【数据库管理】
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (十)Flink Table API 和 SQL 基本概念
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • .net网站发布-允许更新此预编译站点
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .Net中间语言BeforeFieldInit
  • @Autowired多个相同类型bean装配问题
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [CSS] 点击事件触发的动画
  • [DM复习]Apriori算法-国会投票记录关联规则挖掘(上)
  • [docker] Docker容器服务更新与发现之consul
  • [HCTF 2018]WarmUp (代码审计)
  • [HDU3710]Battle over Cities
  • [JDK工具-5] jinfo jvm配置信息工具
  • [Jsprit]Jsprit学习笔记-一个简单的示例
  • [MYSQL]mysql将两个表结果合并到一起
  • [NISACTF 2022]level-up
  • [OpenGL(Win32)] - 3D 轮廓字体
  • [python基础] python 2与python 3之间的区别 —— round