Python爬虫基础(四):使用更方便的requests库

文章目录

  • 系列文章索引
  • 一、requests库的使用
    • 1、官方文档
    • 2、安装requests库
    • 3、简单使用
    • 4、使用get请求
    • 5、使用post请求
    • 6、使用代理
  • 二、实战
    • 1、实战:实现古诗文网的登录
      • (1)找到登录页面
      • (2)登录操作需要的数据
      • (3)获取隐藏域中的数据
      • (4)获取验证码图片
      • (5)登录操作
      • (6)获取我的收藏
    • 2、实战:使用超级鹰验证码自动识别
      • (1)超级鹰官网
      • (2)下载

系列文章索引

Python爬虫基础(一):urllib库的使用详解
Python爬虫基础(二):使用xpath与jsonpath解析爬取的数据
Python爬虫基础(三):使用Selenium动态加载网页
Python爬虫基础(四):使用更方便的requests库
Python爬虫基础(五):使用scrapy框架

一、requests库的使用

requests 库是用Python语言编写,用于访问网络资源的第三方库,它基于urllib,但比 urllib更加简单、方便和人性化。通过requests库可以帮助实现自动爬取HTML网页页面以及模拟人类访问服务器自动提交网络请求。

使用起来注意与urllib进行比对。

1、官方文档

官方文档:
https://requests.readthedocs.io/projects/cn/zh_CN/latest/
快速上手:
https://requests.readthedocs.io/projects/cn/zh_CN/latest/user/quickstart.html

2、安装requests库

# 进入到python安装目录的Scripts目录
d:
cd D:\python\Scripts
# 安装
pip install requests -i https://pypi.douban.com/simple

3、简单使用

import requestsurl = 'http://www.baidu.com'response = requests.get(url=url)# 一个类型和六个属性
# Response类型:<class 'requests.models.Response'>
print(type(response))# 设置响应的编码格式
response.encoding = 'utf-8'# 以字符串的形式来返回了网页的源码
print(response.text)# 返回一个url地址
print(response.url)# 返回的是二进制的数据
print(response.content)# 返回响应的状态码
print(response.status_code)# 返回的是响应头
print(response.headers)

4、使用get请求

总结:
(1)参数使用params传递
(2)参数无需urlencode编码
(3)不需要请求对象的定制
(4)请求资源路径中的问号?可以加也可以不加

import requestsurl = 'https://www.baidu.com/s'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}data = {'wd':'北京'
}# url  请求资源路径
# params 参数
# kwargs 字典
response = requests.get(url=url,params=data,headers=headers)content = response.textprint(content)

5、使用post请求

总结:
(1)post请求 是不需要编解码
(2)post请求的参数是data
(3)不需要请求对象的定制

import requestsurl = 'https://fanyi.baidu.com/sug'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}data = {'kw': 'eye'
}# url 请求地址
# data 请求参数
# kwargs 字典
response = requests.post(url=url,data=data,headers=headers)content =response.textprint(content)import jsonobj = json.loads(content)
print(obj)

6、使用代理

import requestsurl = 'http://www.baidu.com/s?'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
}data = {'wd':'ip'
}proxy = {'http':'212.129.251.55:16816'
}response = requests.get(url = url,params=data,headers = headers,proxies = proxy)content = response.textwith open('daili.html','w',encoding='utf-8')as fp:fp.write(content)

二、实战

1、实战:实现古诗文网的登录

(1)找到登录页面

进入古诗文网:https://www.gushiwen.cn/
点击【我的】,就进入了登录页面https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx
在这里插入图片描述

# 获取登录页的源码
import requests# 这是登陆页面的url地址
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}# 获取页面的源码
response = requests.get(url = url,headers = headers)
content = response.text

我们接下来需要做的就是,看这个网站进行登录操作,需要什么数据。

(2)登录操作需要的数据

我们输入错误的验证码,来判断调用登录接口需要的数据:

在这里插入图片描述
用户名密码和验证码我们都知道,这是登录必备的东西。
除此之外的from和denglu表单字段,看着也像是固定写死的。

但是,__VIEWSTATE 和__VIEWSTATEGENERATOR ,看着像是动态生成的,我们如何获取呢?

