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

Python 如何进行Web抓取(BeautifulSoup, Scrapy)

Web抓取(Web Scraping)是一种从网站提取数据的技术。Python有许多用于Web抓取的库,其中最常用的是BeautifulSoup和Scrapy。

BeautifulSoup

BeautifulSoup是一个用于解析HTML和XML文档的Python库,适合处理简单的Web抓取任务。它将复杂的HTML文档转换成一个可遍历的解析树,可以方便地找到需要的元素。

安装BeautifulSoup

要使用BeautifulSoup,首先需要安装它以及请求库requests:

pip install beautifulsoup4
pip install requests
导入BeautifulSoup
from bs4 import BeautifulSoup
import requests
获取网页内容

首先需要获取网页的HTML内容,可以使用requests库:

url = 'http://example.com'
response = requests.get(url)
html_content = response.content
解析HTML

使用BeautifulSoup解析HTML内容:

soup = BeautifulSoup(html_content, 'html.parser')
查找元素

BeautifulSoup提供了多种查找元素的方法,如findfind_allselect等。

# 查找第一个<p>标签
p_tag = soup.find('p')
print(p_tag.text)# 查找所有<a>标签
a_tags = soup.find_all('a')
for tag in a_tags:print(tag.get('href'))# 使用CSS选择器
header = soup.select_one('h1')
print(header.text)
处理属性

可以方便地获取标签的属性:

img_tag = soup.find('img')
print(img_tag['src'])
示例:抓取一个博客的标题和链接

以下是一个简单的示例,展示如何抓取一个博客页面的所有文章标题和链接:

url = 'http://example-blog.com'
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')articles = soup.find_all('article')
for article in articles:title = article.find('h2').textlink = article.find('a')['href']print(f'Title: {title}, Link: {link}')

Scrapy

Scrapy是一个功能强大的Web抓取和Web爬虫框架,适用于复杂的抓取任务。它具有高性能、可扩展性强、支持异步处理等特点。

安装Scrapy

使用pip安装Scrapy:

pip install scrapy
创建Scrapy项目

首先需要创建一个Scrapy项目:

scrapy startproject myproject
cd myproject
创建爬虫

在Scrapy项目中,可以创建一个新的爬虫:

scrapy genspider myspider example.com

这将在spiders目录下生成一个名为myspider.py的文件。

编写爬虫

打开myspider.py,可以看到一个基本的爬虫模板。我们将修改这个模板来实现抓取任务。

import scrapyclass MySpider(scrapy.Spider):name = 'myspider'start_urls = ['http://example.com']def parse(self, response):# 解析响应for article in response.css('article'):title = article.css('h2::text').get()link = article.css('a::attr(href)').get()yield {'title': title,'link': link}
运行爬虫

在命令行中运行爬虫:

scrapy crawl myspider -o output.json

这将抓取example.com并将结果保存到output.json文件中。

Scrapy中的重要概念
  1. Item:定义抓取的数据结构。
  2. Spider:定义如何抓取网站的爬虫。
  3. Pipeline:定义数据处理和存储的流程。
  4. Middleware:处理请求和响应的中间件。
定义Item

可以在items.py中定义Item:

import scrapyclass MyprojectItem(scrapy.Item):title = scrapy.Field()link = scrapy.Field()

然后在爬虫中使用Item:

from myproject.items import MyprojectItemclass MySpider(scrapy.Spider):name = 'myspider'start_urls = ['http://example.com']def parse(self, response):for article in response.css('article'):item = MyprojectItem()item['title'] = article.css('h2::text').get()item['link'] = article.css('a::attr(href)').get()yield item
使用Pipeline处理数据

pipelines.py中定义Pipeline:

class MyprojectPipeline:def process_item(self, item, spider):# 处理itemreturn item

settings.py中启用Pipeline:

ITEM_PIPELINES = {'myproject.pipelines.MyprojectPipeline': 300,
}
示例:抓取一个电商网站的商品信息

以下是一个完整的示例,展示如何使用Scrapy抓取一个电商网站的商品信息。

首先定义Item:

# items.py
import scrapyclass ProductItem(scrapy.Item):name = scrapy.Field()price = scrapy.Field()availability = scrapy.Field()

然后编写爬虫:

