python实现数据爬虫

一:什么是爬虫

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,经常被称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

即打开一个网页,里面有网页内容吧,想象一下,有个工具,可以把网页上的内容获取下来,存到你想要的地方,这个工具就是我们今天的主角:爬虫

二:requests介绍

1:requests介绍

requests 是 Python 中的一个 HTTP 库,可以用于发送 HTTP/1.1 请求。它可以让 Python 发送 HTTP/1.1 请求,包括 GET、POST、PUT、DELETE、HEAD、OPTIONS 等方法,同时也支持 cookie、header、SSL 等特性。

2:安装requests

pip install requests

3:requests使用

(1):GET请求
import requests  #导入 Requests 模块
params= {'key1': 'value1', 'key2': 'value2'}
r = requests.get("https://XXX", params=params)
(2):POST请求
import requests  #导入 Requests 模块
data = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("https://XXX", data=data)
(3):其他请求
r = requests.put("https://XXX")    #put请求 
r = requests.delete("https://XXX")  #delete请求 
r = requests.head("https://XXX")      #head请求 
r = requests.options("https://XXX")   #options请求
(4):requests响应

1. 字符串内容响应

import requests   #导入 Requests 模块
import astr = requests.get('https://XXX')   #像目标url地址发送get请求,返回一个response对象
content = r.text   #获取响应内容
# #将字符串转字典型
content_list = ast.literal_eval(content)

2. 二进制内容响应

import requests   #导入 Requests 模块
r = requests.get('https://XXX')   #像目标url地址发送get请求,返回一个response对象
r.content   #非文本请求,获取响应内容,一般创建图片时获取图片使用

3. json内容响应

import requests    #导入 Requests 模块
r = requests.get('https://XXX')
r.json()

如果 JSON 解码失败,r.json就会抛出一个异常。例如,相应内容是 401 (Unauthorized),尝试访问 r.json将会抛出 ValueError: No JSON object could be decoded异常。

4. 原始内容响应

在罕见的情况下,你可能想获取来自服务器的原始套接字响应,那么你可以访问 r.raw。 如果你确实想这么干,那请你确保在初始请求中设置了 stream=True。具体你可以这么做:

import requests
r = requests.get('https://XXX', stream=True)
r.raw   #<requests.packages.urllib3.response.HTTPResponse object at 0x101194810>
r.raw.read(10)  #'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'

三:BeautifulSoup介绍

1:BeautifulSoup介绍

BeautifulSoup 是一个可以将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag , NavigableString , BeautifulSoup , Comment 

BeautifulSoup文档地址:Beautiful Soup 4.4.0 文档    Beautiful Soup 4.12.0 文档

2:BeautifulSoup安装

pip install beautifulsoup4

我们还可以安装lxml,这是一个解析器,BeautifulSoup可以使用它来解析HTML,然后提取内容,如果不安装lxml,则BeautifulSoup会使用Python内置的解析器对文档进行解析。之所以使用lxml,是因为它速度快

pip install lxml

3:BeautifulSoup使用

(1):Tag介绍

标签; 访问方式:soup.tag;属性:tag.name(标签名),tag.attrs(标签属性)

例:

from bs4 import BeautifulSoup
soup = BeautifulSoup('<p class="test">this is test</p>','lxml')
tag = soup.p
print(tag) # <p class="test">this is test</p>
print(tag.name) # p
print(tag.attrs) # {'class': ['test']}
print(tag['class']) # ['test']
(2):NavigableString介绍

NavigableString就是标签中的文本内容(不包含标签),可遍历字符串; 访问方式:soup.tag.string

例:

from bs4 import BeautifulSoup
soup = BeautifulSoup('<p class="test">this is test</p>','lxml')tag = soup.p
print(tag.string) #this is test
(3):BeautifulSoup介绍

BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,它支持 遍历文档树 和 搜索文档树 中描述的大部分的方法; 属性:soup.name(标签名),soup.attrs(标签属性)

(4):Comment介绍

标签内字符串的注释; 访问方式:soup.tag.string
例:

from bs4 import BeautifulSoupsoup = BeautifulSoup('<p><!--hello word--></p>','lxml')
tag = soup.p
print(tag.string) #hello word
(5):搜索文档树

