【Python爬虫实战】使用BeautifulSoup和Scrapy抓取网页数据!

【Python爬虫实战】使用BeautifulSoup和Scrapy抓取网页数据!

在当今信息爆炸的时代,数据无处不在,如何有效地抓取、处理和分析这些数据成为了许多开发者和数据科学家的必修课。本篇博客将深入探讨如何使用Python中的两个强大工具:BeautifulSoup和Scrapy来抓取网页数据。我们将从基础知识开始,逐步深入到实际应用,最终实现一个完整的爬虫项目。

1. 什么是爬虫?

网络爬虫(Web Crawler)是一种自动访问互联网并提取信息的程序。它可以帮助我们从网站上获取大量数据,进行分析和处理。爬虫的应用非常广泛,比如搜索引擎、数据分析、市场调研等。

2. 准备工作

在开始之前,我们需要确保已经安装了Python及其相关库。可以使用pip进行安装:

pip install requests beautifulsoup4 scrapy
  • requests:用于发送网络请求。
  • beautifulsoup4:用于解析HTML和XML文档。
  • scrapy:一个强大的网络爬虫框架。

3. 使用BeautifulSoup抓取网页数据

3.1. BeautifulSoup简介

BeautifulSoup是一个用于解析HTML和XML的Python库。它可以将复杂的网页结构转化为一个易于操作的树形结构,使得我们能够轻松提取网页中的信息。

3.2. 示例:抓取豆瓣电影排行榜

在这个示例中,我们将抓取豆瓣电影排行榜的前10部电影及其评分。

3.2.1. 发送请求

首先,我们需要发送一个HTTP请求来获取网页的HTML内容。

import requests
from bs4 import BeautifulSoupurl = 'https://movie.douban.com/chart'
response = requests.get(url)
html_content = response.text
3.2.2. 解析HTML

接下来,我们使用BeautifulSoup来解析HTML内容。

soup = BeautifulSoup(html_content, 'html.parser')
3.2.3. 提取数据

我们将查找电影标题和评分,并将结果存储在一个列表中。

movies = []for item in soup.select('.item'):title = item.select_one('.title').textrating = item.select_one('.rating_num').textmovies.append({'title': title, 'rating': rating})print(movies)

3.3. 完整代码

将上述代码整合成一个完整的爬虫程序:

import requests
from bs4 import BeautifulSoupdef get_movies():url = 'https://movie.douban.com/chart'response = requests.get(url)soup = BeautifulSoup(response.text, 'html.parser')movies = []for item in soup.select('.item'):title = item.select_one('.title').textrating = item.select_one('.rating_num').textmovies.append({'title': title, 'rating': rating})return moviesif __name__ == '__main__':movie_list = get_movies()for movie in movie_list:print(movie)

4. 使用Scrapy抓取网页数据

4.1. Scrapy简介

Scrapy是一个功能强大的爬虫框架,适合进行大规模数据抓取和处理。它提供了许多高级特性,如异步处理、请求调度和数据管道等。

4.2. 创建Scrapy项目

我们可以使用Scrapy命令行工具创建一个新的爬虫项目:

scrapy startproject douban_movies

这将创建一个名为douban_movies的文件夹,里面包含项目的基本结构。

4.3. 编写爬虫

在项目中,我们需要创建一个新的爬虫文件,比如douban.py,并实现爬虫的逻辑。

4.3.1. 编写爬虫代码

spiders目录下创建douban.py文件,内容如下:

import scrapyclass DoubanSpider(scrapy.Spider):name = 'douban'start_urls = ['https://movie.douban.com/chart']def parse(self, response):for item in response.css('.item'):yield {'title': item.css('.title::text').get(),'rating': item.css('.rating_num::text').get(),}

4.4. 运行爬虫

我们可以通过以下命令运行爬虫,并将结果保存到JSON文件中:

scrapy crawl douban -o movies.json

5. 数据存储

在爬虫抓取数据后,我们通常需要将数据存储到数据库或文件中。Scrapy提供了数据管道(Item Pipeline)来处理数据存储。我们可以在settings.py中配置管道,使用SQLite或MongoDB等数据库进行存储。

6. 处理反爬虫机制

许多网站都有反爬虫机制,比如IP封禁、用户代理检查等。我们可以通过以下方式来绕过这些限制:

6.1. 设置用户代理

在Scrapy的设置中,我们可以自定义用户代理:

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'

6.2. 设置代理IP

使用代理IP可以有效防止IP封禁,Scrapy也支持在请求中设置代理。

