当前位置: 首页 > news >正文

Python爬虫详解:原理、常用库与实战案例

前言

请添加图片描述

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:https://www.captainbed.cn/z
请添加图片描述

ChatGPT体验地址

请添加图片描述

文章目录

  • 前言
  • 引言:
  • 一、爬虫原理
    • 1. HTTP请求与响应过程
    • 2. 常用爬虫技术
  • 二、Python爬虫常用库
    • 1. 请求库
    • 2. 解析库
    • 3. 存储库
  • 三、编写一个简单的Python爬虫
  • 四、爬虫实战案例
    • 1. 分析网站结构
    • 2. 编写爬虫代码
  • 五、爬虫注意事项与技巧
  • 结语:

引言:

随着互联网的快速发展,数据成为了新时代的石油。Python作为一种高效、易学的编程语言,在数据采集领域有着广泛的应用。本文将详细讲解Python爬虫的原理、常用库以及实战案例,帮助读者掌握爬虫技能。
在这里插入图片描述

一、爬虫原理

爬虫,又称网络爬虫,是一种自动获取网页内容的程序。它模拟人类浏览网页的行为,发送HTTP请求,获取网页源代码,再通过解析、提取等技术手段,获取所需数据。

1. HTTP请求与响应过程

爬虫首先向目标网站发送HTTP请求,请求可以包含多种参数,如URL、请求方法(GET或POST)、请求头(Headers)等。服务器接收到请求后,返回相应的HTTP响应,包括状态码、响应头和响应体(网页内容)。

2. 常用爬虫技术

(1)请求库:如requests、aiohttp等,用于发送HTTP请求。
(2)解析库:如BeautifulSoup、lxml、PyQuery等,用于解析网页内容。
(3)存储库:如pandas、SQLite等,用于存储爬取到的数据。
(4)异步库:如asyncio、aiohttp等,用于实现异步爬虫,提高爬取效率。

二、Python爬虫常用库

1. 请求库

(1)requests:简洁、强大的HTTP库,支持HTTP连接保持和连接池,支持SSL证书验证、Cookies等。
(2)aiohttp:基于asyncio的异步HTTP网络库,适用于需要高并发的爬虫场景。

2. 解析库

(1)BeautifulSoup:一个HTML和XML的解析库,简单易用,支持多种解析器。
(2)lxml:一个高效的XML和HTML解析库,支持XPath和CSS选择器。
(3)PyQuery:一个Python版的jQuery,语法与jQuery类似,易于上手。

3. 存储库

(1)pandas:一个强大的数据分析库,提供数据结构和数据分析工具,支持多种文件格式。
(2)SQLite:一个轻量级的数据库,支持SQL查询,适用于小型爬虫项目。

三、编写一个简单的Python爬虫

以爬取豆瓣电影TOP250为例,讲解如何编写一个简单的Python爬虫。

  1. 设计爬虫需求
    爬取豆瓣电影TOP250的电影名称、评分、导演等信息。
  2. 编写代码
    (1)使用requests库发送HTTP请求,获取网页源代码。
    (2)使用BeautifulSoup库解析网页内容,提取所需数据。
    (3)使用pandas库存储数据,并保存为CSV文件。
  3. 运行爬虫并展示结果
import requests
from bs4 import BeautifulSoup
import pandas as pd
# 豆瓣电影TOP250的基础URL
base_url = 'https://movie.douban.com/top250'
# 定义一个函数来获取页面内容
def get_page_content(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}response = requests.get(url, headers=headers)if response.status_code == 200:return response.textelse:print('请求页面失败:', response.status_code)return None
# 定义一个函数来解析页面内容
def parse_page_content(html):soup = BeautifulSoup(html, 'html.parser')movie_list = soup.find_all('div', class_='item')movies = []for movie in movie_list:title = movie.find('span', class_='title').get_text()rating = movie.find('span', class_='rating_num').get_text()director = movie.find('p', class_='').find('a').get_text()movies.append({'title': title, 'rating': rating, 'director': director})return movies
# 定义一个函数来保存数据到CSV文件
def save_to_csv(movies):df = pd.DataFrame(movies)df.to_csv('douban_top250.csv', index=False, encoding='utf_8_sig')
# 主函数,用于运行爬虫
def main():movies = []for i in range(0, 250, 25):  # 豆瓣电影TOP250分为10页,每页25部电影url = f'{base_url}?start={i}&filter='html = get_page_content(url)if html:movies.extend(parse_page_content(html))save_to_csv(movies)print('爬取完成,数据已保存到douban_top250.csv')
# 运行主函数
if __name__ == '__main__':main()