# spiders/products_spider.py
import scrapy
from myproject.items import ProductItemclass ProductsSpider(scrapy.Spider):name = 'products'start_urls = ['http://example-ecommerce.com/products']def parse(self, response):for product in response.css('div.product'):item = ProductItem()item['name'] = product.css('h3.product-name::text').get()item['price'] = product.css('span.product-price::text').get()item['availability'] = product.css('span.availability::text').get()yield item# 处理分页next_page = response.css('a.next-page::attr(href)').get()if next_page:yield response.follow(next_page, self.parse)

最后启用Pipeline并运行爬虫:

# pipelines.py
class ProductPipeline:def process_item(self, item, spider):# 处理商品信息return item# settings.py
ITEM_PIPELINES = {'myproject.pipelines.ProductPipeline': 300,
}# 运行爬虫
scrapy crawl products -o products.json

BeautifulSoup和Scrapy各有优缺点,BeautifulSoup适合处理简单的抓取任务,使用方便,代码简洁;而Scrapy则更适合处理复杂的抓取任务,具有强大的功能和高效的性能。在实际项目中,可以根据具体需求选择合适的工具,甚至结合使用这两个库,以充分发挥各自的优势。

相关文章:

Python 如何进行Web抓取(BeautifulSoup, Scrapy)

Web抓取&#xff08;Web Scraping&#xff09;是一种从网站提取数据的技术。Python有许多用于Web抓取的库&#xff0c;其中最常用的是BeautifulSoup和Scrapy。 BeautifulSoup BeautifulSoup是一个用于解析HTML和XML文档的Python库&#xff0c;适合处理简单的Web抓取任务。它将…...

白骑士的PyCharm教学进阶篇 2.5 数据库连接与管理

系列目录 上一篇&#xff1a;白骑士的PyCharm教学进阶篇 2.4 Django开发支持 在Web开发中&#xff0c;数据库是必不可少的部分。PyCharm不仅是一款功能强大的IDE&#xff0c;还提供了丰富的数据库连接和管理工具&#xff0c;使开发者可以更方便地浏览和操作数据库。本篇将详细…...

(五)activiti-modeler 编辑器初步优化

最终效果&#xff1a; 1..首先去掉顶部的logo&#xff0c;没什么用&#xff0c;还占用空间。 修改modeler.html文件&#xff0c;添加样式&#xff1a; <style type"text/css"> #main-header{display: none; } #main{padding: 0px; } </style> 2.左边组…...

(学习总结12)C++类和对象3

C类和对象3 一、初始化列表二、类型转换三、static成员四、友元五、内部类六、匿名对象 以下代码环境在 VS2022。 一、初始化列表 之前我们实现构造函数时&#xff0c;初始化成员变量主要使用函数体内赋值&#xff0c;构造函数初始化还有⼀种方式&#xff0c;就是初始化列表&a…...

docxtpl,一个强大的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个强大的 Python 库 - docxtpl。 项目地址&#xff1a;https://docxtpl.readthedocs.io/en/latest/ 在日常工作中&#xff0c;自动生成和处理 Word 文档是一个常见需求。doc…...

捷途山海T2:超长续航,节能环保的驾驶新星

在当今的汽车市场中&#xff0c;消费者的购车选择日趋多样化&#xff0c;不再仅限于传统的燃油车。随着环保理念的深入人心以及人们对用车成本的日益关注&#xff0c;像捷途山海T2这样配备高效混动系统的车型逐渐受到大众的青睐。 捷途山海T2&#xff0c;以其杰出的节能性、强劲…...

[Day 45] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈的可擴展性挑戰 概述 區塊鏈技術在過去幾年中取得了顯著的進展&#xff0c;其去中心化、透明和安全的特性使其在金融、供應鏈管理、醫療等領域得到了廣泛應用。然而&#xff0c;區塊鏈技術的一個重大挑戰是其可擴展性。可擴展性是指系統能夠有效處理日益增長的數據和用…...

白骑士的PyCharm教学实战项目篇 4.3 自动化测试与持续集成

系列目录 上一篇&#xff1a; 在现代软件开发过程中&#xff0c;自动化测试与持续集成&#xff08;CI&#xff09;是确保代码质量和快速交付的关键环节。PyCharm作为一款强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;为自动化测试和持续集成提供了全面的支持。本…...

权限模块开发+权限与角色关联(完整CRUD)

文章目录 &#x1f31e; Sun Frame&#xff1a;SpringBoot 的轻量级开发框架&#xff08;个人开源项目推荐&#xff09;&#x1f31f; 亮点功能&#x1f4e6; spring cloud模块概览常用工具 &#x1f517; 更多信息1.easycode生成代码1.配置2.AuthPermissionDao.java剪切到mapp…...

