Python爬虫之requests(二)

news2024/9/28 22:36:07

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/"+fileName
    with 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/" + fileName
    with 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一下之后再改)

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

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

相关文章

基于小波变换与稀疏表示优化的RIE数据深度学习预测模型

加入深度实战社区:www.zzgcz.com,免费学习所有深度学习实战项目。 1. 项目简介 本项目旨在通过深度学习模型进行RSOP(Remote Sensing Observation Prediction)的数据预测。RSOP数据是基于远程传感技术采集的多维信息,广泛应用于…

volatile关键字最全原理剖析

介绍 volatile是轻量级的同步机制,volatile可以用来解决可见性和有序性问题,但不保证原子性。 volatile的作用: 保证了不同线程对共享变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是…

Android开发中的ViewModel

在Android应用开发中,ViewModel作为架构组件之一,扮演着管理UI数据和生命周期的关键角色。本文将深入探讨ViewModel如何感知View的生命周期,并分析其内核原理,帮助开发者更好地利用ViewModel优化应用架构。 一、ViewModel简介 在…

isilon存储node节点更换你必须知道的知识

最近一直想要写一篇文章是关于EMC Isilon 存储控制器方面的,是什么力量促使我要写这个文章呢?作为一个卖存储备件的资深搬运工,最近遇到了一些关于控制器方面的备件询价、备件更换方面的问题,每次都要花大量的时间给客户解释。解释…

分库分表常见算法,每个高级开发必知必会?

目录标题 分库分表常见算法哈希取模算法容量(时间)范围算法范围 取模算法 总结 分库分表是一种数据库设计技术,其目的是为了提高数据库的性能和扩展性。它通过将数据库的表拆分到多个数据库中来实现这一目的。 分库分表常见算法 分库分表分…

鸿蒙媒体开发系列12——音频输入设备管理(AudioRoutingManager)

如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。 有时设备同时连接多个音频输入设备,需要指定音频输入设备进行音频录制&a…

HarmonyOs 学会查看官方文档实现菜单框

1. 学会查看官方文档 HarmonyOS跟上网上的视频学习一段时间后,基本也就入门了,但是有一些操作网上没有找到合适教学的视频,这时,大家就需要养成参考官方文档的习惯了,因为官方的开发文档是我们学习深度任何一门语言或…

OpenCV透视变换:原理、应用与实现

在图像处理与计算机视觉领域,透视变换(Perspective Transformation)是一种强大的工具,它模拟了人眼或相机镜头观看三维空间物体时的透视效果,从而改变图像的视角和形状。本文将详细介绍透视变换的原理、应用场景以及如…

Java_集合_单列集合Collection

第一章.Collection接口 Collection<E> 集合名 new 实现类对象<E>() 常用方法: boolean add(E e) : 将给定的元素添加到当前集合中(我们一般调add时,不用boolean接收,因为add一定会成功) boolean addAll(Collection<? extends E> c) :将另一个集合元素添…

SPI驱动学习七(SPI_Slave_Mode驱动程序框架)

目录 一、SPI_Slave_Mode驱动程序框架1. Master和Slave模式差别1.1 主设备 (Master)1.2 从设备 (Slave)1.3 示例 2. SPI传输概述2.1 数据组织方式2.2 SPI控制器数据结构 3. SPI Slave Mode数据传输过程4. 如何编写程序4.1 设备树4.2 内核相关4.3 简单的示例代码4.3.1 master和s…

测试用例的进阶二

1. 按开发阶段划分 1.1 测试金字塔 从上到下&#xff0c;对于测试人员代码就是要求越来越低&#xff1b; 从下到上&#xff0c;越来越靠近用户&#xff1b; 从下到上&#xff0c;定位问题的成本越来越高&#xff1b; 1.2 单元测试(Unit Testing) 单元测试是对软件组成单元进…

如何使用ssm实现北关村基本办公管理系统的设计与实现

TOC ssm721北关村基本办公管理系统的设计与实现jsp 第一章 绪论 1.1 选题背景 目前整个社会发展的速度&#xff0c;严重依赖于互联网&#xff0c;如果没有了互联网的存在&#xff0c;市场可能会一蹶不振&#xff0c;严重影响经济的发展水平&#xff0c;影响人们的生活质量。…

终端AI大变身:大模型普惠时代的“魔法钥匙”

当AI遇见你的手机&#xff0c;日常秒变科幻片&#xff01; 嘿&#xff0c;小伙伴们&#xff01;想象一下&#xff0c;你早晨醒来&#xff0c;不是先摸手机看时间&#xff0c;而是手机先跟你打招呼&#xff1a;“早安&#xff0c;主人&#xff0c;今天天气不错&#xff0c;适合晨…

支付宝远程收款跳转码接口api之工作证跳转收款码

1、在制作工作证跳转收款之前需要在支付宝上开通工作证 2、然后获取支付宝账户信息、收款码等信息 3、将所需信息填入如下代码之中 const axios require(axios); const authCode 从客户端接收到的授权码;axios({method: post,url: https://openapi.alipay.com/alipay.syst…

前缀和(包括一维和二维)

前缀和 什么是前缀和&#xff1f;用在哪里&#xff1f;有什么好处&#xff1f; 前缀和是在反复求一个序列中不同区间处的元素之和。 例如有以下一个数组&#xff1a;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5 我们要求a[2]~a[4]&#xff08;不包括a[2]&#xff0…

五、人物持有武器攻击

一、手部添加预制体&#xff08;武器&#xff09; 1、骨骼&#xff08;手&#xff09; 由于人物模型有骨骼和动画&#xff0c;在添加预制体后&#xff0c;会抓握武器 建一个预制体在手部位置 二、添加武器拖尾 下载拖尾特效 赋值特效中的代码&#xff0c;直接使用 清空里面…

计算机毕业设计 助农产品采购平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

代码随想录算法训练营第60天 | 1、城市间货物运输I,2、城市间货物运输II,3、城市间货物运输III

目录 1、城市间货物运输I 2、城市间货物运输II 3、城市间货物运输III 1、城市间货物运输I 题目描述 某国为促进城市间经济交流&#xff0c;决定对货物运输提供补贴。共有 n 个编号为 1 到 n 的城市&#xff0c;通过道路网络连接&#xff0c;网络中的道路仅允许从某个城市单…

opencv:实现图像的自动裁剪与优化

随着计算机视觉技术的发展&#xff0c;图像处理已成为一项重要的技能。今天&#xff0c;我们将探讨如何使用Python中的OpenCV库来实现对图像的自动裁剪以及一些基本的图像优化技巧。我们的目标是对一张发票图片进行处理&#xff0c;使其更加清晰且便于阅读。 准备工作 首先&a…

【Matlab元胞自动机】《高速公路人工—自动驾驶混行交通流临界特征研究》

一、项目介绍 高速公路是交通流领域研究的重点&#xff0c;自动驾驶车辆的介入势必会对高速公路交通流 产生影响。本文从基础交通流理论研究出发&#xff0c;在三相交通流理论框架下拟定人工-自动 驾驶混行交通流模型规则&#xff0c;进而通过模拟仿真分析自动驾驶车辆对高速公…