在实际使用中,需要根据豆瓣网站的实际情况调整以下内容:

  1. URL和参数:根据豆瓣电影的URL结构和参数进行设置。
  2. BeautifulSoup选择器:根据网页源代码的结构编写正确的选择器来提取数据。
    此外,为了遵守网站的使用协议和法律法规,请确保在编写爬虫时遵循以下几点:
  • 遵守Robots协议,不爬取网站禁止爬取的内容。
  • 设置合理的请求间隔,避免对网站服务器造成过大压力。
  • 如果遇到网站的反爬措施,如验证码、IP封禁等,请合理应对,遵守网站规定。
  • 使用爬虫获取的数据请勿用于商业目的或侵犯他人隐私。
    最后,由于网站结构可能会发生变化,上述代码可能需要根据实际情况进行调整。在实际应用中,请确保您的爬虫行为合法合规。

四、爬虫实战案例

以爬取某招聘网站职位信息为例,讲解如何编写一个实用的Python爬虫。

1. 分析网站结构

通过观察招聘网站的URL、参数和页面结构,找到职位信息的来源。

2. 编写爬虫代码

(1)使用requests库发送带参数的HTTP请求,获取职位列表。
(2)使用lxml库解析职位列表,提取职位详情页URL。
(3)使用PyQuery库解析职位详情页,提取职位信息。
(4)使用SQLite数据库存储职位信息。
3. 结果展示与分析

import requests
from lxml import etree
from pyquery import PyQuery as pq
import sqlite3
# 创建或连接SQLite数据库
conn = sqlite3.connect('job.db')
cursor = conn.cursor()
# 创建职位信息表
cursor.execute('CREATE TABLE IF NOT EXISTS job (id INTEGER PRIMARY KEY, title TEXT, salary TEXT, company TEXT, location TEXT)')
# 分析网站结构后得到的职位列表URL
url = 'https://www.example.com/jobs'
# 发送HTTP请求获取职位列表
params = {'page': 1,  # 假设页面参数为page,这里请求第1页'city': 'beijing'  # 假设城市参数为city,这里请求北京地区的职位
}
response = requests.get(url, params=params)
response.encoding = 'utf-8'  # 设置字符编码,防止乱码
# 使用lxml解析职位列表,提取职位详情页URL
html = etree.HTML(response.text)
job_list = html.xpath('//div[@class="job-list"]/ul/li/a/@href')  # 假设职位详情页URL在a标签的href属性中
# 遍历职位详情页URL,爬取职位信息
for job_url in job_list:job_response = requests.get(job_url)job_response.encoding = 'utf-8'job_html = pq(job_response.text)# 使用PyQuery解析职位详情页,提取职位信息title = job_html('.job-title').text()  # 假设职位名称在class为job-title的元素中salary = job_html('.job-salary').text()  # 假设薪资信息在class为job-salary的元素中company = job_html('.job-company').text()  # 假设公司名称在class为job-company的元素中location = job_html('.job-location').text()  # 假设工作地点在class为job-location的元素中# 存储职位信息到SQLite数据库cursor.execute('INSERT INTO job (title, salary, company, location) VALUES (?, ?, ?, ?)', (title, salary, company, location))conn.commit()
# 关闭数据库连接
cursor.close()
conn.close()

在实际使用中,需要根据目标网站的实际情况调整以下内容:

  1. URL和参数:根据目标网站的URL结构和参数进行设置。
  2. Xpath表达式:根据网页源代码的结构编写正确的Xpath表达式来提取数据。
  3. PyQuery选择器:根据网页源代码的结构编写正确的CSS选择器来提取数据。
  4. 数据库操作:根据需要创建合适的数据库表结构,并插入数据。
    此外,为了遵守网站的使用协议和法律法规,请确保在编写爬虫时遵循以下几点:
  • 遵守Robots协议,不爬取网站禁止爬取的内容。
  • 设置合理的请求间隔,避免对网站服务器造成过大压力。
  • 如果遇到网站的反爬措施,如验证码、IP封禁等,请合理应对,遵守网站规定。
  • 使用爬虫获取的数据请勿用于商业目的或侵犯他人隐私。

