Python爬虫详解

2023-11-08

初识爬虫

爬虫的概念

什么是爬虫

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

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

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

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

爬虫合法性探究

爬虫可能带来的风险?

  • 爬虫干扰了被访问网站的正常运营
  • 爬虫抓取了受到法律保护的特定类型的数据或信息

如何合理地使用爬虫?

  • 对爬虫程序进行优化,避免干扰网站的正常运行
  • 不要爬取涉及商业机密等敏感信息

爬虫的君子协议

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

20230113122447

爬虫的分类

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

  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?query=猫羽雫'
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太乱了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python爬虫详解 的相关文章

  • 在 python 的 Visual Studio 工具中按下 ctrl+F5 后,控制台窗口立即关闭

    我已经安装了 Visual Studio 的 Python 工具 但在控制台窗口中看不到输出 就像我在 Visual Studio 中运行 C 控制台应用程序时按以下快捷键时看到的输出一样 F5 开始调试程序并关闭 C 和 Python 中
  • 使用Python的工业视觉相机[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 python 2 和 3 的spyder之间切换

    根据我在文档中了解到的内容 它指出您只需使用命令提示符创建一个新变量即可轻松在 2 个 python 环境之间切换 如果我已经安装了 python 2 7 则 conda create n python34 python 3 4 anaco
  • 如何有条件地组合两个相同形状的 numpy 数组

    这听起来很简单 但我想我把它想得太复杂了 我想创建一个数组 其元素是从两个形状相同的源数组生成的 具体取决于源数组中哪个元素更大 为了显示 import numpy as np array1 np array 2 3 0 array2 np
  • 如何用spaCy获取依赖树?

    我一直在尝试寻找如何使用 spaCy 获取依赖树 但我找不到任何有关如何获取树的信息 只能在如何导航树 https spacy io usage examples subtrees 如果有人想轻松查看 spacy 生成的依赖关系树 一种解决
  • 蟒蛇 |如何将元素随机添加到列表中

    有没有一种方法可以将元素随机添加到列表中 内置函数 ex def random append lst a lst append b lst append c lst append d lst append e return print ls
  • 使用 Python 解析 XML,解析外部 ENTITY 引用

    在我的 S1000D xml 中 它指定了一个带有对公共 URL 的引用的 DOCTYPE 该 URL 包含对包含所有有效字符实体的许多其他文件的引用 我使用 xml etree ElementTree 和 lxml 尝试解析它并得到解析错
  • 如何将同步函数包装在异步协程中?

    我在用着aiohttp https github com aio libs aiohttp构建一个 API 服务器 将 TCP 请求发送到单独的服务器 发送 TCP 请求的模块是同步的 对于我来说是一个黑匣子 所以我的问题是这些请求阻塞了整
  • 在 GAE/Python 中放置一次性代码和每次代码的最佳位置在哪里?

    我是 Google App Engine 和 Python 的新手 我无法理解有关在 Google App Engine 上运行的 Python 应用程序的一些基本问题 如果我想要执行代码 对于每个传入的请求 我应该将其放在哪里 我们正在捕
  • 如何解码 dtype=numpy.string_ 的 numpy 数组?

    我需要使用 Python 3 解码按以下方式编码的字符串 gt gt gt s numpy asarray numpy string hello nworld gt gt gt s array b hello nworld dtype S1
  • Pandas,按最大返回值进行分组 AssertionError:

    熊猫有问题 我想听听你的意见 我有这个数据框 我需要在其中获取最大值 代码就在下面 df stack pd DataFrame 1 0 2016 0 NonResidential Hotel 98101 0 DOWNTOWN 47 6122
  • 如何使用注释和聚合在 Django 的 ORM 中执行此 GROUP BY 查询

    我真的不知道如何翻译GROUP BY and HAVING到姜戈的QuerySet annotate and QuerySet aggregate 我正在尝试将这个 SQL 查询转换为 ORM 语言 SELECT EXTRACT year
  • 别碰我的女人

    我讨厌的一件事迪斯图尔斯 http docs python org distutils 我猜他是邪恶的人 他这样做了 https github com python cpython blob 300dd552b15825abfe0e367a
  • Matplotlib 将颜色图 tab20 更改为三种颜色

    Matplotlib 有一些新的且非常方便的颜色图 选项卡颜色图 https matplotlib org examples color colormaps reference html 我错过的是生成像 tab20b 或 tab20c 这
  • django如何将字符串转换为模块?

    我试图了解 django 的另一个神奇之处 它可以将字符串转换为模块 In settings py INSTALLED APPS声明如下 INSTALLED APPS django contrib auth django contrib c
  • Scikit Learn - K-Means - 肘部 - 标准

    今天我想学习一些关于 K means 的知识 我已经了解该算法并且知道它是如何工作的 现在我正在寻找正确的 k 我发现肘部准则作为检测正确的 k 的方法 但我不明白如何将它与 scikit learn 一起使用 在 scikit learn
  • dask allocate() 或 apply() 中的变量列名

    我有适用于pandas 但我在将其转换为使用时遇到问题dask 有一个部分解决方案here https stackoverflow com questions 32363114 how do i change rows and column
  • SpaCy 中的自定义句子边界检测

    我正在尝试在 spaCy 中编写一个自定义句子分段器 它将整个文档作为单个句子返回 我编写了一个自定义管道组件 它使用以下代码来执行此操作here https github com explosion spaCy issues 1850 但
  • 字母尺度和随机文本上的马尔可夫链

    我想使用 txt 文件中的一本书中的字母频率生成随机文本 以便每个新字符 string lowercase 取决于前一个 如何使用马尔可夫链来做到这一点 或者使用每个字母都有条件频率的 27 个数组更简单 我想使用来自的字母频率生成随机文本
  • Python - 打印漂亮的 XML 为空标签文本创建开始和结束标签

    我正在编写一个 python 应用程序 它创建一个 ElementTree XML 然后使用 minidom 的 toprettyxml 将其写入文件 final tree minidom parseString ET tostring r

随机推荐

  • Python 3 安装 redis 客户端

    1 去GIThub 上下载 redis py 2 然后进入源码目录 执行 sudo python3 setup py install 就可以了 这里踩了一个坑 就是我按照GITHub上介绍的方式 sudo python setup py i
  • 区块链矿工如何以七个步骤处理挖掘工作并进行交易

    你有没有想过区块链的挖掘过程如何进行的 或者你的交易如何得到确认并添加到了区块链 好吧 我也是如此 由于我找不到任何明确的逐步解释这个过程文章 我决定深入研究并自己编写指南 以下是区块链交易如何通过七个步骤从你的钱包处理到区块链中 imag
  • git 第一次push error: failed to push some refs to

    第一次将本地文件push到远程时报错 error failed to push some refs to 远程地址 原因可能是github仓库中的README md文件不在本地代码目录中或要先pull 遇到错误要善用git的提示 报错信息后
  • yolov7 paper阅读笔记

    不同于现有的主流方法 yolov7的主要改进点在优化训练过程 包括优化modules 和 优化方法 这些会加强traing cost从而提高object detect的accuracy 但是不会提高inference cost 时间开销 这
  • calibrate_camera函数示例

    好的 下面是一个使用 Python 语言的 calibrate camera 函数示例 import numpy asnp import cv2 def calibrate camera images pattern size 准备对象点和
  • OSSEC直接向GMAIL发送alert的配制方法

    按照mannul的介绍 直接在ossec conf中配置如下
  • 手把手教你使用TensorFlow训练出自己的模型

    手把手教你使用TensorFlow训练出自己的模型 一 前言 搭建TensorFlow开发环境一直是初学者头疼的问题 为了帮忙初学者快速使用TensorFlow框架训练出自己的模型 作者开发了一款基于TensorFlow 2 3 0的图形化
  • java asynccallback_使用 AsyncCallback 处理异步调用

    参考文章 原文 异步调用可以避免主线程受工作线程阻塞 即工作线程执行的过程中 主线程依然可以往下运行 不必等待工作线程完成 下面是一个简单的异步调用加法函数的例子 using System using System Threading th
  • 肺部ct重建_肺部CT血管分割及三维重建

    摘要 现代社会人们的生活水平不断改善 由于膳食不合理以及锻炼的缺乏 我国血管类疾病发生率不断攀高 传统的逐张读片的诊断方式效率低下且依赖于医生个人的知识储备 本文以肺部CT序列为着重点 对其中的血管结构进行分割 使用三维重建技术对分割结果进
  • Git入门与使用 (三) 使用GitHub进行代码托管的相关操作

    文章目录 一 前言 二 使用GitHub进行代码托管的相关操作 1 推送本地仓库内容至远程仓库 2 克隆远程仓库内容至本地仓库 3 邀请他人加入项目团队 4 拉取远程仓库修改的内容 5 解决协同开发时产生的冲突 6 跨团队协作开发 7 Gi
  • 线性代数 --- 矩阵求逆的4种方法

    线性代数 矩阵求逆的4种方法 写在最前面 在大多数情况下 我们学习线性代数的目的是为了求解线性方程组Ax b 而不是为了求A的逆 单就解方程而言 LU分解是最实用的算法 只需按照A LU gt Ax b LUx b gt Ly b 正向回代
  • Redhat6.5的云主机停在某一个状态,不能继续启动

    Redhat6 5的云主机停在某一个状态 不能继续启动 1 现象 云主机 不能启动 状态如图 2 分析及诊断 制作云主机快照 导入到virt manager环境 使用guestfish工具 移除了 ss5 尝试启动 启动成功了 移除后 et
  • Oracle中group by用法

    Oracle中group by用法 在select 语句中可以使用group by 子句将行划分成较小的组 一旦使用分组后select操作的对象变为各个分组后的数据 使用聚组函数返回的是每一个组的汇总信息 使用having子句 限制返回的结
  • sql用于判断的函数decode\case when then else语法

    简单的判断可以用decode函数 例如 如果字段a是null 值为0 如果是 值也为0 否则就是a的值 select decode a null 0 0 a from table 当需要有多个条件并列的时候 用case when then
  • 物联网技术和计算机网络技术,物联网技术下计算机网络技术专业建设探讨

    摘 要 物联网应用领域的高速扩张为高校人才培养带来新的机遇和挑战 本文论述了计算机网络技术专业开设物联网方向的必要性和可行性 研究结合学院行业资源及优势专业培养网络技术专业人才的新思路 提出融合多专业的以智慧交通 智慧物流等物联网应用为特色
  • springboot 微信小程序支付

    简单对支付封装 使用到maven 依赖 版本依照自己项目情况自行添加
  • 惠普136nw打印机清零_HP打印机清零方法(冷复位恢复出厂设置)

    一体机的 冷复位 可以将一体机内部的程序恢复到出厂时的设置 通过此操作 可以解决以下问题 随机驱动程序版本高于 V6 0 以后的一体机 连接电脑时可以通过软件查看墨水余量 这部 分一体机如果执行冷复位 会将墨水信息清除 这时将 无法识别该墨
  • 过TP保护与解除游戏驱动保护

    名称 Nakd KiAttachProcess 功能 My RecoveryHook KiAttachProcess的中继函数 参数 返回 static NAKED VOID Nakd KiAttachProcess asm mov edi
  • (9.1.1)线性代数之行列式

    1 行列式的基本公式 2 行列式的基本性质 3 行列式的求值 4 克拉默法则求解方程组 5 典型例题 1 行列式的基本公式 公式1 公式2 公式3 2 行列式的基本性质 性质1 行列式与它的转置行列式相等 性质2 互换行列式的两行 列 行列
  • Python爬虫详解

    初识爬虫 爬虫的概念 什么是爬虫 爬虫 通过编写程序 模拟浏览器上网 并抓取有价值的数据的过程 反爬虫 门户网站通过制定相应的策略或技术手段 来阻止爬虫程序对其网站数据的爬取 反反爬 爬虫程序可以采用一些技术手段 来绕过或破坏门户网站的反爬