7. 实践:爬取多个页面

在实际应用中,我们往往需要爬取多个页面的数据。我们可以在Scrapy中使用start_requests方法来实现这一点。

7.1. 修改爬虫代码

修改DoubanSpider中的start_requests方法,实现分页抓取:

def start_requests(self):for page in range(0, 10):  # 抓取前10页yield scrapy.Request(url=f'https://movie.douban.com/chart?start={page * 10}', callback=self.parse)

8. 数据清洗和分析

抓取到的数据往往需要进行清洗和分析。我们可以使用Pandas库来处理数据,进行数据清洗、统计分析和可视化等操作。

8.1. 安装Pandas

使用以下命令安装Pandas库:

pip install pandas

8.2. 数据清洗示例

以下是一个简单的数据清洗示例:

import pandas as pd# 读取抓取的数据
data = pd.read_json('movies.json')# 数据清洗
data['rating'] = data['rating'].astype(float)  # 将评分转为浮点数
cleaned_data = data.dropna()  # 删除缺失值# 打印清洗后的数据
print(cleaned_data)

9. 总结

通过本文的学习,我们了解了如何使用BeautifulSoup和Scrapy两个强大的工具来抓取网页数据。BeautifulSoup适合快速、小规模的数据抓取,而Scrapy则更适合大规模、复杂的网站抓取。掌握这两种工具可以帮助我们更高效地进行数据获取与分析。

在实际开发中,我们还需注意网站的Robots协议,确保我们的爬虫行为不违反网站的使用条款。此外,反爬虫机制的处理也是爬虫开发中需要重点关注的内容。

希望通过这篇博客,能够帮助大家快速入门Python爬虫开发,并在实践中不断提升自己的技能!

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

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

相关文章

2005至2023年中国各地区数据要素化水平-最新出炉 附下载链接

中国各地区数据要素化水平(2005-2023年)概览 下载链接-点它👉👉👉:2005至2023年中国各地区数据要素化水平-最新出炉.zip 一、数据背景与意义 在数字经济和数字技术持续发展的浪潮中,数据已逐…

php命令执行的一些执行函数----以ctfshow靶场为解题思路

解法10、利用文件包含 ①?cinclude$_GET[1]?>&1data://text/plain,<?php system(tac flag.php);?> cdata://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg ②?cinclude$_GET[1]?>&1php://filter/readconvert.base64-encode/resourc…

在Java中,需要每120分钟刷新一次的`assetoken`,并且你想使用Redis作为缓存来存储和管理这个令牌

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

k8s部署使用有状态服务statefulset部署eureka集群,需登录认证

一、构建eureka集群镜像 1、编写dockerfile文件&#xff0c;此处基础镜像为arm版本&#xff0c;eureka目录中文件内容&#xff1a;application-dev.yml、Dockerfile、eureka-server-1.0-SNAPSHOT.jar(添加登录认证模块&#xff0c;文章最后附上下载连接) FROM mdsol/java8-j…

Vue入门示例

今天滴学习目标&#xff01;&#xff01;&#xff01; 示例简介HTML内容主体区域输入框列表区域统计和清空 JS引入Vue.js库定义Vue实例el选项data选项methods选项 示例简介 HTML内容 本次实例讲解的是v-for、v-on、v-model来写这小小的实例&#xff0c;下面是实例的效果图&am…

OQE-OPTICAL AND QUANTUM ELECTRONICS

文章目录 一、征稿简介二、重要信息三、服务简述四、投稿须知五、联系咨询 一、征稿简介 二、重要信息 期刊官网&#xff1a;https://ais.cn/u/3eEJNv 三、服务简述 四、投稿须知 1.在线投稿&#xff1a;由艾思科蓝支持在线投稿&#xff0c;请将文章全文投稿至艾思科蓝投稿系…

国家能源集团携手海康威视研发攻克融合光谱煤质快检技术

10月24日&#xff0c;在国家能源集团准能集团黑岱沟露天煤矿&#xff0c;安装于准能选煤厂785商品煤胶带机中部的煤质快检核心设备&#xff0c;正在对当天装车外运的商品煤煤质进行实时检测。仅两分钟后&#xff0c;涵盖发热量、水分、灰分、硫分等多项指标的数据信息已传输到到…

在xml 中 不等式 做转义处理的问题

对于这种要做转义处理&#xff0c;<![CDATA[ < ]]>

LeetCode_509. 斐波那契数_java

1、题目 509. 斐波那契数https://leetcode.cn/problems/fibonacci-number/ 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#…