五、爬虫注意事项与技巧

  1. 遵循Robots协议
    尊重网站的爬虫协议,避免爬取禁止爬取的内容。
  2. 设置合理的请求间隔
    避免对目标网站服务器造成过大压力,合理设置请求间隔。
  3. 处理反爬虫策略
    了解并应对网站的反爬虫策略,如IP封禁、验证码等。
  4. 使用代理IP、Cookies等技巧
    提高爬虫的稳定性和成功率。
  5. 分布式爬虫的搭建与优化
    使用Scrapy-Redis等框架,实现分布式爬虫,提高爬取效率。
    六、Python爬虫框架
  6. Scrapy:强大的Python爬虫框架,支持分布式爬取、多种数据格式、强大的插件系统等。
  7. Scrapy-Redis:基于Scrapy和Redis的分布式爬虫框架,实现分布式爬取和去重功能。

结语:

通过本文的讲解,相信读者已经对Python爬虫有了较为全面的认识。爬虫技能在数据分析、自然语言处理等领域具有广泛的应用,希望读者能够动手实践,不断提高自己的技能水平。同时,请注意合法合规地进行爬虫,遵守相关法律法规。祝您学习愉快!
在这里插入图片描述

相关文章:

Python爬虫详解:原理、常用库与实战案例

前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言引言:一、爬虫原理1. HTTP请求与响应过程2. 常用爬虫技术 二、P…...

搭建跨境电商电商独立站如何接入1688平台API接口|通过1688API接口采集商品通过链接搜索商品下单

接口设计|接口接入 对于mall项目中商品模块的接口设计,大家可以参考项目的Swagger接口文档,以Pms开头的接口就是商品模块对应的接口。 参数说明 通用参数说明 参数不要乱传,否则不管成功失败都会扣费url说明……d.cn/平台/API类型/ 平台&…...

【GlobalMapper精品教程】073:像素到点(Pixels-to-Points)从无人机图像轻松生成点云

文章目录 一、工具介绍二、生成点云三、生成正射四、生成3D模型五、注意事项一、工具介绍 Global Mapper v19引入的新的像素到点工具使用摄影测量原理,从重叠图像生成高密度点云、正射影像及三维模型。它使LiDAR模块成为已经功能很强大的的必备Global Mapper扩展功能。 打开…...

论文复现1:Mobilealoha

abstract:从人类演示中进行的模仿学习在机器人技术中表现出了令人印象深刻的表现。然而,大多数结果都集中在桌面操作上,缺乏一般有用任务所需的移动性和灵活性。在这项工作中,我们开发了一种用于模仿双手且需要全身控制的移动操纵任务的系统。我们首先推出 Mobile ALOHA,这…...

pycharm复习

目录 1.基础语法 2.判断语句 3.while循环 4.函数 5.数据容器 1.基础语法 1.字面量 2.注释: 单行注释# 多行注释" " " " " " 3.变量: 变量名 变量值 print:输出多个结果&#x…...

【SQLSERVER】批量导出所有作业或链接脚本

1.在Microsoft SQL Server Management Studio中选择–>视图(v)–>对象资源管理器详细信息(F7) 2.SSMS图形界面,左侧是“对象资源管理器”,右侧是“对象资源管理器详细信息”界面 3.左侧的“对象资源管理器”界面–>点击“SQLSserver代理”–…...

函数参数缺省和内联函数【C++】

文章目录 函数参数缺省函数参数缺省的条件和要求 内联函数内联函数的工作原理内联函数的定义方法内联函数的要求解决方法:直接在.h中定义内联函数的函数体 内联函数再Debug模式下默认是不展开的 函数参数缺省 顾名思义:可以少传一个/多个参数给函数&…...

javaWeb城市公交查询系统的设计与实现

一、选题背景 随着低碳生活的普及,人们更倾向于低碳环保的出行方式,完善公交系统无疑具有重要意义。公交是居民日常生活中最常使用的交通工具之一,伴随着我国经济繁荣和城市人口增长,出行工具的选择也变得越来越重要。政府在公共…...

