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

news2024/9/20 22:31:33

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').text
    link = 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 scrapy

class 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 scrapy

class MyprojectItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()

然后在爬虫中使用Item:

from myproject.items import MyprojectItem

class 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):
        # 处理item
        return item

settings.py中启用Pipeline:

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

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

首先定义Item:

# items.py
import scrapy

class ProductItem(scrapy.Item):
    name = scrapy.Field()
    price = scrapy.Field()
    availability = scrapy.Field()

然后编写爬虫:

# spiders/products_spider.py
import scrapy
from myproject.items import ProductItem

class 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则更适合处理复杂的抓取任务,具有强大的功能和高效的性能。在实际项目中,可以根据具体需求选择合适的工具,甚至结合使用这两个库,以充分发挥各自的优势。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Occlusion in Augmented Reality

1.Occlusion in Augmented Reality 笔记来源&#xff1a; 1.Occlusion handling in Augmented Reality context 2.Occlusion in Augmented Reality 3.Real-Time Occlusion Handling in Augmented Reality Based on an Object Tracking Approach 4.Occlusion Matting: Realisti…

SQLTools插件下载与使用说明

SQLTools是一个专注于SQL优化与管理的plsql developer插件&#xff0c;目的是把一些常用的SQL收集在一起&#xff0c;方便快速解决问题&#xff0c;提高工作效率。 当在SQL或PACKAGE窗口,或者选中表时&#xff0c;会有两个右键菜单&#xff1a; SQLTools聚焦在SQL方面&#xf…

unity 程序做一个折叠菜单

第一次遇到这种需求&#xff0c;本来以为很难&#xff0c;没想到试了一下以后没啥难度&#xff0c;所以记录一下 首先新建一个scroll view&#xff0c;然后在content里面添加vertical layout group和content size fitter这两个组件。&#xff08;vertical layout group 的 spac…

前端常用的性能优化方案

目录 性能分析工具lighthouseWebpack Bundle分析 开发阶段按需引入路由懒加载 打包阶段打包配置减少包体积配置压缩分包 资源预加载/预请求 部署阶段开启http2静态资源缓存gzip压缩 性能优化主要在三个阶段进行&#xff1a;开发阶段、开发结束后的打包阶段、项目部署上线阶段 首…

动态规划例题

目录 A.小红组比赛 B.小红升装备 A.小红组比赛 思路 &#xff1a;经典的多重背包问题&#xff0c;这里将dp[ i ][ j ]定义为前 i 场比赛的难度 j 是否可能&#xff0c;所以dp只需用0 1 表示&#xff0c;然后遍历dp[ n ][ j ]即可。 代码&#xff1a; void solve() { cin&g…

TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE(Transformer 在图像中的应用)翻译

摘要 虽然Transformer架构已成为自然语言处理任务的实际标准&#xff0c;但其在计算机视觉领域的应用仍然有限。在计算机视觉中&#xff0c;注意力机制要么与卷积网络结合使用&#xff0c;要么用于替换卷积网络的某些组件&#xff0c;同时保持其整体结构不变。我们证明了这种对…

抖音网红老阳:temu选品师好做吗?

抖音网红老阳近期分享了关于成为TEMU选品师的话题&#xff0c;引发了不少人的关注和讨论。那么&#xff0c;成为TEMU选品师究竟是一种怎样的体验?这项工作适合大多数人吗? 首先&#xff0c;TEMU选品师的工作内容主要集中在拼多多跨境电商平台上&#xff0c;这是一种新兴的电商…

VS Code 扩展之——私有扩展管理(Private Extension Manager)

为什么需要私有扩展的管理器&#xff1f; 和 Eclipse IDE的插件开发类似&#xff0c;VS Code&#xff08;Visual Studio Code&#xff09;也可以很容易的对VS Code编辑器进行创建和扩展新功能&#xff0c;这些扩展可以涵盖代码片段、主题、语言支持、调试器等多个方面。 VS Co…

昂科烧录器支持TI德州仪器的32位微控制器TMS320F28032

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中TI德州仪器的32位微控制器TMS320F28032已经被昂科的通用烧录平台AP8000所支持。 C2000™ 32位微控制器针对处理、感应和驱动进行了优化&#xff0c;可提高实时控制应用&#x…