(3)获取隐藏域中的数据

我们右键->查看网页源代码,全局搜索,发现__VIEWSTATE 和__VIEWSTATEGENERATOR 是保存在页面隐藏域中的数据,一般情况看不到的数据 都是在页面的源码中,所以我们需要获取页面的源码 然后进行解析就可以获取了。
在这里插入图片描述

# 解析页面源码  然后获取_VIEWSTATE   __VIEWSTATEGENERATOR
# 我们此处用bs4进行解析
from bs4 import BeautifulSoupsoup = BeautifulSoup(content,'lxml')# 获取_VIEWSTATE的值
viewstate = soup.select('#__VIEWSTATE')[0].attrs.get('value')
print('获取__VIEWSTATE:' + viewstate)# 获取__VIEWSTATEGENERATOR的值
viewstategenerator = soup.select('#__VIEWSTATEGENERATOR')[0].attrs.get('value')
print('获取__VIEWSTATEGENERATOR:' + viewstategenerator)

(4)获取验证码图片

在这里插入图片描述
我们发现,该图片的地址就是:https://so.gushiwen.cn/RandCode.ashx,每次刷新都是不同的验证码图片。

此处我们获取验证码图片,不能通过request直接获取,因为要确保每次请求的session是相通的,所以我们需要通过session来获取验证码图片。

# 获取验证码图片
code = soup.select('#imgCode')[0].attrs.get('src')
code_url = 'https://so.gushiwen.cn' + code# 有坑,需要使用session进行验证码的获取
# import urllib.request
# urllib.request.urlretrieve(url=code_url,filename='code.jpg')
# requests里面有一个方法 session()  通过session的返回值 就能使用请求变成一个对象session = requests.session()
# 验证码的url的内容
response_code = session.get(code_url)
# 注意此时要使用二进制数据  因为我们要使用的是图片的下载
content_code = response_code.content
# wb的模式就是将二进制数据写入到文件
with open('code.jpg','wb')as fp:fp.write(content_code)# 获取了验证码的图片之后 下载到本地 然后观察验证码  观察之后 然后在控制台输入这个验证码 就可以将这个值给
# code的参数 就可以登陆code_name = input('请输入你的验证码')

将验证码保存到本地,登录的时候看一下验证码,然后进行输入。

(5)登录操作

获取到所有数据之后,拼装数据,调用登录接口post请求:

# 点击登陆
url_post = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'data_post = {'__VIEWSTATE': viewstate,'__VIEWSTATEGENERATOR': viewstategenerator,'from': 'http://so.gushiwen.cn/user/collect.aspx','email': '', # 用户名'pwd': '', # 密码'code': code_name,'denglu': '登录',
}response_post = session.post(url = url, headers = headers, data = data_post)content_post = response_post.textwith open('gushiwen.html','w',encoding= ' utf-8')as fp:fp.write(content_post)

(6)获取我的收藏

登录完毕之后,只需要使用同一个session,就可以获取到我的全部信息了。

# 获取我的收藏
collect_url = 'https://so.gushiwen.cn/user/collect.aspx?sort=t'
collect_info = session.get(url = collect_url)
collect_context = collect_info.text
with open('collect.html','w',encoding= ' utf-8')as fp:fp.write(content_post)

2、实战:使用超级鹰验证码自动识别

(1)超级鹰官网

http://www.chaojiying.com/

价格:http://www.chaojiying.com/price.html

(2)下载

点击【开发文档】:http://www.chaojiying.com/api-14.html
在这里插入图片描述
下载完成之后,会有一个实例,只需要使用其API即可实现图像自动识别:
在这里插入图片描述

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

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

相关文章

MongoDB的搭建 和crud操作

MongoDB docker 下载 docker run --restartalways -d --name mongo -v /docker/mongodb/data:/data/db -p 27017:27017 mongo:4.0.6使用navcat工具使用MongoDB Crud操作 jar包 <dependency><groupId>org.projectlombok</groupId><artifactId>lom…

Web安全与攻防

Web安全概述 在Internet大众化及Web技术飞速演变的今天&#xff0c;在线安全所面临的挑战日益严峻。伴随着在线信息和服务的可用性的提升&#xff0c;以及基于Web的攻击和破坏的增长&#xff0c;安全风险达到了前所未有的高度。Web安全可以从以下三个方面进行考虑&#xff1a;…