企业案例:金蝶云星空对接旺店通·企业版

某知名化妆品企业,主要专注于化妆品,护肤品等研发,销售,生产于一体化的企业。企业的业务模式涉及比较广,有2B,2C和国内外电商领域。由于对内部业务流程的连贯性和数据的准确性比较关注。财务系统用的金蝶云星空&#x…...

wpsword求和操作教程

wpsword求和怎么操作: 1、首先,单纯的数据是无法求和的,所以我们必须要“插入”一个“表格” 2、接着将需要求和的数据填入到表格中。 3、填完后,进入“布局”选项卡。 4、然后打开其中的“公式” 5、在其中选择求和公式“SUM”并…...

Android 手机部署whisper 模型

Whisper 是什么? “Whisper” 是一个由OpenAI开发的开源深度学习模型,专门用于语音识别任务。这个模型能够将语音转换成文本,支持多种语言,并且在处理不同的口音、环境噪音以及跨语言的语音识别方面表现出色。Whisper模型的目标是提供一个高效、准确的工具,以支持自动字幕…...

通信术语:初学者入门指南(二)

1.SAR:Synthetic Aperture Radar合成孔径雷达,是一种雷达系统,通常用于地球或行星的遥感成像。相较于传统的实孔径雷达,SAR 通过在相对较长的时间内,对来自同一地点的多个雷达反射信号进行综合处理,实现了更…...

Java中使用MQTT客户端库实现TLS/SSL加密通信的示例

以下是一个完整的Java代码示例,展示了如何使用Eclipse Paho MQTT客户端库在Java中实现TLS/SSL加密的MQTT通信。在这个示例中,我们将创建一个简单的MQTT客户端,该客户端连接到支持TLS/SSL的MQTT代理,并发布和订阅消息。 首先&…...

【m122】webrtc的比较

uint16的比较IsNewerSequenceNumber 和 u32的比较LatestTimestamp G:\CDN\WEBRTC-DEV\libwebrtc_build\src\modules\include\module_common_types_public.h/** Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.** Use of this source code is governed …...

axios发送get请求但参数中有数组导致请求路径多出了“[]“的处理办法

一、情况 使用axios发送get请求携带了数组参数时,请求路径中就会多出[]字符,而在后端也会报错 二、解决办法 1、安装qs 当前项目的命令行中安装 npm install qs2、引入qs库(使用qs库来将参数对象转换为字符串) // 全局 import qs from qs Vue.proto…...

vue3的mars3d点击右键出现置顶、向下、向上等选项

效果图 下载插件 imengyu/vue3-context-menu npm i imengyu/vue3-context-menu在要使用的页面中引入一下代码 import "imengyu/vue3-context-menu/lib/vue3-context-menu.css"; import ContextMenu from "imengyu/vue3-context-menu";如果是使用在树的…...

MySQL进阶-----SQL提示与覆盖索引

目录 前言 一、SQL提示 1.数据准备 2. SQL的自我选择 3.SQL提示 二、覆盖索引 前言 MySQL进阶篇的索引部分基本上要结束了,这里就剩下SQL提示、覆盖索引、前缀索引以及单例联合索引的内容。那本期的话我们就先讲解SQL提示和覆盖索引先,剩下的内容就…...

机器学习模型之K近邻

K近邻(K-Nearest Neighbors,KNN)是一种基本的机器学习算法,它既可以用于分类问题,也可以用于回归问题。KNN算法的核心思想非常简单:一个新样本的分类或回归值取决于它与训练集中最相似的K个样本的多数类别或…...

强化基础-Java-泛型基础

什么是泛型? 泛型其实就参数化类型,也就是说这个类型类似一个变量是可变的。 为什么会有泛型? 在没有泛型之前,java中是通过Object来实现泛型的功能。但是这样做有下面两个缺陷: 1 获取值的时候必须进行强转 2 没有…...

c++20协程详解(一)

前言 本文是c协程第一篇,主要是让大家对协程的定义,以及协程的执行流有一个初步的认识,后面还会出两篇对协程的高阶封装。 在开始正式开始协程之前,请务必记住,c协程 不是挂起当前协程,转而执行其他协程&a…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...

c# 局部函数 定义、功能与示例

C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...