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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《自动机理论、语言和计算导论》阅读笔记:p115-p138

《自动机理论、语言和计算导论》学习第 6 天,p115-p138 总结,总计 24 页。 一、技术总结 1.associativity and comutativity (1)commutativity(交换性): Commutativity is the property of an operator that says we can switch the order of its ope…

二分答案跳石头游戏

步骤: 输入: 用户输入了三个整数,分别表示石头的总长度l,石头的数量n,以及最多可以撤去的石头数量m。 初始化石头位置数组: 创建一个长度为n2的数组arr,用于存储每块石头的位置。数组的第一项…

【JavaWeb】Day29.SpringBootWeb请求响应——请求(二)

请求响应 4.数组集合参数 数组集合参数的使用场景:在HTML的表单中,有一个表单项是支持多选的(复选框),可以提交选择的多个值。 4.1 数组 数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即…

TCP 三次握手

在TCP协议中,初始化ISN是TCP连接建立过程中客户端用来初始化序列号的一个值。这个值在TCP三次握手的第一步中被客户端放入了SYN数据包的序列号字段中。 **第一步:**客户端会发送一个数据包。包内的Flags的 Syn字段被置位从而表明它是一个Syn数据包。 此…

PCB设计中的EMC技术

除了元器件的选择和电路设计之外,良好的印制电路板(PCB)设计在电磁兼容性中也是一个非常重要的因素。PCB EMC设计的关键,是尽可能减小回流面积,让回流路径按照设计的方向流动。最常见返回电流问题来自于参考平面的裂缝…

计算机笔记(3)续20个

41.WWW浏览器和Web服务器都遵循http协议 42.NTSC制式30帧/s 44.三种制式电视:NTSC,PAL,SECAM 45.IP,子网掩码白话文简述: A类地址:取值范围0-127(四段数字(127.0.0.0&#xff09…

vivado 串行矢量格式 (SVF) 文件编程

串行矢量格式 (SVF) 文件编程 注释 : 串行矢量格式 (SVF) 编程在 Versal ™ 器件上不受支持。 对 FPGA 和配置存储器器件进行编程的另一种方法是通过使用串行矢量格式 (SVF) 文件来执行编程。通过 Vivado Design Suite 和 Vivado Lab Edition 生成的 SVF …

商家转账到零钱开通不了解决方案

商家转账到零钱是什么? 【商家转账到零钱】可以说是【企业付款到零钱】的升级版,商家转账到零钱可以为商户提供同时向多个用户微信零钱转账的能力,支持分销返佣、佣金报酬、企业报销、企业补贴、服务款项、采购货款等自动向用户转账的场景。…

dhcp中继代理

不同过路由器分配ip了,通过一台服务器来代替,路由器充当中继代理功能,如下图 服务器地址:172.10.1.1/24 配置流程: 1.使能dhcp功能 2.各个接口网关地址,配置dhcp中继功能 dhcp select relay &#xff0…

移动WEB开发之rem适配布局

一、rem 基础 rem 单位 rem (root em)是一个相对单位,类似于em,em是父元素字体大小。不同的是rem的基准是相对于html元素的字体大小。比如,根元素(html)设置font-size12px; 非根元素设置width:2rem; 则换成px表示就是2…

微服务连接不上rabbitmq解决

1.把端口port: 15672改成port:5672 2:virtual-host: my_vhost一定对应上

基于AI智能识别技术的智慧展览馆视频监管方案设计

一、建设背景 随着科技的不断进步和社会安全需求的日益增长,展览馆作为展示文化、艺术和科技成果的重要场所,其安全监控系统的智能化升级已成为当务之急。为此,旭帆科技(TSINGSEE青犀)基于视频智能分析技术推出了展览…

Linux网络协议栈从应用层到内核层④

文章目录 1、网卡接受数据2、网络设备层接收数据3、ip层接受数据4、tcp层接受数据5、上层应用读取数据6、数据从网卡到应用层的整体流程 1、网卡接受数据 当网卡收到数据时,会触发一个中断,然后就会调用对应的中断处理函数,再做进一步处理。…

力扣2684---矩阵中移动的最大次数(DFS,Java、中等题)

目录 题目描述: 思路描述: 代码: 纯递归: 带有记忆化搜索的递归: 题目描述: 给你一个下标从 0 开始、大小为 m x n 的矩阵 grid ,矩阵由若干 正 整数组成。 你可以从矩阵第一列中的 任一 单…

医疗器械网络安全 | 美国FDA审批程序和欧盟合格评定程序的区别

要进入美国与欧洲市场,均需要通过评定程序审批。 两者的审批流程核心区别在于:所有在美国上市流通的医疗器械产品必须经过FDA的审核认证,才能投放市场。而欧盟市场,医疗器械制造商只需要自证设备合规性,并有指定机构干…

x-cmd-pkg | broot 是基于 Rust 开发的一个终端文件管理器

简介 broot 是基于 Rust 开发的一个终端文件管理器,它设计用于帮助用户在终端中更轻松地管理文件和目录,使用树状视图探索文件层次结构、操作文件、启动操作以及定义您自己的快捷方式。 同时它还集成了 ls, tree, find, grep, du, fzf 等工具的常用功能…

CSS水波纹效果

效果图&#xff1a; 1.创建一个div <div class"point1" click"handlePoint(1)"></div> 2.设置样式 .point1{width: 1rem;height: 1rem;background: #2ce92f;position: absolute;border-radius: 50%;z-index: 999;cursor: pointer;} 3.设置伪…

网络安全基础之网络协议与安全威胁

OSI(OpenSystem Interconnect)&#xff0c;即开放式系统互联。 一般都叫OSI参考模型&#xff0c;是ISO(国际标准化组织)组织在1985年研究的网络互联模型。 网络协议的简介&#xff1a; 定义&#xff1a;协议是网络中计算机或设备之间进行通信的一系列规则集合。 什么是规则?…

【面试经典150 | 动态规划】不同路径 II

文章目录 写在前面Tag题目1方法一&#xff1a;动态规划方法二&#xff1a;空间优化 题目2方法一&#xff1a;动态规划空间优化 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主…

nut-ui中的menu 菜单组件的二次封装

这个菜单组件 一般可以直接用到项目里 如果复用性不强的话 直接使用 但是有一个问题 如果很多地方都需要用到这个组件 我们可以把这个组件二次封装一下 <template><div class"cinema-search-filter-component"><nut-menu><template #icon>&…