python爬虫学习记录

news2024/11/29 2:30:35

初识爬虫

爬虫的概念

「什么是爬虫」

爬虫:通过编写程序,模拟浏览器上网,并抓取有价值的数据的过程

反爬虫:门户网站通过制定相应的策略或技术手段,来阻止爬虫程序对其网站数据的爬取

反反爬:爬虫程序可以采用一些技术手段,来绕过或破坏门户网站的反爬机制,从而爬取到有用的数据

爬虫与反爬虫就是一对矛与盾

「爬虫合法性探究」

爬虫可能带来的风险?

  • 爬虫干扰了被访问网站的正常运营

  • 爬虫抓取了受到法律保护的特定类型的数据或信息

如何合理地使用爬虫?

  • 对爬虫程序进行优化,避免干扰网站的正常运行

  • 不要爬取涉及商业机密等敏感信息

「爬虫的君子协议」

通常,网站的robots.txt文件中声明了那些数据可以被爬取,那些数据不可以被爬取(非强制性)

爬虫的分类

在不同的使用场景下,爬虫的分类有

  1. 通用爬虫:抓取一整张页面的数据(很可能包含大量无用信息)

  2. 聚焦爬虫:抓取页面中特定的局部内容,必须建立在通用爬虫的基础之上

  3. 增量爬虫:只会爬取网站中最新更新的数据

网络请求与响应

http协议

http(s)协议是服务器和客户端进行数据交互的一种形式,服务器和客户端都需要遵守该协议才能进行数据交互

https协议是http协议的升级版,服务器与客户端的数据交互是通过证书加密的,攻击者很难获得有价值的信息

「常用的请求头信息」

Request Header描述
User-Agent请求载体的身份标识
Connection请求完毕后,保持连接还是断开连接

「常用的响应头信息」

Response Header描述
Content-Type服务器响应数据的类型

requests模块

requests是python中的一个基于网络请求的模块,用来模拟浏览器发送请求。

「requests模块的安装与使用」

pip install requests   

import requests      
url = 'http://www.baidu.com'   
resp = requests.get(url)    #发起一个get请求,并获得响应数据   
page_content = resp.text   
print(page_content)   
属性描述
resp.text以字符串形式返回,通常是页面的html源代码
resp.content以二进制形式返回,比如一张图片、一个音频
resp.json()返回一个字典对象(当响应数据是json类型时使用)

「基于requests的简易网页采集器(使用到了UA伪装)」

import requests      

# 1. 准备数据   
url = 'https://www.sogou.com/web'   
word = input('Enter a word:')   
params = {  #请求参数,拼接在url后      
 'query': word   }   
