当前位置: 首页 > 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…...

go: go.mod file not found in current directory or any parent directory.如何解决?

这个错误表明你正在执行 go get 命令&#xff0c;但是当前目录或任何父目录中都找不到 go.mod 文件。这可能是因为你的项目还没有使用 Go Modules 进行管理。 要解决这个问题&#xff0c;有几种方法&#xff1a; go mod init <module-name> 其中 <module-name>…...

Go-Gin全局错误处理中间件

为了防止报错引起Gin服务挂掉以及错误日志记录&#xff0c;我们使用全局错误中间件进行管理。 package middlewareimport ("ToDoList/global""github.com/gin-gonic/gin""go.uber.org/zap""net""net/http""net/http/h…...

图神经网络实战(6)——使用PyTorch构建图神经网络

图神经网络实战&#xff08;6&#xff09;——使用PyTorch构建图神经网络 0. 前言1. 传统机器学习与人工智能2. 人工神经网络基础2.1 人工神经网络组成2.2 神经网络的训练 3. 图神经网络4. 使用香草神经网络执行节点分类4.1 数据集构建4.2 模型构建4.3 模型训练 5. 实现香草图神…...

【Flutter】windows环境配置

windows 11 环境 官方教程 配置了flutter 环境变量在系统的path里 bin 路径。 死活没反应 关闭了git关闭了dart.exe关闭了vs还是不行卸载重新来 新版git flutter doctor 还需要android 环境...

毕马威:《智慧之眼:开启汽车感知新时代》

在全球科技飞速发展和产业革新的大潮中&#xff0c;汽车产业正在以前所未有的速度向网联化、智能化的方向转型。汽车传感器作为智能联网汽车发展的关键环节之一&#xff0c;扮演着举足轻重的角色。 毕马威一直关注汽车产业的变化与发展&#xff0c;为了更好地为汽车行业赋能&a…...

每日三个JAVA经典面试题(三十四)

1.Mybatis的一级、二级缓存 MyBatis提供了两种缓存机制来提高查询效率&#xff1a;一级缓存和二级缓存。 一级缓存&#xff08;Session级别&#xff09; 作用范围&#xff1a;一级缓存是基于SqlSession的。这意味着&#xff0c;如果你在同一个SqlSession中执行两次相同的查询…...

C# 学习第五弹——语句

一、if语句 —简单if语句 —if else 语句 —if else if else 语句 1、简单if语句 if&#xff08;表达式&#xff09;{语句} &#xff08;1&#xff09;表达式必须使用圆括号括起来&#xff1b; &#xff08;2&#xff09;表达式&#xff1a;关系表达式或逻辑表达…...

什么是Java中的JVM(Java虚拟机)?它如何工作?

Java中的JVM&#xff0c;全称Java Virtual Machine&#xff08;Java虚拟机&#xff09;&#xff0c;是Java程序的运行环境&#xff0c;也是Java语言的核心和基础。它是一个虚拟的计算机&#xff0c;具有完善的硬体架构&#xff0c;如处理器、堆栈、寄存器等&#xff0c;以及相应…...

OmniGraffle Pro for mac 出色的图形设计软件

OmniGraffle Pro是一款非常出色的图形设计软件&#xff0c;它主要适用于Mac和iPad平台&#xff0c;可以用来轻松绘制各种精美的图表、示意图和界面设计。 软件下载&#xff1a;OmniGraffle Pro for mac中文注册激活版 以下是OmniGraffle Pro的一些主要特点和功能&#xff1a; 界…...

代码随想录阅读笔记-二叉树【合并二叉树】

题目 给定两个二叉树&#xff0c;想象当你将它们中的一个覆盖到另一个上时&#xff0c;两个二叉树的一些节点便会重叠。 你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠&#xff0c;那么将他们的值相加作为节点合并后的新值&#xff0c;否则不为 NULL 的节…...

文山微网站建设/江北seo页面优化公司

涉密&#xff0c;这里只写步骤&#xff0c;不写执行结果&#xff1a;0.控制文件备份 alter session set tracefile_identifierbak_control; alter database backup controlfile to trace; 1.确认控制文件名称 select name from v$controlfile; 2.添加新的控制文件路径 alter sy…...

焦作 做 网站/html网页制作模板代码

梯度下降是一个用来求函数最小值的算法&#xff0c;我们将使用梯度下降算法来求出代价函数?(?0, ?1) 的最小值。  梯度下降背后的思想是&#xff1a;开始时我们随机选择一个参数的组合(?0, ?1, . . . . . . , ??)&#xff0c;计算代价函数&#xff0c;然后我们寻找下一…...

酒泉手机网站建设/推广网站源码

用Java实现算法和数据结构本项目主要用于自己在工作之余记录用Java实现的算法和数据结构的源码&#xff1b;同时还会记录自己刷leetcode的题解思路等&#xff1b;经典排序算法排序算法总结排序名平均时间复杂度空间复杂度优势劣势适用场景稳定性冒泡排序O(n^2)O(1)稳定插入排序…...

国外 上海网站建设/网络营销策划方案模板范文

对于tomcat的日志管理&#xff0c;部署Tomcat后&#xff0c;运行久了&#xff0c;catalina.out文件会越来越大&#xff0c;对系统的稳定造成了一定的影响。1 可以修改conf/logging.properties日志配置文件来屏蔽掉这部分的日志信息。vim /data/ifengsite/java/tomcat/conf/logg…...

新疆工程建设云平台/seo 页面链接优化

socket socket 是通信的基石。支持 TCP/IP 等协议的基本操作单元。 应用层通过传输层进行数据通信时&#xff0c;TCP 会遇到同时为多个应用程序进程提供并发服务的问题。多个 TCP 连接或多个应用程序进程可能需要通过同一个 TCP 协议端口传输数据。为了区别不同的应用程序进程…...

自动建站网站源码/二十个优化

原标题&#xff1a; 废旧笔记本别再当废品卖掉了&#xff01;简单拆开件件都是宝物&#xff01;现在电脑硬件更新换代非常快&#xff0c;一般的电脑用个三五年之后配置就不行了&#xff0c;直接卖掉的话废旧电脑回收价格很低感觉不划算&#xff0c;闲置一旁又开不了机只能吃灰&…...