Discuz 论坛开发一套传奇发布站与传奇开服表

Discuz 论坛开发一套传奇发布站与传奇开服表 随着互联网技术的飞速发展&#xff0c;网络游戏已成为人们休闲娱乐的重要方式之一。在众多网络游戏中&#xff0c;传奇系列以其独特的魅力吸引了大量忠实玩家。为了满足这些玩家的需求&#xff0c;并促进游戏信息的交流与分享&…

密码学原理

1.1 加密算法 Tags: 1、加密算法分类 2、对称算法 <原理、特征、算法> 3、非对称算法 <原理、特征、算法> 4、对称算法vs非对称算法 <结合体> 1、加密算法概述&#xff1a; 用于对用户数据进行加密&#xff0c;常用算法有DES、3DES、AES、RSA、DH算法。根据密…

合约门合同全生命周期管理系统:企业合同管理的数字化转型之道

合约门合同全生命周期管理系统&#xff1a;企业合同管理的数字化转型之道 1. 引言 在现代企业中&#xff0c;合同管理已经不再是简单的文件存储和审批流程&#xff0c;而是企业合规性、风险管理和业务流程的关键环节之一。随着企业规模的扩大和合同数量的增加&#xff0c;传统…

Linux下MySQL8.x的编译安装与使用

Linux下MySQL的安装与配置 1. 安装环境初始化 1.1 查看是否安装过MySQL 如果使用rpm安装, 检查一下RPM PACKAGE rpm -qa | grep -i mysql # -i 忽略大小写 # 或者 yum list installed | grep mysql如果存在mysql-libs的旧版本包&#xff0c;显示如下 #存在 [rootlocalhost ~]…

NavMesh只制作可移动的导航网,清除多余不可走区域

只制作可移动的导航网。它使存储文件大小减小并提高性能。它消除了迁移到随机区域的问题。添加链接描述 1.如何使用 2.创建一个包含“NavMeshCleaner”组件的对象。Andadd指向可定制区域。 按住控制键并单击添加点。如果要移动它&#xff0c;请按 输入上的control键并单击。您…

信息安全工程师(55)网络安全漏洞概述

一、定义 网络安全漏洞&#xff0c;又称为脆弱性&#xff0c;是网络安全信息系统中与安全策略相冲突的缺陷&#xff0c;这种缺陷也称为安全隐患。漏洞可能导致机密性受损、完整性破坏、可用性降低、抗抵赖性缺失、可控性下降、真实性不保等问题。 二、分类 网络安全漏洞可以根据…

桥接模式,外界与主机通,与虚拟机不通

一 二 在此选择Windows与外界连接的网卡&#xff0c;通过有线连就选有线网卡&#xff0c;通过无线连就选无线网卡。 三 如果需要设置固定IP&#xff0c;则选择"Manual"进行设置。我这边根据实际需要&#xff0c;走无线的时候用DHCP&#xff0c;走有线的时候设固定IP…

C#中的委托、匿名方法、Lambda、Action和Func

委托 委托概述 委托是存有对某个方法的引用的一种引用类型变量。定义方法的类型&#xff0c;可以把一个方法当作另一方法的参数。所有的委托&#xff08;Delegate&#xff09;都派生自 System.Delegate 类。委托声明决定了可由该委托引用的方法。 # 声明委托类型 委托类型声…

Golang | Leetcode Golang题解之第507题完美数

题目&#xff1a; 题解&#xff1a; func checkPerfectNumber(num int) bool {if num 1 {return false}sum : 1for d : 2; d*d < num; d {if num%d 0 {sum dif d*d < num {sum num / d}}}return sum num }

一文掌握Kubernates核心组件,构建智能容器管理集群

1.Kubernates简要概述 Kubernates&#xff08;常称为K8s&#xff0c;因省略了“ubernate”中的8个字符&#xff09;是Google开源的容器编排平台&#xff0c;专为简化和自动化应用服务的部署、扩展和管理而设计。它将应用与底层的服务器抽象开来&#xff0c;提供了自动化的机制…

怎么提取pdf的某一页?批量提取pdf的某一页的简单方法

怎么提取pdf的某一页&#xff1f;在日常工作与学习中&#xff0c;我们经常会遇到各式各样的PDF文件&#xff0c;它们以其良好的兼容性和稳定性&#xff0c;成为了信息传输和存储的首选格式。然而&#xff0c;在浩瀚的文档海洋中&#xff0c;有时某个PDF文件中的某一页内容尤为重…