headers = { #请求头,伪装成浏览器      
 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'   }    
   
 # 2. 发起请求   
 resp = requests.get(url,params,headers=headers)   
 resp.encoding = resp.apparent_encoding   
 page_content = resp.text   
 print(page_content)     
  
 # 3. 持久化存储   
 file_name = word + '.html'   
 with open(file_name,'w',encoding='utf-8') as fp:       
     fp.write(page_content)   
 print(file_name,'保存成功!')   

数据解析

数据解析是在得到整个网页源代码后,对其中的有用信息进行提取的过程。属于聚焦爬虫

「数据解析的一般步骤」

检查网页源代码发现,有价值的数据一般存放在标签中,或者标签的属性中。所以数据解析的一般步骤是:1.获取网页源代码 2.标签定位 3.解析数据

F12检查元素中的数据不一定在页面源代码中,也有可能是通过ajax动态刷新的数据,这是我们在数据解析时需要注意的。数据解析要以页面源代码为准!

「Python中数据解析的三种方式」

1.正则表达式(通用) 2.BeautifulSoup4(python独有) 3.xpath(推荐,通用性最强)

使用正则表达式

建议先把要提取的那部分源码单独复制,对照着去写正则表达式(F12太乱了🤣)

从重复的标签(如li)开始写正则,那么这个正则可以提取到多组数据哦

「re.findall(pattern,string,flags)」

参数描述
pattern匹配的正则表达式
string待匹配的文本字符串
flags标志位。用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等
标志位描述
re.S使.能够匹配包括换行在内的所有字符
re.M多行匹配,影响^和$
re.I使匹配对大小写不敏感
正则表达式描述
.匹配除换行符外的任意单个字符
*匹配多个字符
?非贪婪匹配

使用BeautifulSoup

对于一个网页来说,都有一定的特殊结构和层级关系,而且很多节点都用id和class来区分。所以可以借助网页的结构和属性来提取数据。

「使用BeautifulSoup的一般步骤」

  1. 实例化一个BeautifulSoup对象,并且将页面源代码加载到该对象中

  2. 调用BeautifulSoup对象提供的属性或方法进行标签定位和数据提取

「BeautifulSoup4的安装与使用(需要一并下载lxml解析器)」

pip install bs4   
pip install lxml   

from bs4 import BeautifulSoup   
import requests  
    
# 加载html有两种方式  
# 方式一 使用本地html文档中的数据   
fp = open('./猫羽雫.html','r',encoding='utf-8')   
soup = BeautifulSoup(fp,'lxml')   
print(soup) 
#我们发现,soup对象的内容就是加载到该对象中的html源码   
   
# 方式二 从互联网上获取html源码   
url = 'https://www.baidu.com'   
resp = requests.get(url)   
resp.encoding = resp.apparent_encoding   
soup = BeautifulSoup(resp.text,'lxml')   
print(soup)   

「BeautifulSoup对象中提供的属性和方法」

  1. 根据标签名或选择器定位,返回标签之间的所有内容
方法描述
find(tag,attr=value)根据标签名和属性进行定位,只返回符合条件的第一个元素内容
find_all(tag,attr=value)返回一个列表,用法同上
select(css选择器)使用CSS选择器进行定位,返回一个列表

2. 获取标签之间的文本数据(不包括子标签)

属性描述
.text获取所有文本内容
.string只能获取直系的文本内容

3. 获取标签中指定属性的值

属性描述
[attr]获取属性对应的属性值

使用xpath解析

xpath解析是最常用、最便捷、最高效,且通用性最强的解析方式。xpath是根据元素所处层级进行定位的

「xpath解析的一般步骤」

  1. 实例化一个etree对象,并将要解析的html页面源码数据加载到对象中

  2. 调用etree对象的xpath(xpath表达式)方法结合xpath表达式实现标签的定位和数据提取

「xpath的安装与使用」

pip install lxml   

from lxml import etree   
import requests      
# 加载html有两种方式   
# 方式一 使用本地html文档中的数据   
etree.parse('./猫羽雫.html')      

# 方式二 从互联网上获取html源码   
url = 'https://www.baidu.com'   
resp = requests.get(url)   
resp.encoding = resp.apparent_encoding   
etree.HTML(page_content)   
方法描述
etree.HTML(html)实例化一个etree对象,并加载要解析的html
etree.parse(filepath)实例化一个etree对象,并加载要解析的html(本地html)
xpath(xpath表达式)使用xpath表达式进行标签定位,返回一个列表

xpath()方法返回一个列表,如果xpath表达式只进行了定位,没有进行数据提取,那么列表中每个元素都将是一个Element对象。

「xpath表达式用法」

  1. 根据html元素层级进行定位
xpath表达式描述
/表示单个层级,放在开头表示html根元素
//表示多个层级(常用)
./表示当前标签
[@attr=value]根据属性进行定位
[index]根据元素所处位置进行定位,index从1开始
  1. 提取标签之间的文本数据
xpath表达式描述
/text()获取标签中的文本,返回一个列表
//text()可以获取标签中非直系的文本,返回一个列表
  1. 提取标签中指定属性的值
xpath表达式描述
/@attr获取标签中属性对应的值

数据解析实战

我们将通过一个案例具体说明

Wallhaven网站

需求:获取给定链接下的图片并下载保存到本地

import requests
import time
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36'
}
out_path = 'D:\\wallhaven'   # 下载图片保存目录,可自定义

start = 1   # 给定爬取起始页