负载均衡-ribbon源码解析

负载均衡-ribbon源码解析 1 LoadBalanced注解 /*** 基于ribbon调用服务及负载均衡* return*/ LoadBalanced Bean public RestTemplate restTemplate(){return new RestTemplate(); }Bean ConditionalOnMissingBean public RestTemplateCustomizer restTemplateCustomizer(fin…

基于element-ui的年份范围选择器

基于element-ui的年份范围选择器 element-ui官方只有日期范围和月份范围选择器&#xff0c;根据需求场景需要&#xff0c;支持年份选择器&#xff0c;原本使用两个分开的年份选择器实现的&#xff0c;但是往往有些是不能接受的。在网上找了很多都没有合适的&#xff0c;所以打…

记录一次部署Hugo主题lotusdocs到Github Pages实践

引言 随着开源项目的越来越复杂&#xff0c;项目文档的重要性日渐突出。一个好的项目要有一个清晰明了的文档来帮助大家使用。最近一直有在找寻一个简洁明了的文档主题来放置项目的各种相关文档。最终找到这次的主角&#xff1a;Lotus Docs 基于Hugo的主题。Lotus Docs的样子&…

Axure原型设计累加器计时器设计效果(职业院校技能大赛物联网技术应用项目原型设计题目)

目录 前言 一、本题实现效果 二、操作步骤 1.新建文件 2.界面设计 2.1文本框 2.2 按钮 2.3设计界面完成 3.交互 3.1启动交互设置 3.2 分别设置三个属性 3.2.1 设置值为“0” 3.2.2 文字于文本框 3.2.3 获取焦点时 3.3 停止按钮的交互动作 3.3.1 设置变量值 3.4 重…

RCNA 锐捷培训

第一章 网络基础入门 1.1 OSI参考模型及TCP/IP协议栈 数据是如何传输的&#xff1f; 数据在计算机网络中传输通常依赖于TCP/IP协议模型。 什么是网络&#xff1f; 网络是一种连接多个计算机、设备或系统的通信基础设施&#xff0c;其目的是实现资源共享、信息传递、接收和共享…

mysql 快速上传数据

快速上传数据 这个应该是比inset into values更快的插入数据的办法了。 不过要求挺苛刻的&#xff0c;数据要整理成和表格一致&#xff0c;也就是说每条数据都是完整的一条&#xff0c;而不是一部分。 下面的示例我以***为分割符划分字段&#xff0c;以 \n来分割每条数据。 LO…

自动化运维工具Ansible教程(二)【进阶篇】

文章目录 前言Ansible 入门到精通自动化运维工具Ansible教程(一)【入门篇】自动化运维工具Ansible教程(二)【进阶篇】精通篇 进阶篇1. Ansible 的高级主题&#xff08;例如&#xff1a;角色、动态清单、变量管理等&#xff09;**1. 角色&#xff08;Roles&#xff09;**&#x…

Tomcat修改配置文件

1.Tomcat启动乱码问题 1.1conf目录 说明&#xff1a;找到conf目录下logging.properties文件 1.2打开logging.properties文件 说明&#xff1a;将UTF-8修改成GBK 1.3.效果 2.端口冲突问题 2.1 conf目录 2.2打开 server.xml文件 2.3.修改端口 说明&#xff1a;port指的就是端…

LomBok常用注解及详细介绍

LomBok常用注解及详细介绍 前言 Lombok是一个作用于编辑器和构建工具的 Java 库&#xff0c;可以对编写的 Java 代码进行增强&#xff0c;比如说不用再写实体类的 getter 方法&#xff0c;equals 方法而是自动生成&#xff0c;自动生成日志输出变量等等&#xff0c;减少重复模…

vscode-server

1know_host清除 2 删除服务器里的home/user/.vscode-server&#xff08;不是根root下的vscode-server&#xff09;&#xff0c;删除时用户名保持一致。 3 ssh配置文件 /etc/ssh/sshd_config[想改变,使用root&#xff0c;修改文件权限] 4 删除修改后&#xff0c;重启Windows下…