python爬虫相关

news2024/11/15 17:54:50

目录

初识爬虫

爬虫分类 

网络爬虫原理

爬虫基本工作流程

搜索引擎获取新网站的url

robots.txt

HTHP协议

Resquests模块

前言:

安装

普通请求

会话请求

response的常用方法

简单案例

aiohttp模块

使用前安装模块

具体案例 

数据解析

re解析

bs4解析

bs4的主要解析器

具体使用方法

bs4中常用的四种对象

获取Tag对象常用方法

获取属性以及字符串内容方法

Xpath解析

前言

xpath节点关系

xpath语法

具体使用 

使用的xml

获取etree对象

通过etree对象获取元素

理解上面语法的案例 

初识爬虫

爬虫:通过编写代码,模拟正常用户使用浏览器的过程,使其能够在互联网上自动进行数据抓取

爬虫分类 

  • 通用爬虫:通用网络爬虫是搜索引擎抓取系统的重要组成部分,主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份
  • 聚焦爬虫:针对某一类数据进行采集的爬虫

网络爬虫原理

网络爬虫从互联网中搜索网页,采集信息,这些网页信息用于为搜索引擎建立索引从而提供支持,它决定了整个引擎系统是否内容丰富,信息是否及时,因此其性能优劣直接影响着搜索引擎的效果

爬虫基本工作流程

  1. 首先选取一部分种子URL,将这些url放入待抓取的队列
  2. 取出待抓取队列的url,解析DNS得到主机IP,并将URL对应的网页下载下来,存储到已下载的网页库中,并将这些url放入已抓取的url队列
  3. 分析已抓取的url队列中的url,分析其中的其他url,并且将该url放入待抓取的url队列中,进入下一个循环