在BeautifulSoup中最常用的是find()和find_all(),当然还有其他的。比如find_parent() 和 find_parents()、 find_next_sibling() 和 find_next_siblings() 、find_all_next() 和 find_next()、find_all_previous() 和 find_previous() 等等。这里只介绍find()和find_all()用法,其他的可以自行参考官网文档

1. find_all()

搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件。返回值类型是bs4.element.ResultSet

语法

find_all( name , attrs , recursive , string , **kwargs )

参数说明

  • name 参数:可以查找所有名字为 name 的tag。
  • attr 参数:就是tag里的属性。
  • string 参数:搜索文档中字符串的内容。
  • recursive 参数: 调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点。如果只想搜索tag的直接子节点,可以使用参数 recursive=False 。

简单实例:

from bs4 import BeautifulSoup
import resoup = BeautifulSoup('<p class="test">this is test</p><a class="click" id="btn" href="http://www.baidu.com">点击跳转</a>','lxml')print(soup.find_all("p")) #[<p class="test">this is test</p>]print(soup.find_all("p", "test")) #[<p class="test">this is test</p>]# 
print(soup.find_all("a")) #[<a class="click" href="http://www.baidu.com">点击跳转</a>]print(soup.find_all(id="btn")) #[<a class="click" href="http://www.baidu.com" id="btn">点击跳转</a>]print(soup.find_all(string=re.compile("test"))) #['this is test']

2. find()

与find_all()类似,只不过只返回找到的第一个值。返回值类型是bs4.element.Tag。

语法

find( name , attrs , recursive , string , **kwargs )

参数说明

  • name 参数:可以查找所有名字为 name 的tag。
  • attr 参数:就是tag里的属性。
  • string 参数:搜索文档中字符串的内容。
  • recursive 参数: 调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点。如果只想搜索tag的直接子节点,可以使用参数 recursive=False 。

简单实例:

from bs4 import BeautifulSoup
import resoup = BeautifulSoup('<p class="test">this is test</p><a class="click" id="btn" href="http://www.baidu.com">点击跳转</a>','lxml')print(soup.find("p")) #<p class="test">this is test</p>print(soup.find("p", "test")) #<p class="test">this is test</p># 
print(soup.find("a")) #<a class="click" href="http://www.baidu.com">点击跳转</a>print(soup.find(id="btn")) #<a class="click" href="http://www.baidu.com">点击跳转</a>print(soup.find(string=re.compile("test"))) #this is test

四:python实现数据爬虫

数据爬虫简单实例

import requests #导入requests 模块
from bs4 import BeautifulSoup  #导入BeautifulSoup 模块
import os  #导入os模块
class BeautifulPicture():def __init__(self):  #类的初始化操作self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1'}  #给请求指定一个请求头来模拟chrome浏览器self.web_url = 'http://XXX'  #要访问的网页地址self.folder_path = r'E:\pic'  #设置图片要存放的文件目录def get_pic(self):print('开始网页get请求')r = self.request(self.web_url)print('开始获取所有a标签')all_a = BeautifulSoup(r.text, 'lxml').find_all('img')  #获取网页中的class为cV68d的所有a标签print('开始创建文件夹')self.mkdir(self.folder_path)  #创建文件夹print('开始切换文件夹')os.chdir(self.folder_path)   #切换路径至上面创建的文件夹i = 0for a in all_a: #循环每个标签,获取标签中图片的url并且进行网络请求,最后保存图片img_str = a['src'] #a标签中完整的style字符串print('a标签的style内容是:', img_str)first_pos = img_str.find('"') + 1second_pos = img_str.find('"',first_pos)img_url = img_str[first_pos: second_pos] #使用Python的切片功能截取双引号之间的内容img_name = str(i)self.save_img(img_url, img_name) #调用save_img方法来保存图片i = int(i)+1def save_img(self, url, name): ##保存图片print('开始请求图片地址,过程会有点长...')if url.find('https') != -1:img = self.request(url)file_name = name + '.jpg'print('开始保存图片')f = open(file_name, 'ab')f.write(img.content)print(file_name, '图片保存成功!')f.close()def request(self, url):  #返回网页的responser = requests.get(url, headers=self.headers)  # 像目标url地址发送get请求,返回一个response对象。有没有headers参数都可以。return rdef mkdir(self, path):  ##这个函数创建文件夹path = path.strip()isExists = os.path.exists(path)if not isExists:print('创建名字叫做', path, '的文件夹')os.makedirs(path)print('创建成功!')else:print(path, '文件夹已经存在了,不再创建')
beauty = BeautifulPicture()  #创建类的实例
beauty.get_pic()  #执行类中的方法

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

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