def get_img():
    api_url = f'https://wallhaven.cc/toplist?page={start}'
    data = requests.get(api_url)
    data = data.text
    
    # 解析数据
    soup = BeautifulSoup(data, "html.parser")
    item_list = soup.find_all("a", class_='preview')  
    # 通过F12分析图片位置,找到a标签并且class为'preview'的数据

    for lst in item_list:
        url = lst.get('href')  # 从数据列表中获取属性href值  类似https://wallhaven.cc/w/we5ov6
        # 继续从上个url中获取图片数据并解析
        data1 = requests.get(url).text
        soup = BeautifulSoup(data1, "html.parser")

        its = soup.find_all('img', id='wallpaper')  # 获取源图片地址,大图,即为所需图片
        for wall in its:
            url2 = wall.get('src')
            res = requests.get(url=url2, headers=headers).content
            name = url2.split('/')[-1]
            img_save_path = out_path + '\\' + name
            with open(img_save_path, 'wb') as f:  # 存储图片
                f.write(res)  # 写入图片
                print(name + '    >>>>>>>>>>>>>>>>>>>>  下载完成')
                f.close()
                
# 循环下载主入口,粗略
while 1:
    get_img()
    time.sleep(5) 
    start += 1
	
	# 可自定义循环退出条件
    if start > 500:
        break



写在后面,爬取了一些二次元图如下:
在这里插入图片描述
看多了也就那样~~~

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

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

相关文章

操作系统(五)页面置换算法与分配策略

操作系统(五)页面置换算法与分配策略 一、页面置换算法 1、最佳置换算法(OPT) 每次选择淘汰的页面将是以后永不使用,或者在最长时间内不再被访问的页面,这样可以保证最低的缺页率 实际上就是从当前内存块…

【Kubernetes】【一】Kubernetes介绍

Kubernetes介绍 应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署在物理机上 优点:简单,不需要其它技术的参与 缺点:不能为应用程序定…

PDF SDK for Linux 8.4.2 Crack

PDF SDK for Linux 是适用于任何 Linux 企业或云应用程序的强大解决方案,非常适合需要完全可定制的 PDF 查看器或后端流程的任何 Linux 开发人员。 将 Foxit PDF SDK 嵌入到基于 Linux 的应用程序中非常容易。只需打开您最喜欢的 Linux IDE,复制您需要的…

电容笔和Apple pencil的区别有啥?学生党电容笔推荐

普通的电容笔与 Apple Pencil最大的区别在于,普通的电容笔没有像苹果电容笔那样的重力压感,而仅仅只有一个倾斜的压敢。但平替电容笔的其他性能也很不错,几乎和苹果 Pencil一样,而且平替电容笔的售价只需200元左右。目前&#xff…

react+antd+Table里切换Switch改变状态onChange 传参

场景&#xff1a;table列表里面&#xff0c;操作用Switch切换状态。对应列改变操作在colums里面// 表格行const colums: ColumnsType<potentialType> [{title: useLocale(创建时间),dataIndex: creation_date,key: creation_date,align: center,render: (v: string, rec…

【Python安全编程】Python实现网络主机和端口扫描

文章目录前言环境准备Python实现主机扫描基于ARP协议基于ICMP协议普通版本多线程版本Python实现端口扫描扫描单个端口利用多线程扫描端口后记前言 本文主要讲几个利用Python实现网络扫描的小例子&#xff0c;可以结合多线程或多进程编程改进实例 我曾经走过多遥远的路 跨越过多…

windows环境下安装Nginx及常用操作命令

windows环境下安装Nginx及常用操作命令nginx基本概述基本用途nginx安装nginx基本概述 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器。基本用途 nginx是一个轻量级高并发服务器&#xff0c;而tomcat并不是。nginx一般被用来做反向代理&#xff0c;将请求转发到应用…

The Social-Engineer Toolkit(社会工程学工具包)互联网第一篇全模块讲解

一、工具介绍 Social-Engineer Toolkit 是一个专为社会工程设计的开源渗透测试框架&#xff0c;可以帮助或辅助你完成二维码攻击、可插拔介质攻击、鱼叉攻击和水坑攻击等。SET 本身提供了大量攻击选项&#xff0c;可让您快速进行信任型攻击&#xff0c;也是一款高度自定义工具…

Fluent Python 笔记 第 14 章 可迭代的对象、迭代器和生成器

迭代是数据处理的基石。扫描内存中放不下的数据集时&#xff0c;我们要找到一种惰性获取数据项的方式&#xff0c;即按需一次获取一个数据项。这就是迭代器模式(Iterator pattern)。本章说明 Python 语言是如何内置迭代器模式的&#xff0c;这样就避免了自己手动去实现。 在 P…

Mask-RCNN(3) : 自定义数据集读取(VOC COCO)以及pycocotools的使用