搜索引擎获取新网站的url

  • 新网站搜索引擎主动提交网址(如百度:http://zhanzhang.baidu.com/linksubmit/url)
  • 在其他网站上设置新的网站外链
  • 搜索引擎和DNS服务商合作,新网站域名被迅速抓取

robots.txt

前言:

  • robots.txt是存放在网站根目录下的文本文件,比如https://www.baidu.com/robots.txt
  • robots.txt用来告诉爬虫,那些内容是不应该被爬取的,那些是可以被爬取的

注意:

  • 因为一些系统中的url是大小写敏感的,所以robots.txt的文件名应统一为小写
  • 它并不是一个规范,而只是约定俗成的,所以并不能保证网站的隐私(只能防君子,不能防小人)

HTHP协议

前言:http协议为下面的requests模块学习做基础

http协议入口:http协议

Resquests模块

前言:

  • 在python3中常用的网络模块有两个(urllib、requests)虽然在python标准库中urllib模块已经包含了平常我们使用的大多数功能,但是他的API使用起来让人感觉不太好,而requests自称"http for humans"说明使用更简洁方便
  • requests继承了urllib2的所有特性,requests支持http链接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化url和post数据自动编码
  • requests是唯一一个非转基因的python的http库,人类可以安全使用,其底层实现就是urllib3

安装

打开命令行:pip install requests

注意:使用时先导入requests模块:import requests 

普通请求

get:response=request.get(url="url地址",headers={"key":"value"},params={"key":"value"},proxies={"协议":"协议://代理IP:端口号"})

post:response=requests.post(url="url地址",headers={"key":"value"},data={"key":"value"},proxies={"协议":"协议://代理IP:端口号"})

会话请求

获取session对象:session=requests.session()

get:response=session.get(url="url地址",headers={"key":"value"},params={"key":"value"},proxies={"协议":"协议://代理IP:端口号"})

post:response=session.post(url="url地址",headers={"key":"value"},data={"key":"value"},proxies={"协议":"协议://代理IP:端口号"})

注意:

  • 上面的传递参数由于url后面参数顺序不同,因此要用关键字传参方式
  • get请求的url地址需要加?,而post请求的url地址不需要加? 
  • 使用同一个session进行请求,那么浏览器就知道一直请求的是你
  • 若设置请求头的cookie,那么不用session对象也可以达到相同效果
  • 代理的协议与自己访问url的协议保持一致
  • 代理原理,将自己发的请求先发给代理后代理帮你把请求发给目标地址

response的常用方法

设置编码格式为UTF-8:reponse.encoding="UTF-8"

查看返回的文本数据:变量=response.text

查看具有的cookie:变量=response.cookies

拿到响应内容:变量=response.content(这里拿到的是字节)

查看完整的url地址:变量=response.url

查看响应头部的字节编码:变量=response.encoding

查看响应状态码:变量=response.status_code

关闭response:response.close()

简单案例

#导入网络请求的第三方模块
import requests
headers={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.188"
}
kw={
    "wd":"python"
}
#通过requests模拟发送网络请求params=kw
response=requests.get("https://www.baidu.com/?",headers=headers,params=kw)
#手动设置编码格式
response.encoding="UTF-8"
#查看文本数据,返回的是Unicode数据
print(response.text)
#查看相应内容,返回的是字节流数据
print(response.content)
#查看完整的url地址
print(response.url)
#查看响应头部的字节编码
print(response.encoding)
#查看响应状态码
print(response.status_code)
#关掉response
response.close()

aiohttp模块

前言:我们之前使用的requests.get()等方法都是同步的方法,如今我们需要执行异步操作

使用前安装模块

导入asyncio模块:import asyncio

导入aiohttp模块:import aiohttp

具体案例 

import aiohttp
import asyncio
async def main():
    async with aiohttp.ClientSession() as session:
        async with session.get('https://limestart.cn/') as resp:
            #打印状态码
            print(resp.status)
            #注意text有括号说明是个函数调用所以加await
            print(await resp.text())
            #打印内容
            print(await resp.content.read())
asyncio.run(main())

注意:

  • with语句作用:加了with后就会有上下文的管理器,有了上下文管理,那么当我们的with操作完事后,就会自动的关流。
  • 异步请求和同步请求的步骤大同小异,可以相互借鉴(传递参数,请求头,以及相应resp方法)

数据解析

re解析

理解:re解析即正则表达式解析,对于具体正则表达事,请详见我另一篇文章

正则表达式入口:python之正则表达式

bs4解析

前言:bs4即BeautifulSoup,是python中的一种库,其可以从html或者xml文件中提取数据,他能够通过你喜欢的转换器实现惯用文档导航,查找、修改、文档的方式,beautiful soup会帮你节省数小时甚至数天的工作时间

使用前需要安装:pip install bs4

安装后需要导入模块:from bs4 import BeautifulSoup

bs4的主要解析器

注意:解析器的主要作用是将前面的文件用什么方式进行解析

具体使用方法

创建soup对象:soup=BeautifulSoup("html文本","解析器")

注意:python默认的解析器为html.parser

bs4中常用的四种对象

  • Tag:标签,html中的标签
  • NavigableString:字符串,主要是标签内的字符串
  • BeautifulSoup:最先生成的Soup对象
  • Comment:注释部分,一般用不到

获取Tag对象常用方法

Tag对象=find("标签名",attrs={"属性名":"属性值"})

作用:返回匹配到的第一个标签

ResultSet对象=find_all("标签名",attrs={"属性名":"属性值"})

作用:返回所有的匹配值

注意:find两个函数主要是通过html的标签和属性名共同确定一个要查找的对象,但是也可以仅用标签名来查找。

获取属性以及字符串内容方法

字符串=Tag对象.text

作用:拿到被标签标记的内容(就是被标签夹着的字符串)

字符串=Tag对象.get("属性名")

作用:从Tag对象中拿到拿到对应属性的值

Xpath解析

前言

  • xpath是一门在html/xml文档中查找信息的一门语言,可用来在html/xml文档中对元素和属性进行遍历
  • html是xml的一个子集

含义:xpath全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言,它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索

xpath节点关系

节点:每个html标签我们都称之为节点(根节点、子节点,兄弟节点)

<html><!--根节点-->
    <head><!--子节点-->
        <title>节点的关系</title>
    </head>
    <body>
        <div>实验</div>
    </body>
</html>
<!--注意,head标签和body标签同属于兄弟节点-->

xpath语法

前言:xpath使用路径表达式来选取xml文档中节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式十分相似

表达式描述
nodename选中该元素
/从根节点选取,或者是元素和元素间的过度
//可以跨节点获取标签
.(点)选取当前节点
..选取当前节点的父节点
nodename[@属性名='属性值']选取特定属性的nodename元素
@属性名获取元素属性的值
text()选取元素文本内容
nodename[n]得到的多个节点中选取第n个节点
*通配符

注意:点方法需要对标签进行第一次提取,获取标签对象之后,通过点的方式获取当前标签的方法可以获得他的下一级标签 

具体使用 

使用前安装:pip install lxml

安装后导入:from lxml import etree 

使用的xml

<book>
    <id>1</id>
    <name>野花遍地香</name>
    <price>1.23</price>
    <nick>臭豆腐</nick>
    <author>
        <nick id="10086">周大强</nick>
        <nick id="10010">周芷若</nick>
        <nick class="joy">周杰伦</nick>
        <nick class="jolin">蔡依林</nick>
        <div>
            <nick>刘谦</nick>
        </div>
        <span>
            <nick>高达</nick>
        </span>
    </author>
    <partner>
        <nick id="ppc">胖胖不沉</nick>
        <nick id="ppbc">陈陈不胖</nick>
    </partner>
</book>

获取etree对象

etree对象=etree.XML("xml内容")

etree对象=etree.HTML("html内容")

etree对象=etree.parse("文件名")

通过etree对象获取元素

变量=etree对象.xpath("路径表达式")

理解上面语法的案例 

获取book元素

book1=tree.xpath("/book")
print(book1)#[<Element book at 0x135b5575f00>]
book2=tree.xpath("/book/author/..")
print(book2)#[<Element book at 0x135b5575f00>]
book3=tree.xpath("/book/.")
print(book3)#[<Element book at 0x135b5575f00>]

获取book里的name元素的文本

text=tree.xpath("/book/name/text()")
print(text)#['野花遍地香']

获取author下面的所有nick元素文本

nick=tree.xpath("/book/author//nick/text()")
print(nick)#['周大强', '周芷若', '周杰伦', '蔡依林', '刘谦', '高达']

获取author和partner元素之下一级的nick元素文本

nickname=tree.xpath("/book/*/nick/text()")
print(nickname)#['周大强', '周芷若', '周杰伦', '蔡依林', '胖胖不沉', '陈陈不胖']

获取author下的第一个nick的元素文本

nick_one=tree.xpath("/book/author/nick[1]/text()")
print(nick_one)#['周大强']

获取id为10010元素的内容

nick_id=tree.xpath("//nick[@id='10010']/text()")
print(nick_id)#['周芷若']

获取周芷若id的值

nick_id_name=tree.xpath("/book/author/nick[2]/@id")
print(nick_id_name)#['10010']

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

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

相关文章

Appium2 安装步骤

自 2022 年 1 月 1 日起&#xff0c;Appium 不再维护 Appium 1.x&#xff0c;官方支持的平台驱动程序的所有最新版本均不兼容 Appium 1.x&#xff0c;需要 Appium 2 才能运行。开启了全新的Appium 2.0之旅。可通过官方文档查看Appium2 移除的功能和新增的功能。 第一步、安装 …

io_uring笔记

目录 io_uring 异步io_uring 使用对比于epoll的效果io_uring效果好在哪&#xff1f; io_uring 异步 要求内核linux 5.10 异步四元组&#xff1a;1、init&#xff08;create&#xff09;2、commit 3、callback 4、destory fio : 测iops一秒钟读写磁盘的次数 方式磁盘iopsio_ur…

TCPDF生成PDF文件,含jpjraph生成雷达图

TCPDF生成PDF文件&#xff0c;含jpjraph生成雷达图 依赖自行安装 "tecnickcom/tcpdf": "^6.6","amenadiel/jpgraph": "4"雷达图生成 中文字体添加安装 没有封装&#xff0c;只作为测试案例展示 // 创建新的PDF文档$pdf new \TCPD…

throw和throws的区别

在Java中&#xff0c;throw和throws是两个关键字&#xff0c;用于异常处理。它们具有以下区别&#xff1a; 1. throw关键字&#xff1a; - throw关键字用于主动抛出异常。当程序执行到throw语句时&#xff0c;会创建一个异常对象并将其抛出。 - throw语句通常在方法内部…

fastadmin、vue、react图标库适用于多种框架

在二开fastadmin中&#xff0c;在写vue以及react时&#xff0c;侧边导航栏以及按钮中常常需要很多图标&#xff0c;那么这些图标应该去哪里得到呢&#xff0c;在这里给大家一个链接&#xff0c;这里有丰富的图标库&#xff0c;可以找到自己想要的进行使用。 点击下方链接&…

(树) 剑指 Offer 34. 二叉树中和为某一值的路径 ——【Leetcode每日一题】

❓ 剑指 Offer 34. 二叉树中和为某一值的路径 难度&#xff1a;中等 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a…

opencv 基础50-图像轮廓学习03-Hu矩函数介绍及示例-cv2.HuMoments()

什么是Hu 矩&#xff1f; Hu 矩&#xff08;Hu Moments&#xff09;是由计算机视觉领域的科学家Ming-Kuei Hu于1962年提出的一种图像特征描述方法。这些矩是用于描述图像形状和几何特征的不变特征&#xff0c;具有平移、旋转和尺度不变性&#xff0c;适用于图像识别、匹配和形状…

微信小程序 地图map(电子围栏圆形和多边形)

正常情况下是没有手机上画电子围栏的&#xff0c;公共平台上我也没找到&#xff0c;所以走了一个歪点子&#xff0c;就是给地图添加点击事件&#xff0c;记录点的位置&#xff0c;在画到电子围栏上就是添加电子围栏了&#xff0c;如果只是显示电子围栏就简单了 一、多边形电子…

kubernetes中的kubectl命令详解

kubectl命令详解 一&#xff1a;陈述式资源管理方法&#xff1a;&#xff08;1&#xff09;简单的基础命令1.查看版本信息2.查看资源对象简写3.查看集群信息4.配置kubectl自动补全5.node节点查看日志 &#xff08;2&#xff09;基本信息查看1.查看 master 节点状态2.查看命名空…

黑马大数据学习笔记4-Hive部署和基本操作

目录 思考规划安装MySQL数据库修改root用户密码配置Hadoop下载解压Hive提供MySQL Driver包配置Hive初始化元数据库启动Hive&#xff08;使用Hadoop用户&#xff09;Hive体验HiveServer2HiveServer2服务启动 Beeline p48、51、52 https://www.bilibili.com/video/BV1WY4y197g7/?…

《合成孔径雷达成像算法与实现》Figure3.9

代码复现如下&#xff1a; clc clear close all% 参数设置 TBP 100; % 时间带宽积 T 7.2e-6; % 脉冲持续时间 t_0 1e-6; % 脉冲回波时延% 参数计算 B TBP/T; …

计网实验第三章:TCP

问题集一 问题一 客户端计算机(源)使用的IP地址和TCP端口号是什么&#xff1f;将文件传输到gaia.cs.umass.edu? 图1 答&#xff1a;如图1中所示&#xff1a;192.168.31.7 &#xff0c;80 问题二 gaia.c.s.umass.edu的IP地址是什么?发送的端口号是什么并接收此连接的TCP段…

VR内容定制 | VR内容中控管理平台可以带来哪些价值?

随着科技的不断发展&#xff0c;虚拟现实(VR)技术已经逐渐渗透到各个领域&#xff0c;其中教育领域也不例外。通过VR技术&#xff0c;学生可以身临其境地参与到各种场景中&#xff0c;获得更加直观、生动的学习体验。为了让教师更好地进行VR教学的设计和管理&#xff0c;提高教…

Mac电脑如何把照片以文件格式导出?

在Mac电脑上&#xff0c;我们经常会拍摄、保存和编辑各种照片。有时候&#xff0c;我们可能需要将这些照片以文件形式导出&#xff0c;以便与他人共享、打印或备份。无论您是要将照片发送给朋友、上传到社交媒体&#xff0c;还是保存到外部存储设备&#xff0c;导出照片为文件是…

Wlan——射频和天线基础知识

目录 射频的介绍 射频和Wifi 射频的相关基础概念 射频的传输 信号功率的单位 射频信号传输行为 天线的介绍 天线的分类 天线的基本原理 天线的参数 射频的介绍 射频和Wifi 什么是射频 从射频发射器产生一个变化的电流&#xff08;交流电&#xff09;&#xff0c;通过…

Java后端开发需要学什么课程,能够帮助就业

Java后端开发需要学什么课程&#xff0c;学习内容对于想要在Java就业的同学来说非常重要。以下是一些关键的学习内容&#xff0c;可以帮助他们在Java领域获得就业机会&#xff1a; Java核心知识&#xff1a;掌握Java编程语言的基本语法、面向对象编程、异常处理、集合框架等核心…

[保研/考研机试] KY102 计算表达式 上海交通大学复试上机题 C++实现

描述 对于一个不存在括号的表达式进行计算 输入描述&#xff1a; 存在多组数据&#xff0c;每组数据一行&#xff0c;表达式不存在空格 输出描述&#xff1a; 输出结果 示例1 输入&#xff1a; 6/233*4输出&#xff1a; 18思路&#xff1a; ①设立运算符和运算数两个…

并发——synchronized 关键字

文章目录 1.说一说自己对于 synchronized 关键字的了解2. 说说自己是怎么使用 synchronized 关键字3. 构造方法可以使用 synchronized 关键字修饰么&#xff1f;4. 讲一下 synchronized 关键字的底层原理4.1. synchronized 同步语句块的情况4.2. synchronized 修饰方法的的情况…

多用户跨境电商商品库系统快速搭建(全开源)

搭建一个多用户跨境电商商品库系统需要以下步骤&#xff1a; 1. 确定系统需求&#xff1a;首先&#xff0c;需要明确系统的功能需求&#xff0c;包括商品管理、订单管理、用户管理、支付管理等。根据具体需求确定系统的功能和界面设计。 2. 确定技术栈&#xff1a;选择合适的…

Redis简单学习

Redis是一个基于内存的key-value结构数据库 linux上面安装&#xff1a; Redis存储的是key-value结构的数据&#xff0c;其中key是字符串&#xff0c;value有常见的5中数据类型&#xff1a; 字符串 string哈希 hash列表 list集合 set有序集合 sorted set 字符串常用操作&am…