IDEA全局搜索Jar包中内容

IDEA全局搜索Jar包中内容 【一】下载源码【二】搜索内容【1】按文件名搜索【2】全局关键字搜索【3】方法引用 【一】下载源码 想要搜索Jar中关键字&#xff0c;必须先把jar包源码下载下来&#xff0c;否则搜不到。 Preferences --> Maven --> Importing&#xff0c;根据…

类与对象的介绍

目录 一、类与实例的关系 二、快速入门-面向对象的方式解决养猫问题 三、类和对象的区别和联系 四、对象在内存中的存在形式 五、属性/成员变量 1、基本介绍 2、注意事项和细节说明 六、类的定义和使用 1、如何定义类 2、如何创建对象 3、如何访问属性 七、对象的传…

深⼊理解指针(4)

1. 回调函数是什么&#xff1f; 2. qsort使⽤举例 3. qsort函数的模拟实现 1. 回调函数是什么&#xff1f; 1. 回调函数是什么&#xff1f; 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另⼀个函数&#xff…

【Python】Numpy概述安装及使用

文章目录 Numpy概述Numpy开发环境搭建Numpy使用创建数组创建一维数组创建二维数组创建三维数组&#xff0c;array()函数ndmin参数的使用array()函数dtype参数的使用随机数创建 Numpy概述 Numpy是科学计算基础库&#xff0c;提供大量科学计算相关功能&#xff0c;比如数据统计&…

SpringMabatis学习笔记1

今日内容:搭建mybatis ORM 配置数据源 $#的区别 增删改 ORM &#xff08;Object Relational Mapping&#xff0c;对象关系映射&#xff09;是一种数据持久化技术&#xff0c;它在对象模型和关系型数据库之间建立起对应关系&#xff0c;并且提供了一种机制&#xff0…

2024软考注意!!《系统规划与管理师》大概率要改版,新教材已出

系统规划与管理师考试是全国计算机技术与软件专业技术资格考试的高级水平考试之一&#xff0c;一年仅考一次&#xff0c;也是2024年下半年的4门高级考试中&#xff0c;最适合零基础考生的高级科目。近日在国家版本数据中心&#xff0c;查到系统规划与管理师已经有2024最新版的教…

Windows常用的运行命令

cmd - 命令提示符 cmdcalc - 打开计算器 calcservices.msc - 本地服务设置 services.msccontrol - 打开控制面板 controlwinver - 查看windows版本 winvermstsc - 连接远程电脑 mstsc ms t(terminial终端) s(service服务)c(client客户端) mstscmspaint - 打开画图 m…

特斯拉智驾方案演变过程

目录 一、概述二、特斯拉算法的发展历程2.1 特斯拉第一代算法:HydraNets2.2 特斯拉第二代算法:BEV + Transformer2.3. 特斯拉第三代算法:占据网络2.4. 特斯拉第四代算法:端到端方案三、智驾技术特点3.1 算法3.2 算力3.3 数据四、端到端挑战一、概述 在当今科技飞速发展的时…

智能家居沙盘系统-智慧家居沙盘系统

智能家居和物联网技术是当前科技领域的热门话题&#xff0c;随着各类智能家居产品的不断推出&#xff0c;智能家居市场也逐渐呈现出蓬勃发展的态势。智能家居快速发展&#xff0c;而物联网相关人才供应远远不足。高校开展智能家居工程及设计人才教育培养具有重大意义。 基本介绍…

一键登录,打造华为账号便捷新体验

作为鸿蒙世界的通行证&#xff0c;一个华为账号可以登录所有的HarmonyOS设备&#xff0c;为HarmonyOS设备无缝衔接和协同使用提供诸多便利。HarmonyOS SDK华为账号服务&#xff08;Account Kit&#xff09;提供简单、快速、安全的登录功能&#xff0c;让用户快捷地使用华为账号…

04:【stm32】LED编程和按键控制

LED编程和按键控制 1、LED编程1.1、点亮一课LED灯 2、按键控制2.1、通过一个按钮控制LED灯的亮灭 1、LED编程 1.1、点亮一课LED灯 首先&#xff0c;我们想象一下&#xff0c;让LED灯点亮&#xff0c;引脚应该是输出模式&#xff0c;那么应该是通用模式&#xff0c;还是复用模式…