文章目录1. COCO数据读取1.1 COCO数据集目录结构1.2 pycocotools的使用1.3 COCODetection类__init__方法__getitem__方法2. VOC数据读取2.1 VOC数据集目录结构2.2 VOCInstances类__init__方法2.3 __getitem__方法参考1. COCO数据读取 1.1 COCO数据集目录结构 下载并解压COCO数…

MySQL 6:MySQL存储过程、存储函数

MySQL 5.0 版本开始支持存储过程。存储过程是一组SQL语句&#xff0c;功能强大&#xff0c;可以实现一些复杂的逻辑功能&#xff0c;类似于JAVA语言中的方法&#xff1b;存储是数据库SQL语言层面的代码封装和复用。 存储过程有输入输出参数&#xff0c;可以声明变量&#xff0…

Android Monkey

1、Monkey&#xff08;Monkey是发送伪随机用户事件的工具&#xff09;介绍&#xff1a; Monkey测试是Android平台自动化测试的一种手段&#xff0c;通过Monkey程序模拟用户触摸屏幕、滑动Trackball、按键等操作来对设备上的程序进行压力测试&#xff0c;检测程序多久的时间会发…

安灯(andon)系统是车间现场管理的必备工具

安灯&#xff08;andon&#xff09;系统应用越来越广泛&#xff0c;不单单局限于汽车行业&#xff0c;更多生产型企业意识到了提高工作效率的重要性&#xff0c;提高工作效率根本的能提高生产水平&#xff0c;提高产量&#xff0c;而且安灯&#xff08;andon&#xff09;系统不…

python(16)--类

一、类的基本操作1.定义一个类格式&#xff1a;class Classname( )&#xff1a;内容&#x1f48e;鄙人目前还是一名学生&#xff0c;最熟悉的也就是学校了&#xff0c;所以就以学校为例子来建立一个类吧class School():headline"帝国理工大学"def schoolmotto(self):…

java 代码块 万字详解

概述 : 特点 : 格式 : 情景 : 细节 : 演示 : 英文 : //v&#xff0c;新版编辑器无手动添加目录的功能&#xff0c;PC端阅读建议通过侧边栏进行目录跳转&#xff1b;移动端建议用PC端阅读。&#x1f602;一、概述 :代码块&#xff0c;也称为初始化块&#xff0c;属于类中的成员&…

Vue3 如何实现一个带遮罩的 dialog 对话框

theme: mk-cute 开启掘金成长之旅&#xff01;这是我参与「掘金日新计划 12 月更文挑战」的第7天&#xff0c;点击查看活动详情 前言&#xff1a; 今天在项目中遇到了很多很多需要弹出一个对话框的场景&#xff0c;由于之前全都是通过 v-if 来控制这个组件的显示与否&#x…

【python游戏】让我们一起制作地球联邦阵营的战机,保护希望水晶,为人类的希望而战。

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 随着人类太空科技的飞速发展&#xff0c;希望水晶被越来越多的科学家当做核心能源来开发使用。 人类社会也因为水晶资源的争夺&#xff0c;开始逐渐分化成两派。 留在地球的普通人成立地球联邦&#xff0c;移居卫星的新人…

我对平衡二叉树的理解(比喻的方式)

传销是一种恶性的行销方式&#xff0c;主要手段就是激励其中的成员拉人头。 有个奇怪的传销组织&#xff0c;他们的传销规则是这样的&#xff1a; 每个人最多可以带着2人进该组织&#xff0c;其中1个年纪比自己大&#xff0c;另1个年纪比自己小新人都是由创始人找到。假如年纪…

中文关键词提取算法

中文关键词提取算法 如何提取query或者文档的关键词&#xff1f; 一般有两种解决思路&#xff1a; 有监督方法&#xff0c;把关键词提取问题当做分类问题&#xff0c;文本分词后标记各词的重要性打分&#xff0c;然后挑出重要的topK个词&#xff1b;无监督方法&#xff0c;使…

likeshop单商户SaaS版V1.8.2说明!

likeshop单商户SaaS版V1.8.2主要更新如下&#xff1a; 新增 前端登录引导用户填写头像昵称 PC端—注册页面显示服务协议和隐私政策 PC端—首次进入商城弹出协议提示 PC端—结算页新增门店自提的配送方式 后台—PC端菜单导航栏的跳转链接支持添加自定义链接 ​​ ​​ ​ 优…