相关文章

java泛型的高级用法

Java 泛型提供了强大的泛型机制&#xff0c;可以在编译时检查类型安全&#xff0c;并且可以编写通用的代码&#xff0c;使得代码更加灵活和重用。除了基本的泛型用法外&#xff0c;还有一些高级的泛型用法&#xff0c;以下是一些常见的高级泛型用法&#xff1a; 泛型通配符&…

【YOLO v5 v7 v8 v9小目标改进】AFPN 渐进式特征金字塔网络:解决多尺度特征融合中,信息在传递过程丢失

AFPN 渐进式特征金字塔网络&#xff1a;解决多尺度特征融合中&#xff0c;信息在传递过程丢失 提出背景AFPN 多尺度特征金字塔 非邻近层次的直接特征融合 自适应空间融合操作 小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改YOLO v9 魔改 提出背景 论文&#xff1a;https:…

人力资源管理软件大比拼:这篇文章帮你做出明智选择!

本期为您盘点的助力现代企业强力提效的人力资源管理软件有&#xff1a;Zoho People&#xff0c;Workday&#xff0c;BambooHR和Namely。 Zoho People人力资源管理软件 Zoho People是一款全面的云端人力资源管理&#xff08;HRM&#xff09;软件&#xff0c;由Zoho Corporation…

Android开发快速上手,2024年展望Android原生开发的现状

前言 很多次小伙伴问到学习方法&#xff0c;我也很想写这样的一篇文章来跟大家讨论下关于学习方法这件事情。 其实学习方法这个事情&#xff0c;我没啥发言权&#xff0c;因为我自己本身都是没啥方法可言的&#xff0c;就瞎折腾那种&#xff0c;但是大家想看这样的一篇文章&a…

TinyEMU编译与使用

TinyEMU编译与使用 1 介绍2 准备工作3 编译TinyEMU3.1 安装依赖库3.2 编译 4 运行TinyEMU4.1 在线运行4.2 离线运行 5 共享目录5.1 修改root_9p-riscv64.cfg5.2 启动TinyEMU5.3 执行挂载命令 6 TinyEMU命令帮助 1 介绍 原名为riscvemu&#xff0c;于2018-09-23&#xff0c;改为…

mapbox鼠标滑到气泡中不关闭气泡。

贴个群号 WebGIS学习交流群461555818&#xff0c;欢迎大家 效果图 像官网这样的例子&#xff0c;我们并不能鼠标移动到上面的popup内容中&#xff0c;但是有时候是有这样的需求的&#xff0c;比如复制里面的值&#xff0c;或者里面加个按钮&#xff0c;可以点击出现弹窗&…

Vue3:使用setup实现组合式开发

一、情景说明 首先&#xff0c;我们应该知道&#xff0c;Vue3中&#xff0c;可以用Vue2的语法&#xff0c;进行配置式开发。 在这里&#xff0c;我们用Vue3的新语法&#xff0c;实现组合式开发 二、案例 1、组件中使用setup代替Vue2中的data、methods等vc配置项 关键配置&a…

declare 模块声明

示例代码&#xff1a; declare module *.css; declare module *.less; declare module *.png;这些代码行是 TypeScript 的模块声明&#xff0c;用于告诉 TypeScript 编译器如何处理某些类型的模块导入。TypeScript 是一种基于 JavaScript 的静态类型检查语言&#xff0c;它允许…

STM32(19)I2C模块 主机发数据

发送数据&#xff1a; 等待空闲&#xff1a; 发送起始位&#xff1a; 发送地址&#xff1a; 发送数据&#xff1a;

鸿蒙中Text组件的展开和收起效果

