Python爬虫之requests(二)

Python爬虫之requests(二)

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

一、requests模块综合练习

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

点开搜狗首页,有一个知乎的版块。

搜过框搜索可以看到很多页面词条。

我们的要求就是爬取这些页码的比如1-3页数据。

之前案例都是获取单个页面数据,而这里是多个页面数据。

python 复制代码
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}页数据写入成功!")

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

python 复制代码
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,返回个人主页数据。
python 复制代码
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/

python 复制代码
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一下之后再改)

相关推荐
上弦月-编程1 分钟前
Java类与对象:编程核心解密
java·开发语言·jvm
大大杰哥10 分钟前
从 Volatile 到 ThreadLocal:Java 线程安全机制备忘
java·开发语言·jvm
Artech15 分钟前
[对比学习LangChain和MAF-03]完全不同的Agent设计哲学
python·ai·langchain·c#·agent·maf
崇山峻岭之间19 分钟前
matlab绘制复杂曲线
开发语言·matlab
skywalk816320 分钟前
中文编程语言的开创性语法,言律:一门以汉语为思维内核的原生中文编程语言
开发语言·编程
诸葛老刘23 分钟前
国密python调java服务
java·python·国密·sm2
宠..23 分钟前
VS Code SSH 远程连接 Ubuntu 并实现快速运行(C/C++示例)
java·运维·c语言·开发语言·c++·ubuntu·ssh
Omics Pro24 分钟前
免费!糖蛋白质组学数据分析
开发语言·深度学习·数据挖掘·数据分析·r语言·excel·知识图谱
WL_Aurora25 分钟前
Python 算法基础篇之排序算法(二):希尔、快速、归并
python·算法·排序算法
枫叶林FYL26 分钟前
【强化学习】2 大规模并行强化学习中的耦合策略优化:受控多样性驱动的样本高效探索
开发语言·php