llama神经网络的结构,llama-3-8b.layers=32 llama-3-70b.layers=80; 2000汉字举例说明

目录 llama-3-8b.layers=32 llama-3-70b.layers=80 llama神经网络的结构 Llama神经网络结构示例 示例中的输入输出大小 实际举例说明2000个汉字文本数据集 初始化词嵌入矩阵 1. 输入层 2. 嵌入层 3. 卷积层 4. 全连接层 llama-3-8b.layers=32 llama-3-70b.laye…...

单细胞数据怎么表现genes mRNA表达的热图?

愿武艺晴小朋友一定得每天都开心 #热图 library("ComplexHeatmap") exp <- AverageExpression(subset(fasting_memory, Celltype %in% c("Pre-B")), layer = "data", #即CPM值 features …...

Java聚合快递对接云洋系统小程序源码

&#x1f680;【物流新纪元】聚合快递如何无缝对接云洋系统&#xff0c;效率飙升秘籍大公开&#xff01;✨ &#x1f50d; 开篇揭秘&#xff1a;聚合快递的魅力所在 Hey小伙伴们&#xff0c;你是否还在为多家快递公司账号管理繁琐、订单处理效率低下而头疼&#xff1f;&#…...

MySQL——数据表的基本操作(三)修改数据表

有时候&#xff0c;希望对表中的某些信息进行修改&#xff0c;这时就需要修改数据表。所谓修改数据表指的是修改数据库中已经存在的数据表结构&#xff0c;比如&#xff0c;修改表名、修改字段名、修改字段的数据类型等。在 MySQL中&#xff0c;修改数据表的操作都是使用 ALTER…...

医学图像分割的基准:TransUnet(用于医学图像分割的Transformer编码器)器官分割

1、 TransUnet 介绍 TransUnet是一种用于医学图像分割的深度学习模型。它是基于Transformer模型的图像分割方法&#xff0c;由AI研究公司Hugging Face在2021年提出。 医学图像分割是一项重要的任务&#xff0c;旨在将医学图像中的不同结构和区域分离出来&#xff0c;以便医生可…...

java-swing编写学生成绩查询管理系统

本文是本人大二上实训项目-学生成绩查询管理系统&#xff0c;采用本项目使用Java、MySQL技术。界面框架由Java Swing搭建&#xff0c;用JDBC实现Java与MySQL的连接。 本项目适合初学java和mysql的同学&#xff0c;来做一些小项目来提升自己&#xff0c;因为兴趣所以想要做去尝…...

volatile浅解

volatile修饰的变量有两个特点 线程中修改了自己工作内存中的副本后&#xff0c;立即将其刷新到主内存工作内存中每次读取共享变量时&#xff0c;都会去主内存中重新读取&#xff0c;然后拷贝到工作内存 内存 -> CPU Cache -> CPU 如果没有volatile那么就会继续读取缓存…...

世媒讯带您了解什么是媒体邀约

什么是媒体邀约&#xff1f;其实媒体邀约是一种公关策略&#xff0c;旨在通过邀请媒体记者和编辑参加特定的活动、发布会或其他重要事件&#xff0c;以确保这些活动能够得到广泛的报道和关注。通过这种方式&#xff0c;企业和组织希望能够传达重要信息&#xff0c;提高品牌知名…...

[Kimi 笔记]“面向搜索引擎”

"面向搜索引擎"&#xff08;Search Engine-Oriented&#xff0c;SEO-Oriented 或 SEO-Friendly&#xff09;通常指的是在设计和开发网站时&#xff0c;采取一系列措施来优化网站内容和结构&#xff0c;以便提高网站在搜索引擎结果页面&#xff08;SERP&#xff09;中…...

如何在亚马逊云科技AWS上利用LoRA高效微调AI大模型减少预测偏差

简介&#xff1a; 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 在机器学习和人工智能领域&#xff0c;生成偏差…...

订单定时状态处理业务(SpringTask)

文章目录 概要整体架构流程技术细节小结 概要 订单定时状态处理通常涉及到对订单状态进行定期检查&#xff0c;并根据订单的状态自动执行某些操作&#xff0c;比如关闭未支付的订单、自动确认收货等. 需求分析以及接口设计 需求分析 用户下单后可能存在的情况&#xff1a; …...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

关于nvm与node.js

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

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...