前言&#xff1a; DevEco Studio版本&#xff1a;4.0.0.600 效果&#xff1a; 原理分析&#xff1a; 通过效果图我们知道&#xff0c;可以将‘...展开’ 盖在文本内容的的右下角来实现这个效果。那么要实现盖上的效果可以通过层叠布局&#xff08;Stack&#xff09;来实现&am…

基于ceph-deploy部署Ceph 集群

Ceph分布式存储一、存储基础1、单机存储设备1.1 单机存储的问题 2、分布式存储(软件定义的存储SDS)2.1 分布式存储的类型 二、Ceph简介1、Ceph优势2、Ceph架构3、Ceph 核心组件4、OSD 存储后端5、Ceph 数据的存储过程6、Ceph 版本发行生命周期 三、Ceph 集群部署1、 基于 ceph-…

【Vue3】Ref 和 ShallowRef 的区别

目录 什么是 Ref什么是 ShallowRef区别对比示例代码 什么是 Ref Ref 是 Vue 3 中的一个新的基本响应式数据类型&#xff0c;它允许我们包装任意的 JavaScript 值&#xff0c;并且在数据变化时发出通知。Ref 提供了一个 .value 属性来访问其内部的值&#xff0c;同时还提供了一…

【前端捉鬼记】记录两个js中非常基础的小白问题

写逻辑时&#xff0c;遇到两个js代码里非常基础的小白问题&#xff0c;用简单的代码测试并记录一下&#xff1a; 1、一个对象 a 有个数组类型的属性 b&#xff0c;将这个数组取出保存到另一个变量 m&#xff0c;修改 m&#xff0c;对象 a 中的属性 b 是否跟随变化&#xff1f;…

【Java EE初阶二十七】深入了解cookie

1. 简单了解cookie Cookie是http请求里header 中的一个属性&#xff0c;浏览器持久化存储数据的一种机制&#xff0c;网页无法访问主机的文件系统&#xff0c;要想存储数据就得通过其他的方式&#xff1b; 且cookie中保存的数据也是键值对的形式&#xff0c;最终还是要把这个键…

移动开发:网格视图

一、在新建GridView模块下添加图片以及创建cell.xml文件 1.粘贴图片时选择红框中的路径&#xff0c;点击“OK” 2.在路径后添加-mdpi后缀,再点击“OK” 二、相关代码块 1.MainActivity.java文件代码 package com.example.gridview;import androidx.appcompat.app.AppCompatAc…

供应链优化:降本增效的核心战略——张驰咨询

在当今这个高度竞争的商业环境中&#xff0c;企业为了保持竞争力&#xff0c;不断寻求降低成本和提升效率的策略变得至关重要。有效的成本控制和效率提升不仅能够增加企业的利润率&#xff0c;还能增强其市场地位和客户满意度。以下是一些实用的策略&#xff0c;旨在帮助企业实…

HCIE之MPLS练习(六)

MPLS练习 一、静态LSP1、IGP构建FEC2、全网运行MPLS3、打通LSP通道3.1、静态LSP配置3.2、转发过程3.3、验证标签转发过程 4、利用LSP传递任意流量4.1、配置4.2、验证 二、LDP协议1、IGP构建FEC2、全网运行mpls、ldp3、mpls ldp邻居关系、LIB表4、转发过程5、验证mpls转发过程6、…

从嵌入式Linux到嵌入式Android

最近开始投入Android的怀抱。说来惭愧&#xff0c;08年就听说这东西&#xff0c;当时也有同事投入去看&#xff0c;因为恶心Java&#xff0c;始终对这玩意无感&#xff0c;没想到现在不会这个嵌入式都快要没法搞了。为了不中年失业&#xff0c;所以只能回过头又来学。 首先还是…

leetcode——异或运算—— 只出现一次的数字

给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 示例 1 &#xff1a; 输入&#xff…

Python(NetOps)前传-网络设备开局配置

背景 我们知道用Python在cli配置网络设备的前提是&#xff1a; 网络设备与Python主机网络可达网络设备已开启并完成ssh相关配置 目标 本文已华为S5720S-52P-LI-AC交换机为例&#xff0c;完成&#xff1a; 完成网络设备开局配置&#xff1b;用Python脚本验证ssh登录 配置 …